1. 程式人生 > >mysql 資料庫快速入門 DQL資料查詢語言

mysql 資料庫快速入門 DQL資料查詢語言

目錄

DQL:資料查詢語言

關鍵字:SELECT

基礎查詢

條件查詢

模糊查詢

欄位控制查詢

求和查詢

IFNULL處理

欄位別名查詢

排序查詢

升序

降序

混合排序

聚合函式  sum avg max min count

COUNT():統計指定列不為NULL的記錄行數;

MAX():計算指定列的最大值,如果指定列是字串型別,那麼使用字串排序運算;

MIN():計算指定列的最小值,如果指定列是字串型別,那麼使用字串排序運算;

SUM():計算指定列的數值和,如果指定列型別不是數值型別,那麼計算結果為0;

AVG():計算指定列的平均值,如果指定列型別不是數值型別,那麼計算結果為0;

分組查詢

GROUP BY

HAVING

注:having與where的區別:

LIMIT

總結


DQL:資料查詢語言

資料庫執行DQL語句不會對資料進行改變,而是讓資料庫傳送結果集給客戶端。

查詢返回的結果集是一張虛擬表(檢視)。

關鍵字:SELECT

// 語法
SELECT 列名 FROM表名 WHERE --> BROUP BY --> HAVING--> ORDER BY
SELECT selection_list /*要查詢的列名稱*/

FROM table_list /*要查詢的表名稱*/

WHERE condition /*行條件*/

GROUP BY grouping_columns /*對結果分組*/

HAVING condition /*分組後的行條件*/

ORDER BY sorting_columns /*對結果分組*/

LIMIT offset_start, row_count /*結果限定*/

基礎查詢

// 查詢所有列
SELECT * FROM stu;

// 查詢指定列
SELECT sid, sname, age FROM stu;

條件查詢

條件查詢就是在查詢時給出WHERE子句,在WHERE子句中可以使用如下運算子及關鍵字

  • =、!=、<>、<、<=、>、>=;
  • BETWEEN…AND;
  • IN(set);
  • IS NULL;  
  • AND;
  • OR;
  • NOT;
// 查詢性別為女,並且年齡50的記錄
SELECT * FROM stu WHERE gender='female' AND ge<50;

// 查詢學號為S_1001,或者姓名為liSi的記錄
SELECT * FROM stu WHERE sid ='S_1001' OR sname='liSi';

// 查詢學號為S_1001,S_1002,S_1003的記錄
SELECT * FROM stu WHERE sid IN ('S_1001','S_1002','S_1003');

// 查詢學號不是S_1001,S_1002,S_1003的記錄
SELECT * FROM tab_student WHERE s_number NOT IN ('S_1001','S_1002','S_1003');

// 查詢年齡為null的記錄
SELECT * FROM stu WHERE age IS NULL;

// 查詢年齡在20到40之間的學生記錄
SELECT * FROM stu WHERE age>=20 AND age<=40;

SELECT * FROM stu WHERE age BETWEEN 20 AND 40;

// 查詢姓名不為null的學生記錄
SELECT * FROM stu WHERE NOT sname IS NULL;

SELECT * FROM stu WHERE sname IS NOT NULL;

模糊查詢

當想查詢姓名中包含a字母的學生時就需要使用模糊查詢了。模糊查詢需要使用關鍵字LIKE

萬用字元:

  • _ 任意一個字母
  • %:任意0~n個字母
// 查詢姓名由5個字母構成的學生記錄
// 模糊查詢必須使用LIKE關鍵字。其中 “_”匹配任意一個字母,5個“_”表示5個任意字母。
SELECT * FROM stu WHERE sname LIKE '_____';

// 查詢姓名由5個字母構成,並且第5個字母為“i”的學生記錄
SELECT * FROM stu WHERE sname LIKE '____i';

// 查詢姓名以“z”開頭的學生記錄 其中“%”匹配0~n個任何字母。
SELECT * FROM stu WHERE sname LIKE 'z%';

欄位控制查詢

去除重複記錄(兩行或兩行以上記錄中系列的上的資料都相同)

SELECT DISTINCT sal FROM emp;

求和查詢

SELECT *,sal+comm FROM emp;

IFNULL處理

// 因為任何東西與NULL相加結果還是NULL,所以結算結果可能會出現NULL。下面使用了把NULL轉換成數值0的函式IFNULL
SELECT *,sal+IFNULL(comm,0) FROM emp;

欄位別名查詢

// 在上面查詢中出現列名為sal+IFNULL(comm,0),這很不美觀,現在我們給這一列給出一個別名,為total:
SELECT *, sal+IFNULL(comm,0) AS total FROM emp;

// 給列起別名時,是可以省略AS關鍵字的:
SELECT *,sal+IFNULL(comm,0)  total FROM emp;

排序查詢

升序

// 查詢所有學生記錄,按年齡升序排序
SELECT *FROM stu ORDER BY sage ASC;

SELECT *FROM stu ORDER BY sage;

降序

// 查詢所有學生記錄,按年齡降序排序
SELECT *FROM stu ORDER BY age DESC;

混合排序

// 查詢所有僱員,按月薪降序排序,如果月薪相同時,按編號升序排序
SELECT * FROM emp ORDER BY sal DESC,empno ASC;

聚合函式  sum avg max min count

聚合函式是用來做縱向運算的函式:

  • COUNT():統計指定列不為NULL的記錄行數;

// 查詢emp表中記錄數:
SELECT COUNT(*) AS cnt FROM emp;

// 查詢emp表中有佣金的人數:
SELECT COUNT(comm) cnt FROM emp;
注意,因為count()函式中給出的是comm列,那麼只統計comm列非NULL的行數。

// 查詢emp表中月薪大於2500的人數:
SELECT COUNT(*) FROM emp
WHERE sal > 2500;

// 統計月薪與佣金之和大於2500元的人數:
SELECT COUNT(*) AS cnt FROM emp WHERE sal+IFNULL(comm,0) > 2500;

// 查詢有佣金的人數,以及有領導的人數:
SELECT COUNT(comm), COUNT(mgr) FROM emp;
  • MAX():計算指定列的最大值,如果指定列是字串型別,那麼使用字串排序運算;

  • MIN():計算指定列的最小值,如果指定列是字串型別,那麼使用字串排序運算;

// 查詢最高工資和最低工資:
SELECT MAX(sal), MIN(sal) FROM emp;
  • SUM():計算指定列的數值和,如果指定列型別不是數值型別,那麼計算結果為0;

  • AVG():計算指定列的平均值,如果指定列型別不是數值型別,那麼計算結果為0;

// 查詢所有僱員月薪和:
SELECT SUM(sal) FROM emp;

// 查詢所有僱員月薪和,以及所有僱員佣金和:
SELECT SUM(sal), SUM(comm) FROM emp;

// 查詢所有僱員月薪+佣金和:
SELECT SUM(sal+IFNULL(comm,0)) FROM emp;

// 統計所有員工平均工資:
SELECT AVG(sal) FROM emp;

分組查詢

當需要分組查詢時需要使用GROUP BY子句,例如查詢每個部門的工資和,這說明要使用部分來分組。

GROUP BY

// 查詢每個部門的部門編號和每個部門的工資和:
SELECT deptno, SUM(sal)FROM emp GROUP BY deptno;

// 查詢每個部門的部門編號以及每個部門的人數:
SELECT deptno,COUNT(*)FROM emp GROUP BY deptno;

// 查詢每個部門的部門編號以及每個部門工資大於1500的人數:
SELECT deptno,COUNT(*)FROM emp WHERE sal>1500GROUP BY deptno;

HAVING

// 查詢工資總和大於9000的部門編號以及工資和:
SELECT deptno, SUM(sal)FROM emp
GROUP BY deptno
HAVING SUM(sal) > 9000;

注:having與where的區別:

1.having是在分組後對資料進行過濾.          where是在分組前對資料進行過濾

2.having後面可以使用分組函式(統計函式)  where後面不可以使用分組函式。

WHERE是對分組前記錄的條件,如果某行記錄沒有滿足WHERE子句的條件,那麼這行記錄不會參加分組;而HAVING是對分組後資料的約束

LIMIT

LIMIT用來限定查詢結果的起始行,以及總行數。

// 查詢5行記錄,起始行從0開始  注意,起始行從0開始,即第一行開始!
SELECT * FROM emp LIMIT 0, 5;


// 查詢10行記錄,起始行從3開始
SELECT * FROM emp LIMIT 3, 10;

總結

查詢語句書寫順序:select – from- where- group by- having- order by-limit

查詢語句執行順序:from - where -group by - having - select - order by-limit