day37_DQL(查詢表中的數據)

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 ... ONOUTER 可以省略

  • 語法:SELECT 字段名 FROM 左表 LEFT [OUTER] JOIN 右表 ON 條件

用左邊表的記錄去匹配右邊表的記錄,如果符合條件的則顯示;否則,顯示 NULL 可以理解爲:在內連接的基礎上保證左表的數據全部顯示(左表是部門,右表員工)

右外連接

 右外連接:使用 RIGHT OUTER JOIN ... ONOUTER 可以省略

  • 語法:SELECT 字段名 FROM 左表 RIGHT [OUTER ]JOIN 右表 ON 條件

用右邊表的記錄去匹配左邊表的記錄,如果符合條件的則顯示;否則,顯示 NULL 可以理解爲:在內連接的基礎上保證右表的數據全部顯示

子查詢

子查詢的概念:

  • 一個查詢的結果做爲另一個查詢的條件
  • 有查詢的嵌套,內部的查詢稱爲子查詢
  • 子查詢要使用括號

子查詢結果的三種情況:

1:子查詢的結果是單行單列

​​​​​​​

子查詢結果只要是單行單列,肯定在 WHERE 後面作爲條件,父查詢使用:比較運算符,如:> <<>= 等

語法:SELECT 查詢字段 FROM 表 WHERE 字段=(子查詢);

2:子查詢的結果是多行單列

子查詢結果是單例多行,結果集類似於一個數組,父查詢使用 in運算符

語法:SELECT 查詢字段 FROM 表 WHERE 字段 IN (子查詢);

3: 子查詢的結果是多行多列
 

子查詢結果只要是多列,肯定在 FROM 後面作爲表

  • 語法:SELECT 查詢字段 FROM (子查詢) 表別名 WHERE 條件;

子查詢作爲表需要取別名,否則這張表沒有名稱則無法訪問表中的字段

子查詢小結

  • 子查詢結果只要是單列,則在 WHERE 後面作爲條件
  • 子查詢結果只要是多列,則在 FROM 後面作爲表進行二次查詢
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章