mysql 資料庫快速入門 DQL資料查詢語言
阿新 • • 發佈:2019-01-04
目錄
MAX():計算指定列的最大值,如果指定列是字串型別,那麼使用字串排序運算;
MIN():計算指定列的最小值,如果指定列是字串型別,那麼使用字串排序運算;
SUM():計算指定列的數值和,如果指定列型別不是數值型別,那麼計算結果為0;
AVG():計算指定列的平均值,如果指定列型別不是數值型別,那麼計算結果為0;
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