SQL常見語句圖文詳解(附詳細代碼)
該篇演示SQL語句用的是MySQL,除此之外SQL server等數(shù)據(jù)庫也是使用sql語言,本篇主要是介紹sql語言,關于運用到mysql中具體使用會在后面更新一篇新的博客
該表格是我們下面基本語句舉例操作的原始表格


一、基礎語句
1.select語句
SELECT 關鍵字用于指定要查詢的列,可以使用*代表所有列;
FROM關鍵字用于指定要查詢的表;WHERE關鍵字用于指定查詢的條件。
SELECT column1, column2, ... FROM table_name WHERE condition;
eg:
查詢students表格中性別為男的所有列

查詢students表格中性別為男的姓名列和年齡列
這里可以用#注釋代碼,查詢的列名要用英文格式的逗號隔開

2.insert語句:用來增加行
table_name是要插入數(shù)據(jù)的表名;
column1、column2等是表中的列名,value1、value2等是要插入的值。
INSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...);
eg:
添加行的時候要注意添加數(shù)據(jù)的數(shù)值類型,是字符串還是數(shù)值,該不該帶引號這些問題

如果我們前面寫的列名,后面沒有匹配到,就比如前面我們寫了year但是后面我們數(shù)值上沒寫,這個insert就不能運行成功

但如果我們前面也不寫year這個列名,改行就能添加成功,沒寫數(shù)值的那個地方會自動填充null
這個意思就是寫insert語句的時候前面列名個數(shù)要和后面值個數(shù)是一一對應的

3.updata語句
table_name是要更新數(shù)據(jù)的表名,column1、column2等是要修改的列名,value1、value2等是要修改的值,WHERE子句是用于指定要更新的行的條件。
UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE some_column = some_value;
set后是需要修改的內(nèi)容,where后面加條件確定是哪一行需要做出更新,這里我們就是把表中‘小薛’的年齡從20改成了21(ctrl+/鍵也能達到注釋的效果)

4.delete語句
table_name是要刪除數(shù)據(jù)的表名,WHERE子句是用于指定要刪除的行的條件。
注意:如果不指定條件相當于刪除表中所有數(shù)據(jù)
DELETE FROM table_name WHERE some_column = some_value;
from后加表名,where后加條件確定是該表哪一行要刪除,不加where整個表都會被刪除

二、基本查詢
1.where子句
WHERE子句是結構化查詢語言(SQL)中用于篩選數(shù)據(jù)的關鍵字。通過WHERE子句,您可以指定一個或多個條件來限制從數(shù)據(jù)庫中檢索的數(shù)據(jù)行。
在上述中例子中我們就使用了where子句
SELECT * FROM table_name WHERE some_column = some_value;
WHERE子句可以使用以下比較運算符:
=(等于)<(小于) >(大于)<=(小于或等于)>=(大于或等于)<>或!=(不等于)
還可以使用邏輯運算符(AND、OR和NOT)來組合多個條件
eg: SELECT * FROM students WHERE sex = ‘男' and age > 23;
1)模糊搜索
在where子句中加上like或折rlike,like后加條件,但不是具體的條件,意為尋找這一類的信息
-- 多字符匹配
SELECT * FROM students WHERE clazz like 'xx%'
-- 單字符匹配
SELECT * FROM students WHERE stu_name LIKE '張_';
-- 多關鍵詞匹配:找姓名含“張”或“李”或“王”的學生
SELECT * FROM students WHERE name RLIKE '張|李|王'
-- 范圍匹配:找姓名含“張”且后面跟1-2個字符的學生(如“張三”“張三豐”)
SELECT * FROM students WHERE name RLIKE '張.{1,2}';
多字符匹配用%,通配符,意思為匹配任意多個字符,包括0個,

rlike,尋找名字里帶薛和錢的信息,|這里表示或

單字符匹配用_,只能匹配一個字符

{1,2}左右都是閉區(qū)間

2)in
返回選項中的內(nèi)容
這個也是多種情況,可以范圍滿足括號里要求的信息
select * from students where clazz in ('xx','xx','xx');3)BETWEEN AND
返回年齡在22到24的學生,是區(qū)間
select * from students where age BETWEEN 22 AND 24;
2.order by子句
ORDER BY子句用于對查詢結果按照一個或多個列進行排序。它接受一個或多個列名或表達式作為參數(shù),并可指定每個列的排序方式(ASC:升序,DESC:降序)。
ASC,DESC跟在列名后,輸出的列就會按照順序列出
SELECT 列1,列2…… FROM table_name ORDER BY 列名 ASC, 列名 ASC ... SELECT 列1,列2…… FROM table_name ORDER BY 列名 DESC, 列 DESC ...
這里我們需要注意的是,如果要求對兩列及以上進行排序,那輸出結果是優(yōu)先以第一個列先滿足排序要求,,就像這里的age我們設置的是降序,但是19在20上面是因為,stu_id是按照降序排列,20250103在20250104前面

換一種寫法,此時我們把age排序?qū)懬懊?/p>
就可以看出輸出結果是和之前不一樣的,先把年齡按照降序排列,當年齡一樣為20的時候也才會對stu_id的升序排列

3.group by子句
GROUP BY子句用于將查詢結果按照一個或多個列進行分組,并對每個組進行聚合計算(如COUNT計數(shù)、SUM求和、AVG求平均值,MAX求最大,MIN求最?。?。
SELECT column1, column2, ..., avg(column_name) FROM table_name GROUP BY column1, column2, ...
這里是按照major分組產(chǎn)生一個表格,并計算平均年齡
注意這個語句使用時要注意,select后面跟什么列group by后就要跟什么列,除了聚合列

嵌套where
嵌套where就是在原來選擇信息基礎上加上條件改變選擇那些信息,as是給這個新產(chǎn)生的表取一個名字
FROM 表名 GROUP BY column1, column2, ...) as t1 where 條件
4.having子句
HAVING子句用于對分組后的結果進行過濾,只返回符合條件的分組。它接受一個或多個聚合函數(shù)作為參數(shù),并可指定每個函數(shù)的過濾條件
SELECT column1, column2, ..., aggregate_function(column_name) FROM table_name GROUP BY column1, column2, ... HAVING 條件;
加上having過濾一下信息,只輸出品平均年齡>=20

5.limit子句
LIMIT用于限制查詢結果集的行數(shù),其中,number是你想要返回的行數(shù)。
SELECT column1, column2, ... FROM table_name LIMIT 數(shù)字;

多行查詢
-- 多行查詢 從number1起 limit number2個 SELECT column1, column2, ... FROM table_name LIMIT number1,number2;
從第2個之后開始輸出下面4個

6.offsite子句
OFFSET用于指定查詢結果集的偏移量。
其中,number是你想要返回的行數(shù),offset_num是從查詢結果集的起始位置偏移的行數(shù)。
SELECT column1, column2, ... FROM table_name LIMIT 數(shù)字 OFFSET 數(shù)字;
offset 5,表示跳過前五行開始輸出,限制4個

三、數(shù)據(jù)連接
內(nèi)連接和外連接都是把多張表的數(shù)據(jù)拼在一起,他們的區(qū)別就在于如何處理匹配補上的行
1.內(nèi)連接(只返回表間都匹配的行):join或者inner join
SELECT 列名,列名 FROM ( 表1 JOIN 表2 JOIN 表3 ON 連接點 );
select后面的列若是在兩以上都存在要寫清是哪個表格里面的列,join把獨立的表連接起來,on是表連接點

2.外連接
外連接又分為左外連接和右外連接以及全連接
left join(左表全保留,右表不匹配的補上null):
students在左邊,以students為準,所有同學都會輸出

right join(右表全保留,左表不匹配的補上null):
在scores表中添加一個信息,這個stu_id沒有對應的學生信息

這樣輸出即時students中沒有這個stu_id的學生也會輸出,但是會出現(xiàn)下面兩種情況,這是因為,我們select的表用一個stu_id列我們選擇輸出哪個表的stu_id有關,students表中可沒有20250501這個學號所以輸出當然是null,這一點容易混淆


full join(兩表的數(shù)據(jù)全顯示),但是我們的mysql是不支持full join的用法的,所以我們用union代替。union是有些復雜的相比于full join。
3.union 操作
先拼接再刪去重復行
例子幫助理解
-- 合并“成績≥90”和“成績≤60”的學生信息(UNION 自動去重) SELECT s.stu_id, s.stu_name, sc.score, su.subject_name FROM students s JOIN scores sc ON s.stu_id = sc.stu_id JOIN subjects su ON sc.subject_id = su.subject_id WHERE sc.score >= 90 UNION SELECT s.stu_id, s.stu_name, sc.score, su.subject_name FROM students s JOIN scores sc ON s.stu_id = sc.stu_id JOIN subjects su ON sc.subject_id = su.subject_id WHERE sc.score <= 60 ORDER BY score DESC;
union all操作
直接拼接結果,不做任何刪去重復行或者排序的操作
-- 添加一個student 張三 19 SELECT name FROM students WHERE age = 20 UNION ALL SELECT name FROM students WHERE age = 19;
上述是一些比較基礎的sql語言,下面系統(tǒng)的介紹sql語言
四、sql分類
1.數(shù)據(jù)查詢語言(DQL,Data Query Language)
就是sql基礎語言,用來查詢信息,但不做改動,核心關鍵字有select,from,where,group by,having,order by,limit,jion等,具體使用方法見上文
2.數(shù)據(jù)操作語言(DML, Data Manipulation Language)
用來增/刪/改數(shù)據(jù)庫中的數(shù)據(jù)信息,但不改變表結構
核心關鍵詞有insert(新增),update(修改),delete(刪除),merge(合并,部分數(shù)據(jù)庫支持)參考上文,不過MySQL不支持merge語句這里不做敘述
DML語言使用后有可用commit(提交)確認修改或者rollback進行回滾(撤銷修改),關于提交其實這個操作,因為MySQL等常見數(shù)據(jù)庫是默認打開自動提交模式,所以這些語句執(zhí)行后是會自動提交的,這時候commit不用寫
3.數(shù)據(jù)定義語言(DDL, Data Definition Language)
定義/修改/刪除數(shù)據(jù)庫對象(表,索引,視圖,觸發(fā)器,數(shù)據(jù)庫等)的結構,在MySQL(8.0之前)中操作會直接生效(無需事物提交)
首先解釋一下無需事務提交的意思,MySQL中(8.0之前)DDL語句執(zhí)行后立即生效不能回滾
DML語句(insert,update……)語句可回滾,也就是我們執(zhí)行了DML語句后可以通過ROLLBACK進行對上面語句操作的撤回,DDL就無法撤回
但不是所有DDL的操作都不能回滾,大部分情況下是這樣的,但是有些數(shù)據(jù)庫中DDL語句是可以回滾的,例如SQL Server數(shù)據(jù)庫就是可以的,而我們的MySQL在8.0版本之后部分DDL可回滾
核心關鍵字:create(創(chuàng)建),alter(修改),drop(刪除),truncate(清空表),rename(重命名)。
-- 創(chuàng)建用戶表 CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, age INT, phone VARCHAR(20) UNIQUE ); -- 給用戶表新增email字段 ALTER TABLE users ADD COLUMN email VARCHAR(100); -- 刪除用戶表 DROP TABLE users; -- 清空用戶表(刪除所有數(shù)據(jù)且不可回滾) -- TRUNCATE TABLE users;





刪之前:

刪除:

刷新后:

無users表
4.數(shù)據(jù)控制語言(DCL, Data Control Language)
管理數(shù)據(jù)庫的權限和事物,控制用戶對數(shù)據(jù)庫的訪問權限,事物提交/回滾等
核心關鍵詞有grant(授權),revoke(撤銷權限),commit(提交事務),rollback(回滾事務),savepoint(保存點),set transaction(設置事物屬性)
--創(chuàng)建用戶 CREATE USER '用戶名'@'主機名' IDENTIFIED BY '密碼' -- 授予用戶對users表的查詢/插入權限 GRANT SELECT, INSERT ON users TO '用戶'@'主機名'; -- 撤銷用戶的插入權限 REVOKE INSERT ON users FROM '用戶'@'主機名'; -- 提交事務(確認DML操作) COMMIT; -- 回滾事務(撤銷未提交的DML操作) ROLLBACK;
5.事物控制語言(TCL, Transaction Control Language )
部分sql分類中TCL會從DCL中獨立出來。專門聚焦事物管理(本質(zhì)是DCL的子集)
核心關鍵字有commit,rollback,savepoint
-- 開啟事務(部分數(shù)據(jù)庫需顯式聲明) START TRANSACTION; UPDATE users SET age = 26 WHERE id = 1; -- 設置保存點 SAVEPOINT sp1; DELETE FROM users WHERE id = 2; -- 回滾到保存點(僅撤銷刪除操作,修改操作保留) ROLLBACK TO sp1; -- 提交最終修改 COMMIT;
總結
到此這篇關于SQL常見語句的文章就介紹到這了,更多相關SQL常見語句內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
mysql8數(shù)據(jù)庫本地能連上但是遠程連不上
文章主要介紹解決數(shù)據(jù)庫遠程訪問權限問題的兩種方法:修改my.ini配置文件允許遠程連接,及檢查防火墻設置,發(fā)現(xiàn)公用網(wǎng)絡防火墻開啟后需關閉或切換為專用網(wǎng)絡以實現(xiàn)遠程訪問2025-09-09
MYSQL必知必會讀書筆記第三章之顯示數(shù)據(jù)庫
MySQL是一種開放源代碼的關系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS),MySQL數(shù)據(jù)庫系統(tǒng)使用最常用的數(shù)據(jù)庫管理語言--結構化查詢語言(SQL)進行數(shù)據(jù)庫管理。接下來通過本文給大家介紹MYSQL必知必會讀書筆記第三章之顯示數(shù)據(jù)庫,感興趣的朋友參考下吧2016-05-05

