DQL 查詢表中的數據
查詢不會對數據庫中的數據進行修改.只是一種顯示數據的方式,完整語法格式如下所示:
語法:
簡單查詢
查詢表所有行和列的數據
- 語法:SELECT * FROM 表名;
查詢指定列的數據,多個列之間以逗號分隔,如果需要查詢所有的數據,則建議寫出全部列名。不建議使用*代替
- 語法:SELECT 字段名 1, 字段名 2, 字段名 3, ... FROM 表名;
清除重複值
查詢指定列並且結果不出現重複數據
- 語法:SELECT DISTINCT 字段名 FROM 表名;
查詢結果參與運算
某列數據和固定值運算
- 語法:SELECT 列名 1 + 固定值 FROM 表名;
某列數據和其他列數據參與運算
- 語法:SELECT 列名 1 + 列名 2 FROM 表名;
注意:
- 參與運算的必須是數值類型 ,如果有null參與運算,計算結果都是null。如果參與運算的列有null,我們可以使用函數 IFNULL來解決。
- IFNULL(列名,默認值) :如果列名不爲空,返回這列的值。如果爲 NULL,則返回默認值。
指定列的別名進行查詢
使用別名的好處:
- 顯示的時候使用新的名字,並不修改表的結構。
- 表使用別名的原因:用於多表查詢操作
對列指定別名
- 語法:SELECT 字段名 1 AS 別名, 字段名 2 AS 別名... FROM 表名;
對列和表同時指定別名
- 語法:SELECT 字段名 1 AS 別名, 字段名 2 AS 別名... FROM 表名 AS 表別名;
注意:as 關鍵字可以省略,用空格代替。
條件查詢
爲什麼要條件查詢
- 如果沒有查詢條件,則每次查詢所有的行。實際應用中,一般要指定查詢的條件。對記錄進行過濾。我們一般使用運算符來設置條件。
條件查詢的語法
- SELECT 字段名 FROM 表名 WHERE 條件;
流程:取出表中的每條數據,滿足條件的記錄就返回,不滿足條件的記錄不返回
MySQL中的運算符
運算符
邏輯運算符
in 關鍵字
範圍查詢
like 關鍵字
排序查詢
通過 ORDER BY 子句,可以將查詢出的結果進行排序(排序只是顯示方式,不會影響數據庫中數據的順序)
單列排序
只按某一個字段進行排序,單列排序。
- 語法:SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名 [ASC|DESC];
注意:
- ASC: 升序,默認值
- DESC: 降序
組合排序
同時對多個字段進行排序,如果第 1 個字段相等,則按第 2 個字段排序,依次類推。
- 語法:SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名 1 [ASC|DESC], 字段名 2 [ASC|DESC];
聚合函數
之前我們做的查詢都是橫向查詢,它們都是根據條件一行一行的進行判斷,而使用聚合函數查詢是縱向查詢, 它是對一列的值進行計算,然後返回一個結果值。聚合函數會忽略空值 NULL。建議如果統計個數則不要使用有可能爲 null 的列,但如果需要把 NULL也統計進去呢? 使用 IFNULL(列名,默認值) 函數 作用:如果列名不爲空,返回
- 語法: SELECT 聚合函數(列名) FROM 表名;
五個聚合函數
- max(列名) :求這一列的最大值
- min(列名) :求這一列的最小值
- avg(列名) :求這一列的平均值
- count(列名): 統計這一列有多少條記錄
- sum(列名): 對這一列求總和
分組查詢
分組查詢是指使用 GROUP BY 語句對查詢信息進行分組,相同數據作爲一組
- 語法:SELECT 字段 1,字段 2... FROM 表名 GROUP BY 分組字段 [HAVING 條件];
GROUP BY 怎麼分組的? 將分組字段結果中相同內容作爲一組,如按性別將學生分成 2 組。GROUP BY 將分組字段結果中相同內容作爲一組,並且返回每組的第一條數據,所以單獨分組沒什麼用處。 分組的目的就是爲了統計,一般分組會跟聚合函數一起使用。
效果如下:
注意:
- 當我們使用某個字段分組,在查詢的時候也需要將這個字段查詢出來,否則看不到數據屬於哪組的
having 與 where 的區別
limit 語句
LIMIT 是限制的意思,所以 LIMIT 的作用就是限制查詢記錄的條數。
- 語法:SELECT *|字段列表 [as 別名] FROM 表名 [WHERE 子句] [GROUP BY 子句][HAVING 子句][ORDER BY 子 句][LIMIT 子句];
LIMIT 語法格式:
多表查詢
要查詢的數據來至於不同的表,就是多表查詢
什麼是笛卡爾積現象
有兩個集合A,B .取這兩個集合的所有組成情況就是笛卡爾積現象。
需求:查詢所有的員工和所有的部門 我們直接寫SQL語句:select * from emp,dept; 就會出現笛卡爾積現象
如何清除笛卡爾積現象的影響?
- 確定表連接的條件,通過條件過濾掉沒用的數據。
多表查詢的分類:
內連接查詢:
- 隱式內連接:使用where條件消除無用數據
- 顯式內連接, 語法: select 字段列表 from 表名1 [inner] join 表名2 on 條件
總結內連接查詢步驟:
- 確定查詢哪些表
- 確定表連接的條件
- 確定查詢的條件
- 確定查詢的字段
左外連接
左外連接:使用 LEFT OUTER JOIN ... ON,OUTER 可以省略
- 語法:SELECT 字段名 FROM 左表 LEFT [OUTER] JOIN 右表 ON 條件
用左邊表的記錄去匹配右邊表的記錄,如果符合條件的則顯示;否則,顯示 NULL 可以理解爲:在內連接的基礎上保證左表的數據全部顯示(左表是部門,右表員工)
右外連接
右外連接:使用 RIGHT OUTER JOIN ... ON,OUTER 可以省略
- 語法:SELECT 字段名 FROM 左表 RIGHT [OUTER ]JOIN 右表 ON 條件
用右邊表的記錄去匹配左邊表的記錄,如果符合條件的則顯示;否則,顯示 NULL 可以理解爲:在內連接的基礎上保證右表的數據全部顯示
子查詢
子查詢的概念:
- 一個查詢的結果做爲另一個查詢的條件
- 有查詢的嵌套,內部的查詢稱爲子查詢
- 子查詢要使用括號
子查詢結果的三種情況:
1:子查詢的結果是單行單列
子查詢結果只要是單行單列,肯定在 WHERE 後面作爲條件,父查詢使用:比較運算符,如:> 、<、<>、= 等
語法:SELECT 查詢字段 FROM 表 WHERE 字段=(子查詢);
2:子查詢的結果是多行單列
子查詢結果是單例多行,結果集類似於一個數組,父查詢使用 in運算符
語法:SELECT 查詢字段 FROM 表 WHERE 字段 IN (子查詢);
子查詢結果只要是多列,肯定在 FROM 後面作爲表
- 語法:SELECT 查詢字段 FROM (子查詢) 表別名 WHERE 條件;
子查詢作爲表需要取別名,否則這張表沒有名稱則無法訪問表中的字段
子查詢小結
- 子查詢結果只要是單列,則在 WHERE 後面作爲條件
- 子查詢結果只要是多列,則在 FROM 後面作爲表進行二次查詢