SQL學習
SQL學習網站:https://sqlmother.yupi.icu/#/levels
基礎語法 - 查詢
查詢-全表查詢
使用 select 全表查詢語句,查看整個學生表的內容
select * from student;
查詢結果:
| 學號 | 姓名 | 年齡 |
|---|---|---|
| 101 | 小明 | 20 |
| 102 | 小紅 | 22 |
| 103 | 小剛 | 21 |
| 104 | 小麗 | 19 |
查詢 - 選擇查詢
使用"選擇查詢"來獲取所有學生的姓名(name)和年齡(age)信息
select name,age from student;
| name | age |
|---|---|
| 雞哥 | 25 |
| 魚皮 | 18 |
| 熱dog | 40 |
| 摸FISH | |
| 李阿巴 | 19 |
| 老李 | 56 |
| 李變量 | 24 |
| 王加瓦 | 23 |
| 趙派森 | 80 |
| 孫加加 | 60 |
查詢 - 別名
從名為 student 的數據表中選擇出所有學生的姓名(name)和年齡(age)信息,并為它們取別名為 學生姓名 和 學生年齡
select name as 學生姓名,age 學生年齡 from student;
| 學生姓名 | 學生年齡 |
|---|---|
| 雞哥 | 25 |
| 魚皮 | 18 |
| 熱dog | 40 |
| 摸FISH | |
| 李阿巴 | 19 |
| 老李 | 56 |
| 李變量 | 24 |
| 王加瓦 | 23 |
| 趙派森 | 80 |
| 孫加加 | 60 |
查詢 - 常量和運算
從名為student的數據表中選擇出所有學生的姓名(name)和分數(score),并且額外計算出分數的 2 倍(double_score)
select name,score,score * 2 as double_score from student;
| name | score | double_score |
|---|---|---|
| 雞哥 | 2.5 | 5 |
| 魚皮 | 400 | 800 |
| 熱dog | 600 | 1200 |
| 摸FISH | 360 | 720 |
| 李阿巴 | 120 | 240 |
條件查詢 - where
從名為student 的數據表中選擇出所有學生的姓名(name)和成績(score),要求學生姓名為 '魚皮'。
select name,score from student where name='魚皮';
| name | score |
|---|---|
| 魚皮 | 400 |
條件查詢 - 運算符
名為 student 的數據表中選擇出所有學生的姓名(name)和年齡(age),要求學生姓名不等于 '熱dog' 。
運算符是 SQL 中用于在條件查詢中進行條件判斷的特殊符號,比如 =、 !=、<、> 等。通過使用不同的運算符,我們可以在查詢語句中設定多樣化的條件,從而根據數據的不同屬性進行靈活的篩選和過濾。
select name,age from student where name !='熱dog';
| name | age |
|---|---|
| 雞哥 | 25 |
| 魚皮 | 18 |
| 摸FISH | |
| 李阿巴 | 19 |
使用 "!=" 運算符篩選出 name 不是 '小張' 的員工
select name, age, salary from employees where name != '小張';
使用 ">" 運算符篩選出工資高于 5500 的員工:
select name, age, salary from employees where salary > 5500;
使用 "BETWEEN" 運算符篩選出年齡在 25 到 30 之間的員工:
select name, age, salary from employees where age between 25 and 30;
條件查詢 - 空值
從名為 student 的數據表中選擇出所有學生的姓名(name)、年齡(age)和成績(score),要求學生年齡不為空值。
在SQL查詢中,我們可以使用 "IS NULL" 和 "IS NOT NULL" 來判斷字段是否為空值或非空值。
select name,age,score from student where age is not null;
| name | age | score |
|---|---|---|
| 雞哥 | 25 | 2.5 |
| 魚皮 | 18 | 400 |
| 熱dog | 40 | 600 |
條件查詢 - 模糊查詢
模糊查詢是一種特殊的條件查詢,它允許我們根據模式匹配來查找符合特定條件的數據,可以使用 LIKE 關鍵字實現模糊查詢。
在 LIKE 模糊查詢中,我們使用通配符來代表零個或多個字符,從而能夠快速地找到匹配的數據。
有如下 2 種通配符:
-
百分號(%):表示任意長度的任意字符序列。
-
下劃線(_):表示任意單個字符。
從名為
student的數據表中選擇出所有學生的姓名(name)和成績(score),要求姓名(name)不包含 "李" 這個字。
select name,score from student where name not like '%李%';
我們使用 LIKE 模糊查詢來找出姓名(name)中包含關鍵字 "張" 的員工信息:
select name, age, position from employees where name like '%張%';
條件查詢 - 邏輯運算
在邏輯運算中,常用的運算符有:
- AND:表示邏輯與,要求同時滿足多個條件,才返回 true。
- OR:表示邏輯或,要求滿足其中任意一個條件,就返回 true。
- NOT:表示邏輯非,用于否定一個條件(本來是 true,用了 not 后轉為 false)
從名為 student 的數據表中選擇出所有學生的姓名(name)、成績(score),要求學生的姓名包含 "李",或者成績(score)大于 500。
select name,score from student where name like '%李%' or score > 500;
使用邏輯運算來找出姓名中包含關鍵字 "李" 且 年齡小于 30 歲的員工信息:
select name, age, salary from employees where name like '%李%' and age < 30;
基礎語法 - 去重
在 SQL 中,可以使用 DISTINCT 關鍵字來實現去重操作。
舉個應用場景:假設你是班長,要統計班級中有哪些不同的學生,而不關心他們重復出現的次數,就可以使用去重。
從名為 student 的數據表中選擇出所有不重復的班級 ID(class_id)和考試編號(exam_num)的組合。
select distinct class_id,exam_num from student;
基礎語法 - 排序
在 SQL 中,可以使用 ORDER BY 關鍵字來實現排序操作。ORDER BY 后面跟上需要排序的字段,可以選擇升序(ASC)或降序(DESC)排列。
-- SQL 查詢語句 1
select name, age from students order by age asc;
-- SQL 查詢語句 2
select name, score from students order by score desc;
按照年齡升序(從小到大):
| name | age |
|---|---|
| 張三 | 18 |
| 王五 | 19 |
| 李四 | 20 |
| 趙六 | 20 |
按照分數降序(從大到小):
| name | score |
|---|---|
| 王五 | 92 |
| 張三 | 90 |
| 趙六 | 88 |
| 李四 | 85 |
從名為 student 的數據表中選擇出學生姓名(name)、年齡(age)和成績(score),首先按照成績從大到小排序,如果成績相同,則按照年齡從小到大排序。
select name,age,score from student order by score desc,age asc;
基礎語法 - 截斷和偏移
在 SQL 中,使用 LIMIT 關鍵字來實現數據的截斷和偏移。
截斷和偏移的一個典型的應用場景是分頁,即網站內容很多時,用戶可以根據頁號每次只看部分數據
從名為 student 的數據表中選擇學生姓名(name)和年齡(age),按照年齡從小到大排序,從第 2 條數據開始、截取 3 個學生的信息
| name | age |
|---|---|
| 魚皮 | 18 |
| 李阿巴 | 19 |
| 王加瓦 | 23 |
- LIMIT 后只跟一個整數,表示要截斷的數據條數(一次獲取幾條)
select task_name, due_date from tasks limit 2;
-- LIMIT 后跟 2 個整數,依次表示從第幾條數據開始、一次獲取幾條
select task_name, due_date from tasks limit 2, 2;
查詢語句 1 結果,只獲取了 2 條數據:
| task_name | due_date |
|---|---|
| 完成報告 | 2023-08-05 |
| 預約醫生 | 2023-08-08 |
查詢語句 2 結果,從下標為 2(第 3 條)數據的位置開始獲取 2 條數據:
| task_name | due_date |
|---|---|
| 購買禮物 | 2023-08-10 |
| 安排旅行 | 2023-08-15 |
基礎語法 - 條件分支
使用 case when 可以在查詢結果中根據特定的條件動態生成新的列或對現有的列進行轉換
將學生按照年齡劃分為三個年齡等級(age_level):60 歲以上為 "老同學",20 歲以上(不包括 60 歲以上)為 "年輕",20 歲及以下、以及沒有年齡信息為 "小同學"。
返回結果應包含學生的姓名(name)和年齡等級(age_level),并按姓名升序排序。
-- 請在此處輸入 SQL
SELECT name,
CASE
WHEN (age > 60) THEN '老同學'
WHEN (age > 20) THEN '年輕'
ELSE '小同學'
END AS age_level
FROM
student
ORDER BY
name asc;
| name | age_level |
|---|---|
| 孫加加 | 年輕 |
| 摸FISH | 小同學 |
| 李變量 | 年輕 |
| 李阿巴 | 小同學 |
| 熱dog | 年輕 |
使用條件分支 case when ,根據 name 來判斷學生是否會說 RAP,并起別名為 can_rap。
示例 SQL 如下:
SELECT
name,
CASE WHEN (name = '雞哥') THEN '會' ELSE '不會' END AS can_rap
FROM
student;
查詢結果:
| name | can_rap |
|---|---|
| 小明 | 不會 |
| 雞哥 | 會 |
| 李華 | 不會 |
| 王五 | 不會 |
函數 - 時間函數
常用的時間函數有:
- DATE:獲取當前日期
- DATETIME:獲取當前日期時間
- TIME:獲取當前時間
編寫一個 SQL 查詢,展示所有學生的姓名(name)和當前日期(列名為 "當前日期")。
select name,DATE() as "當前日期" from student;
| name | 當前日期 |
|---|---|
| 雞哥 | 2024-11-14 |
| 魚皮 | 2024-11-14 |
| 熱dog | 2024-11-14 |
| 摸FISH | 2024-11-14 |
| 李阿巴 | 2024-11-14 |
使用時間函數獲取當前日期、當前日期時間和當前時間:
-- 獲取當前日期
SELECT DATE() AS current_date;
-- 獲取當前日期時間
SELECT DATETIME() AS current_datetime;
-- 獲取當前時間
SELECT TIME() AS current_time;
函數 - 字符串處理
SQL 中,字符串處理是一類用于處理文本數據的函數。它們允許我們對字符串進行各種操作,如轉換大小寫、計算字符串長度以及搜索和替換子字符串等。字符串處理函數可以幫助我們在數據庫中對字符串進行加工和轉換,從而滿足不同的需求。
編寫一個 SQL 查詢,篩選出姓名為 '熱dog' 的學生,展示其學號(id)、姓名(name)及其大寫姓名(upper_name)。
select id,name,UPPER(name) as upper_name from student where name='熱dog'
使用字符串處理函數 UPPER 將姓名轉換為大寫:
-- 將姓名轉換為大寫
SELECT name, UPPER(name) AS upper_name
FROM employees;
查詢結果:
| name | upper_name |
|---|---|
| 小明 | 小明 |
| 熱dog | 熱DOG |
| Fish摸摸 | FISH摸摸 |
| 雞哥 | 雞哥 |
2)使用字符串處理函數 LENGTH 計算姓名長度:
-- 計算姓名長度
SELECT name, LENGTH(name) AS name_length
FROM employees;
查詢結果:
| name | name_length |
|---|---|
| 小明 | 2 |
| 熱dog | 4 |
| Fish摸摸 | 6 |
| 雞哥 | 2 |
3)使用字符串處理函數 LOWER 將姓名轉換為小寫:
-- 將姓名轉換為小寫并進行條件篩選
SELECT name, LOWER(name) AS lower_name
FROM employees;
查詢結果:
| name | lower_name |
|---|---|
| 小明 | 小明 |
| 熱dog | 熱dog |
| Fish摸摸 | fish摸摸 |
| 雞哥 | 雞哥 |
函數 - 聚合函數
常見的聚合函數包括:
-
COUNT:計算指定列的行數或非空值的數量。
-
SUM:計算指定列的數值之和。
-
AVG:計算指定列的數值平均值。
-
MAX:找出指定列的最大值。
-
MIN:找出指定列的最小值。
編寫一個 SQL 查詢,匯總學生表中所有學生的總成績(total_score)、平均成績(avg_score)、最高成績(max_score)和最低成績(min_score)
select SUM(score) as total_score, AVG(score) as avg_score, MAX(score) as max_score, MIN(score) as min_score from student;
假設有一個訂單表 orders,包含以下字段:order_id(訂單號)、customer_id(客戶編號)、amount(訂單金額)。數據如下:
| order_id | customer_id | amount |
|---|---|---|
| 1 | A001 | 100 |
| 2 | A002 | 200 |
| 3 | A001 | 150 |
| 4 | A003 | 50 |
1)使用聚合函數 COUNT 計算訂單表中的總訂單數:
SELECT COUNT(*) AS order_num
FROM orders;
查詢結果:
| order_num |
|---|
| 4 |
2)使用聚合函數 COUNT(DISTINCT 列名) 計算訂單表中不同客戶的數量:
SELECT COUNT(DISTINCT customer_id) AS customer_num
FROM orders;
查詢結果:
| customer_num |
|---|
| 3 |
3)使用聚合函數 SUM 計算總訂單金額:
SELECT SUM(amount) AS total_amount
FROM orders;
查詢結果:
| total_amount |
|---|
| 500 |
分組聚合 - 單字段分組
在 SQL 中,通常使用 GROUP BY 關鍵字對數據進行分組。
編寫一個 SQL 查詢,統計學生表中的班級編號(class_id)和每個班級的平均成績(avg_score)。
-- 請在此處輸入 SQL
select class_id,AVG(score) as avg_score from student group by class_id
| class_id | avg_score |
|---|---|
| 1 | 201.25 |
| 2 | 480 |
| 3 | 310 |
| 4 | 330 |
| 5 | 100.5 |
分組聚合 - 多字段分組
多字段分組和單字段分組的實現方式幾乎一致,使用 GROUP BY 語法即可。
編寫一個 SQL 查詢,統計學生表中的班級編號(class_id),考試次數(exam_num)和每個班級每次考試的總學生人數(total_num)
select
class_id,
exam_num,
count(*) as total_num
from
student
group by
class_id,
exam_num;
| class_id | exam_num | total_num |
|---|---|---|
| 1 | 1 | 1 |
| 1 | 4 | 1 |
| 2 | 4 | 2 |
| 3 | 2 | 1 |
查詢使用多字段分組查詢表中 每個客戶 購買的 每種商品 的總金額,相當于按照客戶編號和商品編號分組:
-- 查詢每個用戶購買的每種商品的總金額,按照客戶編號和商品編號分組
SELECT customer_id, product_id, SUM(amount) AS total_amount
FROM orders
GROUP BY customer_id, product_id;
查詢結果:
| customer_id | product_id | total_amount |
|---|---|---|
| A001 | 1 | 250 |
| A001 | 2 | 50 |
| A002 | 1 | 200 |
| A003 | 1 | 50 |
分組聚合 - having 子句
在 SQL 中,HAVING 子句用于在分組聚合后對分組進行過濾。它允許我們對分組后的結果進行條件篩選,只保留滿足特定條件的分組
請你編寫一個 SQL 查詢,統計學生表中班級的總成績超過 150 分的班級編號(class_id)和總成績(total_score)。
select
class_id,
SUM(score) as total_score
from
student
group by
class_id
having
SUM(score) > 150;
假設有一個訂單表 orders,包含以下字段:order_id(訂單號)、customer_id(客戶編號)、amount(訂單金額)。數據如下:
| order_id | customer_id | amount |
|---|---|---|
| 1 | A001 | 100 |
| 2 | A002 | 200 |
| 3 | A001 | 150 |
| 4 | A003 | 50 |
1)使用 HAVING 子句查詢訂單數超過 1 的客戶:
SELECT customer_id, COUNT(order_id) AS order_num
FROM orders
GROUP BY customer_id
HAVING COUNT(order_id) > 1;
查詢結果:
| customer_id | order_num |
|---|---|
| A001 | 2 |
2)使用 HAVING 子句查詢訂單總金額超過 100 的客戶:
-- 查詢訂單總金額超過100的客戶
SELECT customer_id, SUM(amount) AS total_amount
FROM orders
GROUP BY customer_id
HAVING SUM(amount) > 100;
查詢結果:
| customer_id | total_amount |
|---|---|
| A001 | 250 |
| A002 | 200 |
查詢進階 - 子查詢
子查詢是指在一個查詢語句內部 嵌套 另一個完整的查詢語句,內層查詢被稱為子查詢。子查詢可以用于獲取更復雜的查詢結果或者用于過濾數據。
寫一個 SQL 查詢,使用子查詢的方式來獲取存在對應班級的學生的所有數據,返回學生姓名(name)、分數(score)、班級編號(class_id)字段。
select name,score,class_id from student where class_id in (select distinct id from class);
假設我們有以下兩個數據表:orders 和 customers,分別包含訂單信息和客戶信息。
orders 表:
| order_id | customer_id | order_date | total_amount |
|---|---|---|---|
| 1 | 101 | 2023-01-01 | 200 |
| 2 | 102 | 2023-01-05 | 350 |
| 3 | 101 | 2023-01-10 | 120 |
| 4 | 103 | 2023-01-15 | 500 |
customers 表:
| customer_id | name | city |
|---|---|---|
| 101 | Alice | New York |
| 102 | Bob | Los Angeles |
| 103 | Charlie | Chicago |
現在,我們希望查詢出訂單總金額 > 200 的客戶的姓名和他們的訂單總金額,示例 SQL 如下:
-- 主查詢
SELECT name, total_amount
FROM customers
WHERE customer_id IN (
-- 子查詢
SELECT DISTINCT customer_id
FROM orders
WHERE total_amount > 200
);
在上述 SQL 中,先通過子查詢從訂單表中過濾查詢出了符合條件的客戶 id,然后再根據客戶 id 到客戶信息表中查詢客戶信息,這樣可以少查詢很多客戶信息數據。
上述語句的查詢結果:
| name | total_amount |
|---|---|
| Bob | 350 |
| Charlie | 500 |

關注小張的知識雜貨鋪,讓我們一起學習一起進步

浙公網安備 33010602011771號