簡介
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ù)更新中、希望對各位有所幫助、有問題可留言 大家共同學習.