Mysql數據庫的高級用法
- 內連接(INNER JOIN)
一、等值連接
概述:指使用等號"="比較兩個表的連接列的值,相當於兩表執行笛卡爾後,取兩表連結列值相等的記錄。
語法:
SELECT 列
FROM 表1 INNER JOIN 表2
ON 表1.列 = 表2.列
二、非等值連接
概述:指使用大於號">“或小於號”<"比較兩個表的連接列的值,相當於兩表執行笛卡爾後,取一個表大於或小於另一個表的連結列值的記錄。
語法:
SELECT 列
FROM 表1 INNER JOIN 表2
ON 表1.列 <> 表2.列
-
左外連接(LEFT OUTER JOIN)
-
右外連接(RIGHT OUTER JOIN)
-
左外連接就是A和B的交集再並上A的所有數據
右外連接就是A和B的交集再並上B的所有數據
總之, 哪個表的數據重要, 就把哪個表放前邊使用左連接就好了(反正我是這樣用的 ^ _ ^ )
索引
使用索引的優缺點:
-
優點:
1、 所有的MySql列類型(字段類型)都可以被索引,也就是可以給任意字段設置索引
2、大大加快數據的查詢速度
-
缺點
1、 創建索引和維護索引要耗費時間,並且隨着數據量的增加所耗費的時間也會增加
2、索引也需要佔空間,我們知道數據表中的數據也會有最大上線設置的,如果我們有大量的索引,索引文件可能會比數據文件更快達到上線值
3、 當對錶中的數據進行增加、刪除、修改時,索引也需要動態的維護,降低了數據的維護速度
-
使用場景
並不是每個字段度設置索引就好,也不是索引越多越好,而是需要自己合理的使用。1、對經常更新的表要避免對其進行過多的索引,對經常用於查詢的字段應該創建索引
2、 數據量小的表最好不要使用索引,因爲由於數據較少,可能查詢全部數據花費的時間比遍歷索引的時間還要短,索引就可能不會產生優化效果
3、 在一同值少的列上(字段上)不要建立索引,比如在學生表的"性別"字段上只有男,女兩個不同值。相反的,在一個字段上不同值較多可是建立索引
索引的分類
注意:索引是在存儲引擎中實現的,也就是說不同的存儲引擎,會使用不同的索引
MyISAM和InnoDB存儲引擎:只支持BTREE索引, 也就是說默認使用BTREE,不能夠更換
MEMORY/HEAP存儲引擎:支持HASH和BTREE索引
1、索引我們分爲四類:單列索引(普通索引,唯一索引,主鍵索引)、組合索引、全文索引、空間索引、
(1)單列索引:一個索引只包含單個列,但一個表中可以有多個單列索引
普通索引:MySQL中基本索引類型,沒有什麼限制,允許在定義索引的列中插入重複值和空值,純粹爲了查詢數據更快一點。
唯一索引:索引列中的值必須是唯一的,但是允許爲空值
主鍵索引:是一種特殊的唯一索引,不允許有空值
(2)組合索引:
在表中的多個字段組合上創建的索引,只有在查詢條件中使用了這些字段的左邊字段時,索引纔會被使用,使用組合索引時遵循最左前綴集合
(3)全文索引:全文索引,只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT類型字段上使用全文索引
什麼是全文索引:就是在一堆文字中,通過其中的某個關鍵字等,就能找到該字段所屬的記錄行,比如有"你是個大煞筆,二貨 …" 通過大煞筆,可能就可以找到該條記錄。這裏說的是可能,因爲全文索引的使用涉及了很多細節
(4)空間索引:空間索引是對空間數據類型的字段建立的索引
MySQL中的空間數據類型有四種,GEOMETRY、POINT、LINESTRING、POLYGON。
在創建空間索引時,使用SPATIAL關鍵字。
要求:引擎爲MyISAM,創建空間索引的列,必須將其聲明爲NOT NULL
四、索引的操作(創建)
-
創建表的時候創建索引:
格式:CREATE TABLE 表名[字段名 數據類型] [UNIQUE|FULLTEXT|SPATIAL|…] [INDEX|KEY] [索引名字] (字段名[length]) [ASC|DESC] -
在已創建的表上添加索引
ALTER TABLE 表名 ADD[UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] [索引名] (索引字段名)[ASC|DESC]
1、爲表添加索引
ALTER TABLE book ADD INDEX BkNameIdx(bookname(30));
2、使用CREATE INDEX創建索引
CREATE INDEX BkBookNameIdx ON book(bookname);
-
索引操作(刪除)
格式一:ALTER TABLE 表名 DROP INDEX 索引名
格式二:DROP INDEX 索引名 ON 表名;
查看索引的詳細信息: explain select * from book where bookid=1\G;
對某列設置默認值:
alter table tableName alter column sightml set default 1;
刪除列
alter table tableName drop column 列名;
添加列
ALTER TABLE book ADD(列名 VARCHAR (20));
聚合函數不可以用在條件中
單行單列:可以使用=,>,<,>=,<=,!=
多行單列(集合)可以用All ,ANY ,IN ,not IN
- SQL 分組
1、GroupBY 和 Group_concat
eg:select 列1, GROUP_CONCAT(列名) from employee GROUP BY 列1
having 和 where 的區別:
2、GroupBY 和 Group_concat和Having 或 where
having 是在分組後對數據進行過濾,where 是在分組前對數據進行過濾
having後面可以使用分組函數(統計函數),where後面不可以使用分組函數
where 是對分組前記錄的條件,如果某行記錄沒有滿足where字句的條件,那麼這行記錄不會參加分組;而having是對分組後數據的約束
參考:https://www.cnblogs.com/friday69/p/9389720.html
修改mysql命令行的亂碼:set character_set_results=gb2312;