一、SQL通用語法
①SQL語句可以單行或多行書寫,以分號結尾。
②SQL語句可以使用空格/縮進來增強語句可讀性。
③MySQL數據庫的SQL語句不區分大小寫,關鍵字建議使用大寫。
④注釋:? 單行注釋: -- 注釋內容 或 # 注釋內容(MySQL特有)
? ? ? ? ? ? ? ? ?多行注釋: /* 注釋內容 */?
二、SQL分類
DDL(Data Definition Language):數據定義語言,用于定義數據庫對象(數據庫,表,字段)
DML(Data Manipulation?Language):數據操作語言,用來對數據庫表中的數據進行增刪改
DQL(Data Query Language):數據查詢語言,用來查詢數據庫中的表的記錄
DCL(Data Control Language):數據控制語言,用來創建數據庫用戶、控制數據庫的訪問權限
三、DDL
數據庫操作:
--查詢所有的數據庫:??SHOW DATABASES;--查詢當前數據庫:SELECT DATABASE();--創建:CREATE DATABASE [IF NOT EXISTS] 數據庫名 [DEFAULT CHARSET 字符集] [COLLATE 排序規則];--刪除:DROP DATABASE [IF EXISTS] 數據庫名;--使用:USE 數據庫名
表操作:
-- 查詢當前數據庫所有表:SHOW TABLES;-- 查詢表結構:DESC 表名;--查詢指定表的建表語句:SHOW CREATE TABLE 表名;-- 創建表:CREATE TABLE 表名(字段1 字段1類型[COMMENT 字段1注釋], -- id int comment '編號'字段2 字段2類型[COMMENT 字段2注釋],字段3 字段3類型[COMMENT 字段3注釋],字段4 字段4類型[COMMENT 字段4注釋],...字段N 字段N類型[COMMENT 字段N注釋] -- 最后一個參數沒有 ,
)[COMMENT 表注釋]; -- comment 'xx表';
數據類型:
數值類型:
精度:整個數值的長度
標度:小數部分的位數?
UNSIGNED: 標記為無符號(非負)
字符串類型:
char(10)、varchar(10)? ?: 10代表最多存儲10個字符,如果超出則會報錯
char(10):即使存儲一個字符也會占用10個字符空間,未使用空間使用空格補充(效率高)
varchar(10):存儲一個字符占用1個字符空間,會根據實際內容計算存儲空間(效率低)
日期類型:
表操作:
-- 添加字段:ALTER TABLE 表名 ADD 字段名 類型(長度)[COMMENT 注釋][約束];
--ALTER TABLE emp ADD nickname varchar(20) COMMENT '昵稱';-- 修改數據類型:ALTER TABLE 表名 MODIFY 字段名 新數據類型(長度);-- 修改字段名和字段類型:ALTER TABLE 表名 CHANGE 舊字段名 新字段名 類型(長度)[COMMENT 注釋][約束];
--ALTER TABLE emp CHANGE nickname username varchar(30) COMMENT '用戶名';-- 刪除字段:ALTER TABLE 表名 DROP 字段名;
-- ALTER TABLE emp DROP username;-- 修改表名:ALTER TABLE 表名 RENAME TO 新表名;
--ALTER TABLE emp RENAME TO employee;-- 刪除表:DROP TABLE [IF EXISTS] 表名; -- 刪除指定表,并重新創建該表:TRUNCATE TABLE 表名; --刪除表時,表中所有數據都會被刪除
四、DML
數據操作:
-- 給指定字段添加數據:INSERT INTO 表名(字段名1,字段名2,....) VALUES (值1,值2,...);-- 給全部字段添加數據:INSERT INTO 表名 VALUES(值1,值2,...);-- 批量添加數據:INSERT INTO 表名(字段名1,字段名2,...) VALUES (值1,值2,...),(值1,值2,...),(值1,值2,...);INSERT INTO 表名 VALUES (值1,值2,...),(值1,值2,...),(值1,值2,...);--插入數據時,指定字段順序應該與值保持一致--字符串和日期類型數據應該包含在引號中--插入數據的大小,應該在字段的規定范圍內-- 修改數據:UPDATE 表名 SET 字段名1=值1, 字段名2=值2, ... [WHERE 條件];-- 修改語句的條件可以有,也可以沒有,如果沒有條件,則會修改整張表所有的數據。-- 刪除數據:DELETE FROM 表名 [WHERE 條件]-- DELETE語句的條件可以有,也可以沒有,如果沒有條件,則會刪除整張表的所有數據
-- DELETE語句不能刪除某一個字段的值 (可以使用UPDATE)
五、DQL
查詢關鍵字: SELECT
查詢操作:
SELECT字段類表
FROM表名列表
WHERE條件列表
GROUP BY分組字段列表
HAVING 分組后條件列表
ORDER BY 排序字段列表
LIMIT分頁參數-- 條件查詢 (WHERE)
-- 聚合函數 (count、max、min、avg、sum)
-- 分組查詢 (GROUP BY)
-- 排序查詢 (ORDER BY)
-- 分頁查詢 (LIMIT)-- 查詢多個字段SELECT 字段1,字段2,字段3,... FROM 表名;SELECT * FROM 表名;-- 設置別名SELECT 字段1 [AS 別名1], 字段2 [AS 別名2] ... FROM 表名;-- 去除重復記錄SELECT DISTINCT 字段列表 FROM 表名;
WHERE條件查詢:
-- 查詢名字為兩個字的員工信息SELECT * FROM emp WHERE name = '__';-- 查詢身份證最后一位為x的員工信息SELEECT * FROM emp WHERE idcard = '%x';-- 查詢身份證信息為空的員工信息SELECT * FROM emp WHERE idcard IS NULL;
聚合函數:
count(統計數量)、max(最大值)、min(最小值)、avg(平均數)、sum(總計)
NULL值不參與聚合函數運算
-- 統計員工表員工數量SELECT COUNT(*) FROM emp;-- 統計員工表平均年齡SELECT AVG(age) FROM emp;-- 查詢最大員工的年齡SELECT MAX(age) FROM emp;-- 查詢最小員工的年齡SELECT MIN(age) FROM emp;-- 統計年齡總和SELECT SUM(age) FROM emp;
分組查詢:
-- 語法SELECT 字段列表 FROM 表名 [WHERE 條件] GROUP BY 分組字段名 [HAVING 分組后過濾條件]
關鍵詞:?GROUP BY
WHERE: 分組之前進行過濾,不滿足WHERE條件,不參與分組 ,且不能對分組查詢過濾
HAVING: 對分組之后的結果進行過濾
-- 根據性別分組,統計男性員工 和 女性員工的數量SELECT gender,COUNT(*) FROM emp GROUP BY gender;-- 根據性別進行分組,統計男性員工和女性員工的平均年齡SELECT gender,AVG(age) FROM emp GROUP BY gender;-- 查詢年齡小于45的員工,并根據工作地址分組,獲取員工數量大于等于3的工作地址SELECT address, count(*) address_count FROM emp WHERE age <= 45 GROUP BY address HAVING COUNT(*) >= 3;
執行順序:WHERE > 聚合函數 > HAVING
分組后,查詢的字段一般為聚合函數和分組字段,查詢其他字段無任何意義。
排序查詢:
關鍵詞:ORDER BY
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1 , 字段2 排序方式2;
-- 根據年齡對公司的員工進行升序排序SELECT * FROM emp ORDER BY age asc;-- 根據年齡對公司的員工進行倒序排序SELECT * FROM emp ORDER BY age desc;-- 根據年齡對公司的員工進行升序排序,年齡相同則按入職時間降序排序SELECT * FROM emp ORDER BY age asc , entrydata desc;
分頁查詢:
關鍵詞:LIMIT
SELECT 字段列表 FROM 表名 LIMIT 起始索引 , 查詢記錄數;
起始索引從0開始,起始索引=(查詢頁面-1)* 每頁顯示的記錄數
分頁查詢在不同數據庫中有不同的實現,MySQL中是LIMIT
如果查詢的是第一頁數據,起始索引可以省略,簡寫為 LIMIT 10;
-- 查詢第一頁的員工數據,每頁展示10條記錄SELECT * FROM emp LIMIT 0,10;-- 查詢第二頁的員工數據,每頁展示10條記錄SELECT * FROM emp LIMIT 10,10;