SQL语法基础
結構化查詢語言(Structured Query Language):是一種特殊目的的編程語言,是一種數據庫查詢和程序設計語言,用于存取數據以及查詢、更新和管理關系數據庫系統。
數據查詢語言(DQL):SELECT(查詢)
數據操作語言(DML):INSERT(插入)、UPDATE(修改)、DELETE(刪除)
一、常見的MySql的數據類型:
文本:varchar、text、longtext
數字:int、tinyint、bigint、float、double
日期:date(2021-07-15)、datetime(2021-11-03 15:31:05)
二、SQL常見語法
1、訓練數據集,共四個表文件Course、Student、Score、Teacher
?
2、INSERT語法:在表文件中插入數據
INSERT INTO 表名稱 VALUES(值1,值2,……);
INSERT INTO 表名稱(列1,列2,……)
VALUES(值1,值2,……),(值1,值2,……),……;
注:關鍵字之間要有空格,如果不是多條語句同時執行,語句后的分號(;)可以省略
3、DELETE語法:刪除表文件中部分數據
DELETE FROM 表名稱
(WHERE 列名稱 = 值)
4、UPDATE語法:修改表文件中數據
UPDATE 表名稱
SET 列名稱1 = 新值,
?????? ??? 列名稱2 = 新值,
?????? ?? ?……
WHERE 列名稱 = 某值
5、SELECT語法:查詢語句
整體語法:SELECT 列名稱1 AS 列1,
????????????? ? ???????列名稱2 AS 列2,
????????????? ???????? ……
FROM 表名稱
(WHERE 列名稱 = 某值
ORDER BY 列名稱 ASC/DESC
LIMIT 數字1,數字2 )
示例:
SELECT s_id AS '學號',
????????????? ? ?s_name,
????????????? ?? s_birthday,
????????????? ? ?s_sex
FROM student
WHERE s_id < 5
6、WHERE條件
(1)AND 和 OR
AND 和 OR 可在 WHERE 子語句中把兩個或多個條件結合起來。
如果第一個條件和第二個條件都成立,則 AND 運算符顯示一條記錄。
如果第一個條件和第二個條件中只要有一個成立,則 OR 運算符顯示一條記錄。
示例:
查詢生日為1993年3月5日的男學生的信息:
SELECT s_id,s_name,s_birthday,s_sex
FROM student
WHERE s_sex = '男' AND s_birthday = '1993-03-05’
查詢生日為1993年3月5日或者性別為男的學生的信息:
SELECT s_id,s_name,s_birthday,s_sex
FROM student
WHERE s_sex = '男' OR s_birthday = '1993-03-05'
?
(2)LIKE(模糊查詢)
通配符:
% :替代 0 個或多個字符
_ :替代一個字符
示例:
查詢姓李的學生的信息:
SELECT s_id,s_name,s_birthday,s_sex
FROM student
WHERE s_name LIKE '李%'
查詢生日為1993年3月5日且姓李的學生的信息:
SELECT s_id,s_name,s_birthday,s_sex
FROM student
WHERE s_name LIKE '李%' AND s_birthday = '1993-03-05’
查詢姓名為兩個字且姓為王的學生的信息:
SELECT s_id,s_name,s_birthday,s_sex
FROM student
WHERE s_name LIKE ‘王_’
(3)BETWEEN …… AND ……
BETWEEN ... AND 會選取介于兩個值之間的數據范圍。這些值可以是數值或者日期。
示例:
查詢s_id在3到6之間的學生的信息:
SELECT s_id,s_name,s_birthday,s_sex
FROM student
WHERE s_id BETWEEN 3 AND 6( 包含3和6)
?
查詢生日在1993年1月1日到1993年12月31日之間的學生信息:
SELECT s_id,s_name,s_birthday,s_sex
FROM student
WHERE s_birthday BETWEEN '1993-01-01' AND '1993-12-31'
?
(4)<,>,<>,>=,<=
< 小于
> 大于
<>(!=) 不等于
>= 大于等于
<= 小于等于
查詢s_id在3到6之間的學生的信息:
SELECT s_id,s_name,s_birthday,s_sex
FROM student
WHERE s_id >=3 AND s_id <=6
(5)IN
查詢s_id在3到6之間的學生的信息:
SELECT s_id,s_name,s_birthday,s_sex
FROM student
WHERE s_id IN (3,4,5,6)
綜上,查詢s_id在3到6之間的學生信息共列舉了三種取值條件,輸出結果均相同。
7、多表查詢—LEFT JOIN…… ON…… 和 RIGHT JOIN…… ON ……
LEFT JOIN:從左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中沒有匹配的行
RIGHT JOIN:與LEFT JOIN 相反,會從右表 (table_name2) 那里返回所有的行,
即使在左表 (table_name1) 中沒有匹配的行。
示例1:同時查詢score及student兩個表的數據,保留score全部行
(1)SELECT student.s_id,student.s_name,score.c_id,score.s_score
FROM score
LEFT JOIN student
ON score.s_id = student.s_id
(2)SELECT student.s_id,student.s_name,score.c_id,score.s_score
FROM student
RIGHT JOIN score
ON score.s_id = student.s_id
示例2:查詢c_id為1的學生的成績和科目名稱
SELECT b.s_id,b.s_name,a.c_name,b.s_score
FROM course a RIGHT JOIN (
SELECT student.s_id,student.s_name,score.c_id,score.s_score
FROM score
LEFT JOIN student
ON score.s_id = student.s_id WHERE c_id = 1) b
ON a.c_id = b.c_id
8、ORDER BY—排序
根據某一列的信息進行正序或倒序排序默認
ASC:從小到大排序(升序排列),一般可以省略
DESC:從大到小排序(降序排列)
示例:按照生日正序排序:
SELECT *
FROM student
ORDER BY s_birthday (ASC)
?
按照生日倒序排序:
SELECT *
FROM student
ORDER BY s_birthday DESC
9、LIMIT—分頁
LIMIT num1,num2:
從num1開始,num1最小為0,查詢num2條數據
如果從頭開始,第一個數字可以省略
示例:按照生日正序排序查詢前三人的信息:
SELECT * FROM student ORDER BY s_birthday? LIMIT 3
SELECT * FROM student ORDER BY s_birthday? LIMIT 0,3
按照生日倒序排序取第三個人到第五個人的信息:
SELECT *
FROM student
ORDER BY s_birthday DESC LIMIT 2,3
10、常用數學函數
COUNT():求數量
SUM():求和
AVG():求平均值
MAX():求最大值
MIN():求最小值
示例:求參加課程號為2的學生數量:
SELECT COUNT(*)
FROM score
WHERE c_id =2
?
求課程號為2的成績總分:
SELECT SUM(s_score)
FROM score
WHERE c_id =2
?
求課程號為2的平均分:
SELECT AVG(s_score)
FROM score
WHERE c_id =2
?
求課程號為2的最高分:
SELECT MAX(s_score)
FROM score
WHERE c_id =2
?
求課程號為2的最低分:
SELECT MIN(s_score)
FROM score
WHERE c_id =2
?
GROUP BY:結合聚合函數,根據一個或多個列對結果集進行分組
HAVING:HAVING 子句可以讓我們篩選分組后的各組數據
SELECT 列名稱1 AS 列1,
?????? ?? 列名稱2 AS 列2,
?????? ?? ……
FROM 表名稱
(WHERE 列名稱 = 某值)
GROUP BY 列名稱1
HAVING 條件
示例:獲取每個科目的平均分:
SELECT c_id,AVG(s_score)
FROM score
GROUP BY c_id
獲取平均分在66分以上的科目ID和平均分:
SELECT c_id,AVG(s_score)
FROM score
GROUP BY c_id
HAVING AVG(s_score)>66
?
11、常用日期函數
NOW():當前日期和時間
CURDATE():當前日期
CURTIME():當前時間
DATE_FORMAT(date,format):時間格式化
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s')
?SELECT DATE_FORMAT(NOW(), ‘%Y/%m/%d %H:%i:%s')
SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日 %H:%i:%s')
?
三、注意事項
1、關鍵字不區分大小寫,包括SELECT等價于select,LIKE等價于like,COUNT()等價于count()
2、所有的符號都是英文符號,包括不限于:, ( ) ; % ! ‘ “
3、文本和日期類型的數據,前后需要加單引號,比如 …… WHERE s_sex = ‘男’
4、別名:字段取別名時可以加AS或者不加,以空格間隔,表名取別名時只能以空格間隔
總結
- 上一篇: 两个简单的python入门小游戏
- 下一篇: Spark性能优化 -- Spark