數據庫執行DQL語句不會對數據進行改變,而是讓數據庫發送結果集給客戶端。
通過查詢語句查詢出來的數據以表的形式展示我們稱這個表爲虛擬結果集。
查詢返回的結果集是一張虛擬表,而不是真實存在的物理表。
1、查詢所有列
SELECT * FROM student;
2、查詢某一列
SELECT stu_name from student;
3、查詢多個列
SELECT stu_name, stu_age FROM student;
4、SQL條件查詢
使用where關鍵字來控制查詢結果的行,select後面的列來控制查詢哪些列。
查詢student表中張三同學的所有信息。
SELECT * FROM student WHERE stu_name='張三';
除等於號之外,還有以下這些邏輯符號。
查詢stu_id在1001-1005的學生信息
SELECT * FROM student WHERE stu_id BETWEEN 1001 AND 1005;
如果不是連續範圍可以使用in,查詢stu_id在(1001,1003,1005)的學生信息
SELECT * FROM student WHERE stu_id IN (1001, 1003, 1005);
查詢stu_age爲空的數據
SELECT * FROM student WHERE stu_age IS NULL;
查詢stu_age不爲空的數據
SELECT * FROM student WHERE stu_age IS NOT NULL;
查詢性別爲男且年齡20的學生信息
SELECT * FROM student WHERE stu_gender='男' AND stu_age=20;
查詢性別爲男或年齡20的學生信息
SELECT * FROM student WHERE stu_gender='男' OR stu_age=20;
4、SQL模糊查詢
查詢姓名由5個字符組成的學生記錄
SELECT * FROM student WHERE stu_name LIKE '_____';
查詢 姓名由5個字符組成的學生,且第五個字母爲S的學生記錄
SELECT * FROM student WHERE stu_name LIKE '____S';
查詢以w開頭的學生姓名
SELECT * FROM student WHERE stu_name like 'w%';
查詢姓名以b爲第二個字母的學生姓名
SELECT * FROM student WHERE stu_name LIKE '_b%';
查詢姓名中包含‘s'字母的學生記錄
SELECT * FROM student WHERE stu_name LIKE '%s%';
5、字段控制查詢
查詢去重後的學生姓名
SELECT DISTINCT stu_name FROM student;
查詢成績和年齡之和
SELECT *, stu_age + stu_score FROM student;
查詢成績和年齡之和(把null替換成0)
SELECT *, ISNULL(stu_age,0) + ISNULL(stu_score,0) FROM student;
將查詢後的某一列取一個別名
SELECT *, ISNULL(stu_age,0) + ISNULL(stu_score,0) AS total FROM student;
6、排序
使用ORDER BY關鍵字進行排序
升序ASC 降序DESC
按薪水對員工升序排名
SELECT * FROM employee ORDER BY salary;
SELECT * FROM employee ORDER BY salary ASC;
按薪水對員工降序排名
SELECT * FROM employee ORDER BY salary DESC;
7、常用聚合函數
函數名 | 含義 |
COUNT() | 統計指定列不爲null的記錄行數 |
MAX() | 計算統計列的最大值,如果指定列是字符串類型,那麼使用字符串排序 |
MIN() | 計算統計列的最小值,如果指定列是字符串類型,那麼使用字符串排序 |
SUM() | 計算指定列的數值和,如果指定列不是數值類型,那麼計算結果爲0 |
AVG | 計算指定列的平均值,如果指定列不是數值類型,那麼計算結果爲0 |
7.1、聚合函數之COUNT()
查詢employee表中記錄數
SELECT COUNT(*) AS total_record FROM employee;
查詢employee表中有績效的員工數
SELECT COUNT(performance) FROM employee;
查詢employee表中月薪大於2500的人
SELECT COUNT(*) FROM employee WHERE salary > 2500;
統計員工表中月薪和績效之和大於5000的人
SELECT COUNT(*) FROM employee WHERE salary+ISNULL(performance,0) > 5000;
查詢有績效的人數和有管理費的人數
SELECT COUNT(performance), COUNT(manage) FROM employee;
7.2、聚合函數之SUM()
查詢所有員工月薪之和
SELECT SUM(salary) FROM employee;
查詢所有員工月薪和、績效和
SELECT SUM(salary),SUM(performance) FROM employee;
查詢所有員工月薪+績效和
SELECT SUM(salary+ ISNULL(performance)) FROM employee;
7.3、聚合函數之AVG()、MAX()、MIN()
查詢平均工資
SELECT AVG(salary) FROM employee;
查詢最高工資
SELECT MAX(salary) FROM employee;
查詢最低工資
SELECT MIN(salary) FROM employee;
8、分組查詢
分組查詢:將查詢結果按照1個或者多個字段進行分組,字段值相同的爲一組,如下例:
SELECT gender FROM employee GROUP BY gender;
根據gender字段來分組,gender字段的全部值只有(男、女),所以分爲了兩組。
當GroupBy單獨使用時,只顯示每組的第一條數據
SELECT gender FROM employee GROUP BY gender;
查詢每個部門有哪些員工
SELECT department, GROUP_CONCAT('name') FROM employee GROUP BY department;
分組注意事項:SELECT後面跟的字段一般也會在GroupBy後面出現
SELECT name,gender FROM employee GROUP BY name,gender;
分組與聚合函數結合
SELECT department, COUNT(salary) ,AVG(salary), MAX(salary), MIN(salary), SUM(salary) , FROM employee GROUP BY department;
查詢每個部門的部門名稱和各個部門的工資和
SELECT department, SUM(salary) FROM employee GROUP BY department;
查詢每個部門的部門名稱以及每個部門的人數
SELECT department, COUNT(*) FROM employee GROUP BY department;
查詢每個部門的部門名稱以及每個部門工資大於1500的人數
SELECT department, COUNT(*) FROM employee WHERE salary>1500 GROUP BY department;
HAVING用於分組查詢後指定一些條件來輸出查詢結果
HAVING和WHERE一樣,但HAVING只能用於group by
查詢工資總和大於9000的部門名稱以及工資總和
SELECT department, SUM(salary) FROM employee GROUP BY department HAVING SUM(salary)>9000;
HAVING與WHERE的區別
having是在分組之後對數據進行過濾
where是在分組之前對數據進行過濾
having後面可以使用分組函數(統計函數)
where後面不可以使用聚合函數
where是對分組前記錄的條件,如果某行記錄沒有滿足where子句的條件,那麼這行記錄不會參加分組
而having是對分組後數據的約束
查詢工資大於2000的,工資總和大於9000的部門名稱以及工資和
SELECT department, GROUP_CONCAT(salary), SUM(salary) FROM employee
WHERE salary > 2000
GROUP BY department
HAVING SUM(salary) > 9000;
9、書寫順序與執行順序
書寫順序: SELECT 、FROM、WHERE、GROUP BY、HAVING、ORDER BY、LIMIT
執行順序:FROM、WHERE、GROUP BY、HAVING、SELECT、ORDER BY、LIMIT
10、LIMIT分頁查詢
LIMIT 參數1(從哪一行開始),參數2(總共要查幾行)
角標是從0開始
比如查詢員工表中前三行的值
SELECT * FROM employee LIMIT 0, 3;
分頁查詢思路:
int curPage = 1; --當前頁
int pageSize = 100; --每一頁的數量
--當前頁爲1 第一頁從0開始 (1-1)*100=0
--當前頁爲2 第一頁從0開始 (2-1)*100=100
--當前頁爲3 第一頁從0開始 (3-1)*100=200
--當前頁爲n 第一頁從0開始 (n-1)*100=300
SELECT * FROM employee LIMIT (curPage-1)*pageSize, pageSize;