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


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

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

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

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

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

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+/鍵也能達(dá)到注釋的效果)

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

二、基本查詢
1.where子句
WHERE子句是結(jié)構(gòu)化查詢語言(SQL)中用于篩選數(shù)據(jù)的關(guān)鍵字。通過WHERE子句,您可以指定一個(gè)或多個(gè)條件來限制從數(shù)據(jù)庫中檢索的數(shù)據(jù)行。
在上述中例子中我們就使用了where子句
SELECT * FROM table_name WHERE some_column = some_value;
WHERE子句可以使用以下比較運(yùn)算符:
=(等于)<(小于) >(大于)<=(小于或等于)>=(大于或等于)<>或!=(不等于)
還可以使用邏輯運(yùn)算符(AND、OR和NOT)來組合多個(gè)條件
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 '張_';
-- 多關(guān)鍵詞匹配:找姓名含“張”或“李”或“王”的學(xué)生
SELECT * FROM students WHERE name RLIKE '張|李|王'
-- 范圍匹配:找姓名含“張”且后面跟1-2個(gè)字符的學(xué)生(如“張三”“張三豐”)
SELECT * FROM students WHERE name RLIKE '張.{1,2}';
多字符匹配用%,通配符,意思為匹配任意多個(gè)字符,包括0個(gè),

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

單字符匹配用_,只能匹配一個(gè)字符

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

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

換一種寫法,此時(shí)我們把a(bǔ)ge排序?qū)懬懊?/p>
就可以看出輸出結(jié)果是和之前不一樣的,先把年齡按照降序排列,當(dāng)年齡一樣為20的時(shí)候也才會(huì)對(duì)stu_id的升序排列

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

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

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

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

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

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

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

right join(右表全保留,左表不匹配的補(bǔ)上null):
在scores表中添加一個(gè)信息,這個(gè)stu_id沒有對(duì)應(yīng)的學(xué)生信息

這樣輸出即時(shí)students中沒有這個(gè)stu_id的學(xué)生也會(huì)輸出,但是會(huì)出現(xiàn)下面兩種情況,這是因?yàn)?,我們select的表用一個(gè)stu_id列我們選擇輸出哪個(gè)表的stu_id有關(guān),students表中可沒有20250501這個(gè)學(xué)號(hào)所以輸出當(dāng)然是null,這一點(diǎn)容易混淆


full join(兩表的數(shù)據(jù)全顯示),但是我們的mysql是不支持full join的用法的,所以我們用union代替。union是有些復(fù)雜的相比于full join。
3.union 操作
先拼接再刪去重復(fù)行
例子幫助理解
-- 合并“成績(jī)≥90”和“成績(jī)≤60”的學(xué)生信息(UNION 自動(dòng)去重) 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操作
直接拼接結(jié)果,不做任何刪去重復(fù)行或者排序的操作
-- 添加一個(gè)student 張三 19 SELECT name FROM students WHERE age = 20 UNION ALL SELECT name FROM students WHERE age = 19;
上述是一些比較基礎(chǔ)的sql語言,下面系統(tǒng)的介紹sql語言
四、sql分類
1.數(shù)據(jù)查詢語言(DQL,Data Query Language)
就是sql基礎(chǔ)語言,用來查詢信息,但不做改動(dòng),核心關(guān)鍵字有select,from,where,group by,having,order by,limit,jion等,具體使用方法見上文
2.數(shù)據(jù)操作語言(DML, Data Manipulation Language)
用來增/刪/改數(shù)據(jù)庫中的數(shù)據(jù)信息,但不改變表結(jié)構(gòu)
核心關(guān)鍵詞有insert(新增),update(修改),delete(刪除),merge(合并,部分?jǐn)?shù)據(jù)庫支持)參考上文,不過MySQL不支持merge語句這里不做敘述
DML語言使用后有可用commit(提交)確認(rèn)修改或者rollback進(jìn)行回滾(撤銷修改),關(guān)于提交其實(shí)這個(gè)操作,因?yàn)镸ySQL等常見數(shù)據(jù)庫是默認(rèn)打開自動(dòng)提交模式,所以這些語句執(zhí)行后是會(huì)自動(dòng)提交的,這時(shí)候commit不用寫
3.數(shù)據(jù)定義語言(DDL, Data Definition Language)
定義/修改/刪除數(shù)據(jù)庫對(duì)象(表,索引,視圖,觸發(fā)器,數(shù)據(jù)庫等)的結(jié)構(gòu),在MySQL(8.0之前)中操作會(huì)直接生效(無需事物提交)
首先解釋一下無需事務(wù)提交的意思,MySQL中(8.0之前)DDL語句執(zhí)行后立即生效不能回滾
DML語句(insert,update……)語句可回滾,也就是我們執(zhí)行了DML語句后可以通過ROLLBACK進(jìn)行對(duì)上面語句操作的撤回,DDL就無法撤回
但不是所有DDL的操作都不能回滾,大部分情況下是這樣的,但是有些數(shù)據(jù)庫中DDL語句是可以回滾的,例如SQL Server數(shù)據(jù)庫就是可以的,而我們的MySQL在8.0版本之后部分DDL可回滾
核心關(guān)鍵字: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ù)庫的權(quán)限和事物,控制用戶對(duì)數(shù)據(jù)庫的訪問權(quán)限,事物提交/回滾等
核心關(guān)鍵詞有g(shù)rant(授權(quán)),revoke(撤銷權(quán)限),commit(提交事務(wù)),rollback(回滾事務(wù)),savepoint(保存點(diǎn)),set transaction(設(shè)置事物屬性)
--創(chuàng)建用戶 CREATE USER '用戶名'@'主機(jī)名' IDENTIFIED BY '密碼' -- 授予用戶對(duì)users表的查詢/插入權(quán)限 GRANT SELECT, INSERT ON users TO '用戶'@'主機(jī)名'; -- 撤銷用戶的插入權(quán)限 REVOKE INSERT ON users FROM '用戶'@'主機(jī)名'; -- 提交事務(wù)(確認(rèn)DML操作) COMMIT; -- 回滾事務(wù)(撤銷未提交的DML操作) ROLLBACK;
5.事物控制語言(TCL, Transaction Control Language )
部分sql分類中TCL會(huì)從DCL中獨(dú)立出來。專門聚焦事物管理(本質(zhì)是DCL的子集)
核心關(guān)鍵字有commit,rollback,savepoint
-- 開啟事務(wù)(部分?jǐn)?shù)據(jù)庫需顯式聲明) START TRANSACTION; UPDATE users SET age = 26 WHERE id = 1; -- 設(shè)置保存點(diǎn) SAVEPOINT sp1; DELETE FROM users WHERE id = 2; -- 回滾到保存點(diǎn)(僅撤銷刪除操作,修改操作保留) ROLLBACK TO sp1; -- 提交最終修改 COMMIT;
總結(jié)
到此這篇關(guān)于SQL常見語句的文章就介紹到這了,更多相關(guān)SQL常見語句內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL中的引號(hào)和反引號(hào)的區(qū)別與用法詳解
這個(gè)問題是我在學(xué)習(xí)數(shù)據(jù)庫的時(shí)候遇到的一個(gè)問題,我當(dāng)時(shí)并不能理解下圖中的一些情況,后來我也請(qǐng)教了一位大佬給我解答,最后在大佬和度娘的幫助下我大概理解了這個(gè)反引號(hào)的東西2021-10-10
Sql Server數(shù)據(jù)庫遠(yuǎn)程連接訪問設(shè)置詳情
這篇文章主要介紹了Sql Server數(shù)據(jù)庫遠(yuǎn)程連接訪問設(shè)置詳情,文章圍繞主題展開詳細(xì)的內(nèi)容戒殺,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
基于Redo Log和Undo Log的MySQL崩潰恢復(fù)解析
這篇文章主要介紹了基于Redo Log和Undo Log的MySQL崩潰恢復(fù)流程,點(diǎn)進(jìn)來的小伙伴不要錯(cuò)過奧2021-08-08
MySQL Lock wait timeout exceeded錯(cuò)誤
“Lock wait timeout exceeded” 是一個(gè)常見的MySQL錯(cuò)誤,指示了潛在的性能問題或死鎖,本文就來介紹一下如何解決,感興趣的可以了解一下2024-05-05
Mysql 忘記root密碼和修改root密碼的解決方法(小結(jié))
這篇文章主要介紹了Mysql 忘記root密碼和修改root密碼的解決方法(小結(jié)),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-12-12
mysql存儲(chǔ)emoji表情報(bào)錯(cuò)的處理方法【更改編碼為utf8mb4】
這篇文章主要介紹了mysql存儲(chǔ)emoji表情報(bào)錯(cuò)的處理方法,較為詳細(xì)的分析了通過更改mysql編碼為utf8mb4解決存儲(chǔ)emoji表情報(bào)錯(cuò)的相關(guān)操作技巧,需要的朋友可以參考下2018-07-07

