SQL 通用語法及分類

簡介

SQL 是一門 ANSI 的標準計算機語言,用來訪問和操作數(shù)據(jù)庫系統(tǒng)。SQL 語句用于取回和更新數(shù)據(jù)庫中的數(shù)據(jù)。SQL 可與數(shù)據(jù)庫程序協(xié)同工作,比如 MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase 以及其他數(shù)據(jù)庫系統(tǒng)。

不幸地是,存在著很多不同版本的 SQL 語言,但是為了與 ANSI 標準相兼容,它們必須以相似的方式共同地來支持一些主要的關(guān)鍵詞(比如 SELECT、UPDATE、DELETE、INSERT、WHERE 等等)。

分類

SQL語言共分為四大類:

  • DDL (Data Definition Language)
    數(shù)據(jù)定義語言:用來定義數(shù)據(jù)庫對象:數(shù)據(jù)庫,表,列等。關(guān)鍵字:create,drop,alter等;

  • DML (Data Manipulation Language)
    數(shù)據(jù)操作語言:用來對數(shù)據(jù)庫中的數(shù)據(jù)進行一些簡單操作,關(guān)鍵字:insert,delete,update等;

  • DQL(Data Query Language)
    數(shù)據(jù)查詢語言:來查詢數(shù)據(jù)庫中表的記錄(數(shù)據(jù))。關(guān)鍵字:select,where等;

  • DCL(Data Control Language)
    數(shù)據(jù)控制語言:用來定義數(shù)據(jù)庫的訪問權(quán)限和安全級別;

使用

DDL

數(shù)據(jù)庫操作

//查詢所有數(shù)據(jù)庫
SHOW DATABASES
//查詢當前數(shù)據(jù)庫
SELECT DATABASE()
//創(chuàng)建數(shù)據(jù)庫
//CREATE DATABASE [IF NOT EXISTS] 數(shù)據(jù)庫名 [DEFAULT CHARSET 字符集][COLLATE 排序規(guī)則]
CREATE DATABASE test
CREATE DATABASE IF NOT EXISTS test
CREATE DATABASE IF NOT EXISTS test DEFAULT CHARSET utf8mb4
//刪除數(shù)據(jù)庫 
DROP DATABASE [IF EXISTS] 數(shù)據(jù)庫名 
DROP DATABASE IF EXISTS test
//使用
USE 數(shù)據(jù)庫名
USE test

表操作-查詢

//查詢當前數(shù)據(jù)庫所有表
SHOW TABLES
//查詢表結(jié)構(gòu)
DESC 表名
//查詢指定表的建表語句
SHOW CREATE TABLE 表名
DML

增加

//給全部字段添加數(shù)據(jù)
INSERT INTO 表名 VALUES (值1,值2,......)
INSERT INTO 表名 VALUES (NULL,"小池",19,"2342342","女")
//給指定字段添加數(shù)據(jù)
INSERT INTO 表名(字段名1,字段名2,......) VALUES (值1,值2,......)
INSERT INTO t_user (name,age,idcard,sex) VALUES ("小池池",20,"2342342","女")
//批量添加數(shù)據(jù)
INSERT INTO 表名 VALUES (值1,值2,......),(值1,值2,......),(值1,值2,......)
INSERT INTO 表名 (字段名1,字段名2,......) VALUES (值1,值2,......),(值1,值2,......),(值1,值2,......)

注意

(1. )插入數(shù)據(jù)時,指定的字段順序需要與值的順序是一一對應的 。
(2. )字符串和日期類型數(shù)據(jù)應該包含在引號中。
(3. )插入的數(shù)據(jù)大小,應該在字段的規(guī)定范圍內(nèi)。

刪除

//語法 DELETE FROM 表名 [WHERE 條件]
DELETE FROM t_user WHERE name = "小池"

注意

(1.) DELETE語句不能刪除某一個字段的值(可以使用UPDATE)。
(2.) DELETE語句的條件可以有,也可以沒有,如果沒有條件,則會刪除整張表的所有數(shù)據(jù) 。

更改

//語法 UPDATE 表名 SET 字段名1=值1,字段名2=值2,......[WHERE 條件]
UPDATE t_user SET name = "小溪" WHERE idcard = "2342342"

注意

(1.) 修改語句的條件可以有,也可以沒有,如果沒有條件,則會修改整張表的所有數(shù)據(jù)。

替換

//語法 UPDATE 表名 SET 字段名=REPLACE(字段名,需要替換的內(nèi)容,替換后的內(nèi)容) WHERE 字段名 LIKE %需要替換的內(nèi)容%

UPDATE users SET username=REPLACE(username,'張','劉')  WHERE username LIKE '%張%'
DQL

條件查詢

語法 SELECT 字段列表 FROM 表名列表 WHERE 條件列表 GROUP BY 分組字段列表 HAVING 分組后條件列表 ORDER BY 排序字段列表 LIMIT 分頁參數(shù)

//查詢 
SELECT * FROM t_user WHERE name = "小李"
//多字段查詢 
SELECT name, age FROM t_user
//去重查詢 
SELECT DISTINCT name FROM t_user
//某個字段為null
SELECT * FROM t_user WHERE idcard IS NULL
//某個字段不為null 
SELECT * FROM t_user WHERE idcard IS NOT NULL
//區(qū)間查詢 
SELECT * FROM t_user WHERE age >= 20 && age <= 30
SELECT * FROM t_user WHERE age >= 20 AND age <= 30
SELECT * FROM t_user WHERE age BETWEEN 20 AND 30
//多條件查詢 
SELECT * FROM t_user WHERE age = 12 OR age = 21 OR age = 23
SELECT * FROM t_user WHERE price IN (12,21,23)

案例

//查詢name為三個字的數(shù)據(jù) 以下劃線個數(shù)代表字數(shù)"_" 
SELECT * FROM t_user WHERE name LIKE "___"
//查詢字段idcard尾號是8的數(shù)據(jù) 
SELECT * FROM t_user WHERE idcard LIKE "%X"

聚合函數(shù)查詢

聚合函數(shù) null 值不會參與統(tǒng)計
將一列數(shù)據(jù)作為一個整體
常見聚合函數(shù):count 統(tǒng)計數(shù)量 max 最大值 min 最小值 avg 平均值 sum 求和

//統(tǒng)計表的總數(shù)據(jù)量 
SELECT COUNT(*) FROM t_user
//統(tǒng)計表中年齡最大值 
SELECT MAX(age) FROM t_user
//統(tǒng)計表中年齡最小值 
SELECT MIN(age) FROM t_user
//統(tǒng)計表中年齡平均值 
SELECT AVG(age) FROM t_user
//統(tǒng)計表中年齡總和 
SELECT SUM(age) FROM t_user
//統(tǒng)計表中“name==小覃”年齡的總和 
SELECT SUM(age) FROM t_user WHERE name="小覃"

分組查詢

SELECT 字段列表 FROM 表名 [WHERE 條件] GROUP BY 分組字段名 [HAVING 分組后過濾條件]

WHERE 與 HAVING 的區(qū)別 
(1.) 執(zhí)行時機不同:WHERE是分組之前過濾,不滿足WHERE條件不參與分組;而HAVING是分組之后對結(jié)果進行過濾 .
(2.) 判斷條件不同:WHERE不能對聚合函數(shù)進行判斷,而HAVING可以 。

注意:

(1.) 執(zhí)行順序:WHERE > 聚合函數(shù) > HAVING 。
(2.) 分組之后,查詢的字段一般為聚合函數(shù)和分組字段,查詢其他字段無任何意義 。

案例

//根據(jù)性別分組,統(tǒng)計男、女數(shù)據(jù)的數(shù)量  
SELECT sex , COUNT(*) FROM t_user GROUP BY sex
//根據(jù)性別分組,統(tǒng)計男、女員工的平均年齡  
SELECT sex , avg(age) FROM t_user GROUP BY sex
//根據(jù)性別分組,統(tǒng)計男、女員工的年齡總和  
SELECT sex , sum(age) FROM t_user GROUP BY sex
//查詢年齡小于28的員工,并根據(jù)工作地址分組,獲取員工數(shù)量大于等于3的工作地址
SELECT address,COUNT(*)  FROM t_user WHERE age < 28 GROUP BY address HAVING COUNT(*) >=3

排序查詢

ASC: 升序(默認) DESC:降序

SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1 ,字段2,排序方式2

//根據(jù)年齡對公司的員工進行升序排序
SELECT * FROM t_user order by age
//根據(jù)入職時間,對員工進行降序排序
SELECT * FROM t_user order by time DESC
//根據(jù)年齡對公司員工進行升序排序,年齡相同,再按照入職時間進行降序排序
SELECT * FROM t_user order by age ASC ,time DESC

分頁查詢

SELECT 字段列表 FROM 表名 LIMIT 起始索引,查詢記錄數(shù)

//查詢第一頁員工數(shù)據(jù),每頁展示10條記錄 
SELECT * FROM t_user LIMIT 0,10
//查詢第二頁員工數(shù)據(jù),每頁展示10條記錄 (起始索引=(查詢頁碼-1)*每頁顯示記錄數(shù))
SELECT * FROM t_user LIMIT 10,10

注意 :

1、起始索引從0開始,起始索引=(查詢頁碼-1)*每頁顯示記錄數(shù).
2、分頁查詢是數(shù)據(jù)庫的方言,不同的數(shù)據(jù)庫有不同的實現(xiàn),MySQL中是LIMIT
3、如果查詢的是第一頁數(shù)據(jù),起始索引可以省略,直接簡寫為limit 10 .

DCL

1、用戶管理

查詢用戶

USE mysql
SELECT * FROM user

創(chuàng)建用戶

CREATE USER '用戶名'@'主機名' IDENTIFIED BY '密碼'

修改用戶密碼

ALTER USER '用戶名'@'主機名' IDENTIFIED WITH mysql_native_password BY '新密碼' 

刪除用戶

DROP USER '用戶名'@'主機名'

案例

//創(chuàng)建用戶 breeze ,只能夠在當前主機localhost訪問 ,密碼是123456
CREATE USER 'breeze'@'localhost' IDENTIFIED BY '123456'
//創(chuàng)建用戶 breezeOne ,可以在任意主機訪問該數(shù)據(jù)庫 ,密碼是123456
CREATE USER 'breezeOne'@'%' IDENTIFIED BY '123456'
//修改用戶 breezeOne ,密碼是1234
ALTER USER 'breezeOne'@'%' IDENTIFIED WITH mysql_native_password BY '1234'
//刪除 breeze@localhost用戶
DROP USER 'breeze'@'localhost'

注意

這類SQL開發(fā)人員操作的比較少,主要是DBA(Database Administrator 數(shù)據(jù)庫管理員) 使用 。

2、權(quán)限控制

MySQL中定義了很多種權(quán)限,但是常用的就以下幾種:

ALL,ALL PRIVILEGES  所有權(quán)限
SELECT 查詢數(shù)據(jù)權(quán)限
INSERT 插入數(shù)據(jù)權(quán)限
UPDATE 修改數(shù)據(jù)權(quán)限
DELETE 刪除數(shù)據(jù)權(quán)限
ALTER  修改表權(quán)限
DROP   刪除數(shù)據(jù)庫/表/視圖權(quán)限
CREATE 創(chuàng)建數(shù)據(jù)庫/表權(quán)限

查詢權(quán)限

SHOW GRANTS FOR '用戶名'@'主機名'

授權(quán)權(quán)限

GRANTS 權(quán)限列表 ON 數(shù)據(jù)庫名,表名 TO '用戶名'@'主機名'
//例如
分配SSM數(shù)據(jù)庫的所有表(*)所有權(quán)限給 'breezeOne'@'%'
GRANTS ALL ON SSM.* TO 'breezeOne'@'%'

撤銷權(quán)限

REVOKE 權(quán)限列表 ON 數(shù)據(jù)庫名,表名 FROM '用戶名'@'主機名'
//例如
撤銷'breezeOne'@'%'用戶SSM數(shù)據(jù)庫的所有表(*)所有權(quán)限
REVOKE ALL ON SSM.* FROM 'breezeOne'@'%'

文章持續(xù)更新中、希望對各位有所幫助、有問題可留言 大家共同學習.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容