1、DQL
· DQL - 介紹?
DQL英文全稱是Data Query Language(數據查詢語言),數據查詢語言,用來查詢數據表中的記錄。(在MySQL中應用是最為廣泛的)
查詢關鍵字:SELECT
· DQL - 語法?
SELECT
? ? ? ? ? ? ? ? 字段列表
FROM
? ? ? ? ? ? ? ? 表名列表
WHERE
? ? ? ? ? ? ? ? 條件列表
GROUP UP
? ? ? ? ? ? ? ? 分組字段列表
HAVING
? ? ? ? ? ? ? ? 分組后條件列表
ORDER BY
? ? ? ? ? ? ? ? 排序字段列表
LIMIT
? ? ? ? ? ? ? ? 分頁參數?
· DQL - 基礎查詢?
1、查詢多個字段
SELECT 字段1,字段2,字段3,... FROM 表名;?
SELECT * FROM 表名;?
2、設置別名(增強字段可讀性)
SELECT 字段1 [AS 別名1],字段2[AS 別名2] .... 表名;?
3、去除重復記錄
SELECT DISTINCT 字段列表 FROM 表名;?
insert into staff_table values(1,001,'張無忌','男','123456789000000000','大理','2000-12-31'),(2,002,'趙敏','女','123456789000000001','北京','2000-01-01'),(3,003,'韋小寶','男','123456789000000002','上海','2001-03-04'),(4,004,'郭峰','男','123456789000000003','天津','2004-02-19'),(5,005,'黃蓉','女','123456789000000004','廣東','2006-11-12'),(6,006,'楊過','男','123456789000000005','佛山','2004-02-14'),(7,007,'狗蛋','男','','上海','2011-01-01');
#1、查詢指定字段name,worknumber,dress,返回
select name,worknumber,dress from staff_table;
#2、查詢返回所有字段
select * from staff_table;
#盡量不要去寫*第一不直觀,第二會影響效率,遵循開發規范
#也可以這樣寫
select id,worknumber,name,gender,idcard,dress,staff_date from staff_table;
#3、查詢所有員工的工作地址,起別名
select dress as '工作地址' from staff_table;
#4、查詢員工的上班地址(不要重復)
select distinct dress '工作地址' from staff_table;
· DQL - 條件查詢
1、語法
SELECT 字段列表 FROM 表名 WHERE 條件列表;?
2、條件
比較運算符 | 功能 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
= | 等于 |
<> 或 != | 不等于 |
BETWEEN ...AND ... | 在某個范圍值之內(含最小、最大值) |
IN(...) | 在in之后的列表中的值,多選一 |
LIKE (占位符) | 模糊匹配(_匹配單個字符,%匹配任意個字符) |
IS NULL | 是NULL |
邏輯運算符 | 功能 |
AND 或 && | 并且(多個條件同時成立) |
OR 或 || | 或者(多個條件任意一個成立) |
NOT 或 ! | 非,不是 |
#1、查詢編號等于4的員工
select * from staff_table where id=4;
#2、查詢編號大于3的員工
select * from staff_table where id>3;
#3、查詢編號大于等于3的員工
select * from staff_table where id>=3;
#4、查詢沒有身份證號的員工信息
select * from staff_table where idcard is null;
#5、查詢有身份證號的員工信息
select * from staff_table where idcard is not null;
#6、查詢編號不等于4的員工信息
select * from staff_table where id!=4;
#7、查詢編號在2(包含)到6(包含)之間的信息
select * from staff_table where id between 2 and 6;
select * from staff_table where id>=2&&id<=6;
#8、查詢性別為女且編號小于等于5的員工信息
select * from staff_table where gender='女'&&id<=5;
#9、查詢編號為2或8或10的員工信息
select * from staff_table where id=2||id=8||id=10;
select * from staff_table where id(2,8,10);
#10、查詢姓名為兩個字的員工信息
select * from staff_table where name like '__';
#11、查詢身份證最后一位為X的信息
select * from staff_table where idcard like '%X';
?· DQL - 聚合函數
1、聚合函數是將一列數據作為一個整體,進行縱向計算。
2、常見聚合函數
函數 | 功能 |
count | 統計數量 |
max | 最大值 |
min | 最小值 |
avg | 平均值 |
sum | 求和 |
3、語法
SELECT 聚合函數(字段列表) FROM 表名;?
#1、統計該企業員工數量
select count(*) from staff_table;
#2、統計該企業員工編號的平均值
select avg(id) from staff_table;
#3、統計該企業員工最晚入職時間
select max(staff_date) from staff_table;
#4、統計該企業員工最早入職時間
select min(staff_date) from staff_table;
#5、統計上海地區員工編號之和
select sum(id) from staff_table where dress='上海';
注意:null值不參與運算
· DQL - 分組查詢
1、語法
SELECT 字段列表 FROM 表名 [WHERE 條件] GROUP BY?分組字段名 [HAVING 分組后過濾條件];
2、where與having的區別:
執行時機不同:where是分組之前進行過濾,不滿足where條件,不參與分組;而having是分組之后對結果進行過濾;
判斷條件不同:where不能對聚合函數進行判斷,而having可以。
#分組查詢
#1、根據性別分組,統計男員工和女員工的數量
select gender,count(*) from staff_table group by gender;
#2、根據性別分組,統計男員工與女員工的平均編號
select gender,avg(id) from staff_table group by gender;
#3、查詢編號小于5的員工,并根據工作地址分組,獲取員工數量小于等于3的工作地址
select dress,count(*) from staff_table where id<5 group by dress having count(*)<=3;
注意:
執行順序:where>聚合函數>having
分組之后,查詢的字段一般為聚合函數和分組字段,查詢其他字段無任何意義。
· DQL - 排序查詢?
1、語法
SELECT 字段列表 FROM ORDER BY 字段1 排序方式1,字段2 排序方式2;?
2、排序方式
ASC:升序(默認值)
DESC:降序?
注意:如果是多字段排序,當第一個字段值相同時,才會根據第二個字段進行排序?
#1、根據根據性別對公司員工進行升序排序
select * from staff_table order by gender;
#2、根據入職時間對員工進行降序排序
select * from staff_table order by staff_date desc;
#3、根據根據性別對員工進行升序排序,性別相同,再按照入職時間進行降序排序
select * from staff_table order by gender,staff_date desc;
· DQL - 分頁查詢?
1、語法
SELECT 字段列表 FROM 表名 LIMIT 起始索引,查詢記錄數;?
注意:
起始索引從0開始,起始索引=(查詢頁碼-1)*每頁顯示記錄數;
分頁查詢是數據庫的方言,不同的數據庫有不同的實現方式MySQL是LIMIT;
如果查詢的是第一頁的數據,起始索引可以省略,直接簡寫為limit 10。?
#1、查詢第一頁的員工數據,每頁展示3條記錄
select * from staff_table limit 3;
#2、查詢第二頁員工數據,每頁展示3條記錄
select * from staff_table limit 3,3;
#3、查詢第三頁員工信息
select * from staff_table limit 6,3;
?例題分析:
#1、查詢編號為2,3,4的女員工信息
select * from staff_table where id in(2,3,4)&&gender='女';
#2、查詢性別為男,并且編號在2~6(含)以內姓名為三個字的員工
select * from staff_table where gender='男'&&id between 2 and 6&&name like '___';
#3、統計員工表中,編號小于4的,男性員工與女性員工的人數
select gender,count(*) from staff_table where id<4 group by gender;
#4、查詢所有編號小于5的員工的姓名和編號,并對查詢結果按性別升序排序,如果性別相同按入職時間降序排序
select name,id from staff_table where id<5 order by gender,staff_date desc;
#5、查詢性別為男,且編號在2~5(含)以內的前兩個員工信息,查詢結果按性別升序排序,如果性別相同按入職時間降序排序
select * from staff_table where gender='男'&&id between 2 and 5 order by gender,staff_date desc limit 2;
· DQL - 執行順序
首先執行FROM來決定要查詢的是哪張表的數據緊接著通過where來指定查詢條件第三步通過group by以及having來指定分組以及分組以后的條件第四步決定我們查詢要返回哪些字段,執行SELECT,再往下就是order by以及limit。
2、DCL?
1、介紹
DCL英文全稱是Date Control Language(數據控制語句),用來管理數據庫用戶、控制數據庫的訪問權限。
· DCL - 用戶管理
1、查詢用戶
USE mysql;
SELECT * FROM user;?
2、創建用戶
CREATE USER '用戶名'@'主機名' IDENTIFIED BY '密碼';?
3、修改用戶密碼
ALTER USER??'用戶名'@'主機名' IDENTIFIED WITH mysql_native_password BY '新密碼';
4、刪除用戶
DROP USER??'用戶名'@'主機名';?
#1、創建用戶名為test,只能在主機localhost訪問,密碼123456
create user 'test'@'localhost' identified by '123456';
#2、創建用戶xiaodu,可以在任意主機訪問密碼為123456
create user 'xiaodu'@'%' identified by '123456';
#3、修改用戶xiaodu的訪問密碼為 1234
alter user 'xiaodu'@'%' identified with mysql_native_password by '1234';
#4、刪除test@localhost用戶
drop user 'xiaodu'@'%';
注意:
主機名可以用%通配;
這類SQL開發人員操作的比較少,主要是DBA(數據庫管理員)使用。
· DCL - 權限控制
權限 | 說明 |
ALL,ALL PRIVILEGES | 所有權限 |
SELECT | 查詢數據 |
INSERT | 插入數據 |
UPDATE | 修改數據 |
DELETE | 刪除數據 |
ALTER | 修改表 |
DROP | 刪除數據庫/表/視圖 |
CREATE | 創建數據庫/表 |
1、查詢權限
SHOW GRANTS FOR?'用戶名'@'主機名';
2、授予權限?
?GRANT 權限列表 ON 數據庫名.表名 TO?'用戶名'@'主機名';
?3、撤銷權限
?REVOKE 權限列表 ON 數據庫名.表名 FROM?'用戶名'@'主機名';
#查詢權限
show grants for 'test'@'localhost';
#授予權限
grant all on test.* to 'test'@'localhost';
#撤銷權限
revoke all on test.* from 'test'@'localhost';
?