MySQL8_SQL語法 SQL 全稱 Structured Query Language,結構化查詢語言。操作關係型資料庫的編程語言,定義了一套操作關係型資料庫統一標準 。 一、SQL通用語法 在學習具體的SQL語句之前,先來瞭解一下SQL語言的同於語法。 1). SQL語句可以單行或多行書寫,以 ...
MySQL8_SQL語法
SQL 全稱 Structured Query Language,結構化查詢語言。操作關係型資料庫的編程語言,定義了一套操作關係型資料庫統一標準 。
一、SQL通用語法
在學習具體的SQL語句之前,先來瞭解一下SQL語言的同於語法。
1). SQL語句可以單行或多行書寫,以分號結尾。
2). SQL語句可以使用空格/縮進來增強語句的可讀性。
3). MySQL資料庫的SQL語句不區分大小寫,關鍵字建議使用大寫。
4). 註釋:
單行註釋:-- 註釋內容 或 # 註釋內容
多行註釋:/* 註釋內容 */
二、SQL分類
SQL語句,根據其功能,主要分為四類:DDL、DML、DQL、DCL。
分類 | 全稱 | 說明 |
DDL | Data Definition Language | 數據定義語言,用來定義資料庫對象(資料庫,表欄位) |
DML | Data Manipulation Language | 數據操作語言,用來對資料庫表中的數據進行增刪改 |
DQL | Data Query Language | 數據查詢語言,用來查詢資料庫中表的記錄 |
DCL | Data Control Language | 數據控制語言,用來創建資料庫用戶、控制資料庫的訪問許可權 |
三、DDL
Data Definition Language,數據定義語言,用來定義資料庫對象(資料庫,表,欄位) 。
1、資料庫操作
1). 查詢所有資料庫
show databases;
2). 查詢當前資料庫
select database();
3). 創建資料庫
create database [ if not exists ] 資料庫名 [ default charset 字元集 ] [ collate 排序規則 ] ;
案例:
A. 創建一個itcast資料庫, 使用資料庫預設的字元集。
create database itcast;
註意:在同一個資料庫伺服器中,不能創建兩個名稱相同的資料庫,否則將會報錯。
可以通過if not exists 參數來解決這個問題,資料庫不存在, 則創建該資料庫,如果存在,則不創建。
create database if not extists itcast;
B. 創建一個itlog資料庫,並且指定字元集。
create database itlog default 1 charset utf8mb4;
4). 刪除資料庫
drop database [ if exists ] 資料庫名 ;
如果刪除一個不存在的資料庫,將會報錯。此時,可以加上參數 if exists ,如果資料庫存在,再執行刪除,否則不執行刪除。
5). 切換資料庫
use 資料庫名 ;
我們要操作某一個資料庫下的表時,就需要通過該指令,切換到對應的資料庫下,否則是不能操作的。
比如,切換到itcast數據,執行如下SQL:
use itcast;
2、表操作
2.1、表操作-查詢創建
1). 查詢當前資料庫所有表
show tables;
比如,我們可以切換到sys這個系統資料庫,並查看系統資料庫中的所有表結構。
use sys;
show tables;
2). 查看指定表結構
desc 表名 ;
通過這條指令,我們可以查看到指定表的欄位,欄位的類型、是否可以為NULL,是否存在預設值等信息。
3). 查詢指定表的建表語句
show create table 表名 ;
通過這條指令,主要是用來查看建表語句的,而有部分參數我們在創建表的時候,並未指定也會查詢到,因為這部分是資料庫的預設值,如:存儲引擎、字元集等。
4). 創建表結構
CREATE TABLE 表名(
欄位1 欄位1類型 [ COMMENT 欄位1註釋 ],
欄位2 欄位2類型 [COMMENT 欄位2註釋 ],
欄位3 欄位3類型 [COMMENT 欄位3註釋 ],
......
欄位n 欄位n類型 [COMMENT 欄位n註釋 ]
) [ COMMENT 表註釋 ] ;
註意: [...] 內為可選參數,最後一個欄位後面沒有逗號
案例:
我們創建一張表 tb_user ,對應的結構如下,那麼建表語句為:
id | name | age | gender |
1 | 張三 | 22 | 男 |
2 | 李四 | 28 | 女 |
create table tb_user(
id int comment '編號',
name varchar(50) comment '姓名',
age int comment '年齡',
gender varchar(1) comment '性別'
) comment '用戶表';
2.2、表操作-數據類型
在上述的建表語句中,我們在指定欄位的數據類型時,用到了int ,varchar,那麼在MySQL中除了以上的數據類型,還有哪些常見的數據類型呢?
接下來,我們就來詳細介紹一下MySQL的數據類型。MySQL中的數據類型有很多,主要分為三類:數值類型、字元串類型、日期時間類型。
1). 數值類型
類型 | 大小 | 有符號範圍(SIGNED) | 無符號範圍(UNSIGNED) | 描述 |
TINYINT | 1byte | (-128,127) | (0,255) | 小整數值 |
SMALLINT | 2bytes | (-32768,32767) | (0,65535) | 大整數值 |
MEDIUMINT | 3bytes | (-8388608,8388607) | (0,16777215) | 大整數值 |
INT/INTEGER | 4bytes | (-2147483648,2147483647) | (0,4294967295) | 大整數值 |
BIGINT | 8bytes | (-2^63,2^63-1) | (0,2^64-1) | 極大整數值 |
FLOAT | 4bytes | (-3.402823466 E+38, 3.402823466351 E+38) |
0 和 (1.175494351 E- 38,3.402823466 E+38) |
單精度浮點數值 |
DOUBLE | 8bytes | (-1.7976931348623157E+308, 1.7976931348623157E+308) |
0 和(2.2250738585072014E-308, 1.7976931348623157E+308) |
雙精度浮點數值 |
DECIMAL | 依賴於M(精度)和D(標度)的值 | 依賴於M(精度)和D(標度)的值 | 小數值(精確定點數) |
案例:
1). 年齡欄位 -- 不會出現負數, 而且人的年齡不會太大
age tinyint unsigned
2). 分數 -- 總分100分, 最多出現一位小數
score double(4,1)
2). 字元串類型、
類型 | 大小 | 描述 |
CHAR | 0-255 bytes | 定長字元串(需要指定長度) |
VARCHAR | 0-65535 bytes | 變長字元串(需要指定長度) |
TINYBLOB | 0-255 bytes | 不超過255個字元的二進位數據 |
TINYTEXT | 0-255 bytes | 短文本字元串 |
BLOB | 0-65535 bytes | 二進位形式的長文本數據 |
TEXT | 0-65535 bytes | 長文本數據 |
MEDIUMBLOB | 0-16 777 215 bytes | 二進位形式的中等長度文本數據 |
MEDIUMTEXT | 0-16 777 215 bytes | 中等長度文本數據 |
LONGBLOB | 0-4 294 967 295 bytes | 二進位形式的極大文本數據 |
LONGTEXT | 0-4 294 967 295 bytes | 極大文本數據 |
註意:char 與 varchar 都可以描述字元串,char是定長字元串,指定長度多長,就占用多少個字元,和欄位值的長度無關 。而varchar是變長字元串,指定的長度為最大占用長度 。相對來說,char的性能會更高些。
如:
1). 用戶名 username ------> 長度不定, 最長不會超過50
username varchar(50)
2). 性別 gender ---------> 存儲值, 不是男,就是女
gender char(1)
3). 手機號 phone --------> 固定長度為11
phone char(11)
3). 日期時間類型
類型 | 大小 | 範圍 | 格式 | 描述 |
DATE | 3 | 1000-01-01 至 9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | -838:59:59 至 838:59:59 | HH:MM:SS | 時間值或持續時間 |
YEAR | 1 | 1901 至 2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00 至 9999-12-31 23:59:59 |
YYYY-MM-DD HH:MM:SS |
混合日期和時間值 |
TIMESTAMP | 4 | 1970-01-01 00:00:01 至 2038-01-19 03:14:07 |
YYYY-MM-DD HH:MM:SS |
混合日期和時間值,時間戳 |
如:
1). 生日欄位 birthday
birthday date
2). 創建時間 createtime
createtime datetime
2.3、表操作-案例
設計一張員工信息表,要求如下:
1. 編號(純數字)
2. 員工工號 (字元串類型,長度不超過10位)
3. 員工姓名(字元串類型,長度不超過10位)
4. 性別(男/女,存儲一個漢字)
5. 年齡(正常人年齡,不可能存儲負數)
6. 身份證號(二代身份證號均為18位,身份證中有X這樣的字元)
7. 入職時間(取值年月日即可)
對應的建表語句如下:
create table emp(
id int comment '編號',
workno varchar(10) comment '工號',
name varchar(10) comment '姓名',
gender char(1) comment '性別',
age tinyint unsigned comment '年齡',
idcard char(18) comment '身份證號',
entrydate date comment '入職時間'
) comment '員工表';
SQL語句編寫完畢之後,就可以在MySQL的命令行中執行SQL,然後也可以通過 desc 指令查詢表結構信息:
表結構創建好了,裡面的name欄位是varchar類型,最大長度為10,也就意味著如果超過10將會報錯。如果我們想修改這個欄位的類型 或 修改欄位的長度該如何操作呢?接下來DDL語句中,如何操作表欄位。
2.4、表操作-修改
1). 添加欄位
ALTER TABLE 表名 ADD 欄位名 類型 (長度) [ COMMENT 1 註釋 ] [ 約束 ];
案例:為emp表增加一個新的欄位”昵稱”為nickname,類型為varchar(20)
ALTER TABLE emp ADD nickname varchar(20) COMMENT '昵稱';
2). 修改數據類型
ALTER TABLE 表名 MODIFY 欄位名 新數據類型 (長度);
3). 修改欄位名和欄位類型
ALTER TABLE 表名 CHANGE 舊欄位名 新欄位名 類型 (長度) [ COMMENT 註釋 ] [ 約束 ];
案例:將emp表的nickname欄位修改為username,類型為varchar(30)
ALTER TABLE emp CHANGE nickname username varchar(30) COMMENT '昵稱';
4). 刪除欄位
ALTER TABLE 表名 DROP 欄位名;
案例:將emp表的欄位username刪除
ALTER TABLE emp DROP username;
5). 修改表名
ALTER TABLE 表名 RENAME TO 新表名;
案例:將emp表的表名修改為 employee
ALTER TABLE emp RENAME TO employee;
2.5、表操作-刪除
1). 刪除表
DROP TABLE [ IF EXISTS ] 表名;
可選項 IF EXISTS 代表,只有表名存在時才會刪除該表,表名不存在,則不執行刪除操作(如果不加該參數項,刪除一張不存在的表,執行將會報錯)。
案例:如果tb_user表存在,則刪除tb_user表
DROP TABLE IF EXISTS tb_user;
2). 刪除指定表, 並重新創建表
TRUNCATE TABLE 表名;
註意: 在刪除表的時候,表中的全部數據也都會被刪除。
四、圖形化界面工具
上述,我們已經講解了通過DDL語句,如何操作資料庫、操作表、操作表中的欄位,而通過DDL語句執行在命令進行操作,主要存在以下兩點問題:
1).會影響開發效率 ;
2). 使用起來,並不直觀,並不方便 ;
所以呢,我們在日常的開發中,會藉助於MySQL的圖形化界面,來簡化開發,提高開發效率。而目前mysql主流的圖形化界面工具,有以下幾種:
1、安裝
1). 準備好安裝包datagrip,雙擊開始安裝
2). 點擊next,一步一步的完成安裝
選擇DataGrip的安裝目錄,然後選擇下一步
下一步,執行安裝
2、使用
1). 添加數據源
參考圖示, 一步步操作即可
配置以及驅動jar包下載完畢之後,就可以點擊 "Test Connection" 就可以測試,是否可以連接MySQL,如果出現 "Successed",就表名連接成功了 。
2). 展示所有資料庫
連接上了MySQL服務之後,並未展示出所有的資料庫,此時,我們需要設置,展示所有的資料庫,具體操作如下:
3). 創建資料庫
註意:
以下兩種方式都可以創建資料庫:
A. create database db01;
B. create schema db01;
4). 創建表
在指定的資料庫上面右鍵,選擇new --> Table
5). 修改表結構
在需要修改的表上,右鍵選擇 "Modify Table..."
如果想增加欄位,直接點擊+號,錄入欄位信息,然後點擊Execute即可。
如果想刪除欄位,直接點擊-號,就可以刪除欄位,然後點擊Execute即可。
如果想修改欄位,雙擊對應的欄位,修改欄位信息,然後點擊Execute即可。
如果要修改表名,或表的註釋,直接在輸入框修改,然後點擊Execute即可。
6). 在DataGrip中執行SQL語句
在指定的資料庫上,右鍵,選擇 New --> Query Console
然後就可以在打開的Query Console控制台,併在控制臺中編寫SQL,執行SQL。
五、DML
DML英文全稱是Data Manipulation Language(數據操作語言),用來對資料庫中表的數據記錄進行增、刪、改操作。
添加數據(INSERT)
修改數據(UPDATE)
刪除數據(DELETE)
1、添加數據
1). 給指定欄位添加數據
INSERT INTO 表名 (欄位名1, 欄位名2, ...) VALUES (值1, 值2, ...);
案例1: 給employee表所有的欄位添加數據 ;
insert into employee(id,workno,name,gender,age,idcard,entrydate) values(1,'1','Itcast','男',10,'123456789012345678','2000-01-01');
插入數據完成之後,我們有兩種方式,查詢資料庫的數據:
A. 方式一
在左側的表名上雙擊,就可以查看這張表的數據。
B. 方式二
可以直接一條查詢數據的SQL語句, 語句如下:
select * from employee;
案例2: 給employee表所有的欄位添加數據
執行如下SQL,添加的年齡欄位值為-1。
insert into employee(id,workno,name,gender,age,idcard,entrydate) values(1,'1','Itcast','男',-1,'123456789012345678','2000-01-01');
執行上述的SQL語句時,報錯了,具體的錯誤信息如下:
因為 employee 表的age欄位類型為 tinyint,而且還是無符號的 unsigned ,所以取值只能在0-255 之間。
2). 給全部欄位添加數據
INSERT INTO 表名 VALUES (值1, 值2, ...);
案例:插入數據到employee表,具體的SQL如下:
insert into employee values(2,'2','張無忌','男',18,'123456789012345670','2005-01-01');
3). 批量添加數據
INSERT INTO 表名 (欄位名1, 欄位名2, ...) VALUES (值1, 值2, ...), (值1, 值2, ...), (值1, 值2, ...) ;
INSERT INTO 表名 VALUES (值1, 值2, ...), (值1, 值2, ...), (值1, 值2, ...) ;
案例:批量插入數據到employee表,具體的SQL如下:
insert into employee
values(3,'3','韋一笑','男',38,'123456789012345670','2005-01-01'),
(4,'4','趙敏','女',18,'123456789012345670','2005-01-01');
註意事項:
• 插入數據時,指定的欄位順序需要與值的順序是一一對應的。
• 字元串和日期型數據應該包含在引號中。
• 插入的數據大小,應該在欄位的規定範圍內。
2、修改數據
修改數據的具體語法為:
UPDATE 表名 SET 欄位名1 = 值1 , 欄位名2 = 值2 , .... [ WHERE 條件 ] ;
案例:
A. 修改id為1的數據,將name修改為itlog
update employee set name = 'itlog' where id = 1;
B. 修改id為1的數據, 將name修改為小昭, gender修改為 女
update employee set name = '小昭' , gender = '女' where id = 1;
C. 將所有的員工入職日期修改為 2008-01-01
update employee set entrydate = '2008-01-01';
註意事項:修改語句的條件可以有,也可以沒有,如果沒有條件,則會修改整張表的所有數據。
3、刪除數據
刪除數據的具體語法為:
DELETE FROM 表名 [ WHERE 條件 ] ;
案例:
A. 刪除gender為女的員工
delete from employee where gender = '女';
B. 刪除所有員工
delete from employee;
註意事項:
• DELETE 語句的條件可以有,也可以沒有,如果沒有條件,則會刪除整張表的所有數據。
• DELETE 語句不能刪除某一個欄位的值(可以使用UPDATE,將該欄位值置為NULL即可)。
• 當進行刪除全部數據操作時,datagrip會提示我們,詢問是否確認刪除,我們直接點擊Execute即可。
六、DQL
DQL英文全稱是Data Query Language(數據查詢語言),數據查詢語言,用來查詢資料庫中表的記錄。
查詢關鍵字: SELECT
在一個正常的業務系統中,查詢操作的頻次是要遠高於增刪改的,當我們去訪問企業官網、電商網站,在這些網站中我們所看到的數據,實際都是需要從資料庫中查詢並展示的。而且在查詢的過程中,可能還會涉及到條件、排序、分頁等操作。
那麼,本小節我們主要學習的就是如何進行數據的查詢操作。 我們先來完成如下數據準備工作:
刪除employee表
drop table if exists employee;
創建emp表
create table emp(
id int comment '編號',
workno varchar(10) comment '工號',
name varchar(10) comment '姓名',
gender char(1) comment '性別',
age tinyint unsigned comment '年齡',
idcard char(18) comment '身份證號',
workaddress varchar(50) comment '工作地址',
entrydate date comment '入職時間'
)comment '員工表';
插入數據
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (1, '00001', '柳岩666', '女', 20, '123456789012345678', '北京', '2000-01-01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (2, '00002', '張無忌', '男', 18, '123456789012345670', '北京', '2005-09-01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (3, '00003', '韋一笑', '男', 38, '123456789712345670', '上海', '2005-08-01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (4, '00004', '趙敏', '女', 18, '123456757123845670', '北京', '2009-12-01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (5, '00005', '小昭', '女', 16, '123456769012345678', '上海', '2007-07-01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (6, '00006', '楊逍', '男', 28, '12345678931234567X', '北京', '2006-01-01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (7, '00007', '範瑤', '男', 40, '123456789212345670', '北京', '2005-05-01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (8, '00008', '黛綺絲', '女', 38, '123456157123645670', '天津', '2015-05-01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (9, '00009', '範涼涼', '女', 45, '123156789012345678', '北京', '2010-04-01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (10, '00010', '陳友諒', '男', 53, '123456789012345670', '上海', '2011-01-01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (11, '00011', '張士誠', '男', 55, '123567897123465670', '江蘇', '2015-05-01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (12, '00012', '常遇春', '男', 32, '123446757152345670', '北京', '2004-02-01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (13, '00013', '張三豐', '男', 88, '123656789012345678', '江蘇', '2020-11-01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (14, '00014', '滅絕', '女', 65, '123456719012345670', '西安', '2019-05-01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (15, '00015', '胡青牛', '男', 70, '12345674971234567X', '西安', '2018-04-01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (16, '00016', '周芷若', '女', 18, null, '北京', '2012-06-01');
1、基本語法
DQL 查詢語句,語法結構如下:
SELECT
欄位列表
FROM
表名列表
WHERE
條件列表
GROUP BY
分組欄位列表
HAVING
分組後條件列表
ORDER BY
排序欄位列表
LIMIT
分頁參數
將上面的完整語法進行拆分,分為以下幾個部分:
基本查詢(不帶任何條件)
條件查詢(WHERE)
聚合函數(count、max、min、avg、sum)
分組查詢(group by)
排序查詢(order by)
分頁查詢(limit)
2、基礎查詢
在基本查詢的DQL語句中,不帶任何的查詢條件,查詢的語法如下:
1). 查詢多個欄位
SELECT 欄位1, 欄位2, 欄位3 ... FROM 表名 ;
SELECT * FROM 表名 ;
註意 : * 號代表查詢所有欄位,在實際開發中儘量少用(不直觀、影響效率)。
2). 欄位設置別名
SELECT 欄位1 [ AS 別名1 ] , 欄位2 [ AS 別名2 ] ... FROM 表名;
SELECT 欄位1 [ 別名1 ] , 欄位2 [ 別名2 ] ... FROM 表名;
3). 去除重覆記錄
SELECT DISTINCT 欄位列表 FROM 表名;
案例:
A. 查詢指定欄位 name, workno, age並返回
select name,workno,age from emp;
B. 查詢返回所有欄位
select id ,workno,name,gender,age,idcard,workaddress,entrydate from emp;
select * from emp;
C. 查詢所有員工的工作地址,起別名
select workaddress as '工作地址' from emp;
-- as可以省略
select workaddress '工作地址' from emp;
D. 查詢公司員工的上班地址有哪些(不要重覆)
select distinct workaddress '工作地址' from emp;
3、條件查詢
1). 語法
SELECT 欄位列表 FROM 表名 WHERE 條件列表 ;
2). 條件
常用的比較運算符如下:
比較運算符 | 功能 |
> | 大於 |
>= | 大於等於 |
< | 小於 |
<= | 小於等於 |
= | 等於 |
<> 或 != | 不等於 |
BETWEEN ... AND ... | 在某個範圍之內(含最小、最大值) |
IN(...) | 在in之後的列表中的值,多選一 |
LIKE 占位符 | 模糊匹配(_匹配單個字元, %匹配任意個字元) |
IS NULL | 是NULL |
常用的邏輯運算符如下:
邏輯運算符 | 功能 |
AND 或 && | 並且 (多個條件同時成立) |
OR 或 || | 或者 (多個條件任意一個成立) |
NOT 或 ! | 非 , 不是 |
案例:
A. 查詢年齡等於 88 的員工
select * from emp where age = 88;
B. 查詢年齡小於 20 的員工信息
select * from emp where age < 20;
C. 查詢年齡小於等於 20 的員工信息
select * from emp where age <= 20;
D. 查詢沒有身份證號的員工信息
select * from emp where idcard is null;
E. 查詢有身份證號的員工信息
select * from emp where idcard is not null;
F. 查詢年齡不等於 88 的員工信息
select * from emp where age != 88;
select * from emp where age <> 88;
G. 查詢年齡在15歲(包含) 到 20歲(包含)之間的員工信息
select * from emp where age >= 15 && age <= 20;
select * from emp where age >= 15 and age <= 20;
select * from emp where age between 15 and 20;
H. 查詢性別為 女 且年齡小於 25歲的員工信息
select * from emp where gender = '女' and age < 25;
I. 查詢年齡等於18 或 20 或 40 的員工信息
select * from emp where age = 18 or age = 20 or age =40;
select * from emp where age in(18,20,40);
J. 查詢姓名為兩個字的員工信息 _ %
select * from emp where name like '__';
K. 查詢身份證號最後一位是X的員工信息
select * from emp where idcard like '%X';
select * from emp where idcard like '_________________X';
4、聚合函數
1). 介紹
將一列數據作為一個整體,進行縱向計算 。
2). 常見的聚合函數
函數 | 功能 |
count | 統計數量 |
max | 最大值 |
min | 最小值 |
avg | 平均值 |
sum | 求和 |
3). 語法
SELECT 聚合函數(欄位列表) FROM 表名 ;
註意 : NULL值是不參與所有聚合函數運算的。
案例:
A. 統計該企業員工數量
select count(*) from emp; -- 統計的是總記錄數
select count(idcard) from emp; -- 統計的是idcard欄位不為null的記錄數
對於count聚合函數,統計符合條件的總記錄數,還可以通過 count(數字/字元串)的形式進行統計查詢,比如:
select count(1) from emp;
B. 統計該企業員工的平均年齡
select avg(age) from emp;
C. 統計該企業員工的最大年齡
select max(age) from emp;
D. 統計該企業員工的最小年齡
select min(age) from emp;
E. 統計西安地區員工的年齡之和
select sum(age) from emp where workaddress = '西安';
5、分組查詢
1). 語法
SELECT 欄位列表 FROM 表名 [ WHERE 條件 ] GROUP BY 分組欄位名 [ HAVING 分組後過濾條件 ];
2). where與having區別
- 執行時機不同:where是分組之前進行過濾,不滿足where條件,不參與分組;而having是分組之後對結果進行過濾。
- 判斷條件不同:where不能對聚合函數進行判斷,而having可以。
註意事項:
- 分組之後,查詢的字
段一般為聚合函數和分組欄位,查詢其他欄位無任何意義。select workaddress, gender, count(*) '數量' from emp group by gender , workaddress;
- 執行順序: where > 聚合函數 > having 。
- 支持多欄位分組, 具體語法為 : group by columnA,columnB
案例:
A. 根據性別分組 , 統計男性員工 和 女性員工的數量
select gender, count(*) from emp group by gender ;
B. 根據性別分組 , 統計男性員工 和 女性員工的平均年齡
select gender, avg(age) from emp group by gender ;
C. 查詢年齡小於45的員工 , 並根據工作地址分組 , 獲取員工數量大於等於3的工作地址
select workaddress, count(*) address_count from emp where age < 45 group by workaddress having address_count >= 3;
D. 統計各個工作地址上班的男性及女性員工的數量
select workaddress, gender, count(*) '數量' from emp group by gender , workaddress;
6、排序查詢
排序在日常開發中是非常常見的一個操作,有升序排序,也有降序排序。
1). 語法
SELECT 欄位列表 FROM 表名 ORDER BY 欄位1 排序方式1 , 欄位2 排序方式2 ;
2). 排序方式
- ASC : 升序(預設值)
- DESC: 降序
註意事項:
- 如果是升序, 可以不指定排序方式ASC ;
- 如果是多欄位排序,當第一個欄位值相同時,才會根據第二個欄位進行排序 ;
案例:
A. 根據年齡對公司的員工進行升序排序
select * from emp order by age asc;
select * from emp order by age;
B. 根據入職時間, 對員工進行降序排序
select * from emp order by entrydate desc;
C. 根據年齡對公司的員工進行升序排序 , 年齡相同 , 再按照入職時間進行降序排序
select * from emp order by age asc , entrydate desc;
7、分頁查詢
分頁操作在業務系統開發時,也是非常常見的一個功能,我們在網站中看到的各種各樣的分頁條,後臺都需要藉助於資料庫的分頁操作。
1). 語法
SELECT 欄位列表 FROM 表名 LIMIT 起始索引, 查詢記錄數 ;
註意事項:
- 起始索引從0開始,起始索引 = (查詢頁碼 - 1)* 每頁顯示記錄數。
- 分頁查詢是資料庫的方言,不同的資料庫有不同的實現,MySQL中是LIMIT。
- 如果查詢的是第一頁數據,起始索引可以省略,直接簡寫為 limit 10。
案例:
A. 查詢第1頁員工數據, 每頁展示10條記錄
select * from emp limit 0,10;
select * from emp limit 10;
B. 查詢第2頁員工數據, 每頁展示10條記錄 --------> (頁碼-1)*頁展示記錄數
select * from emp limit 10,10;
8、案例
1). 查詢年齡為20,21,22,23歲的員工信息。
select * from emp where gender = '女' and age in(20,21,22,23);
2). 查詢性別為 男 ,並且年齡在 20-40 歲(含)以內的姓名為三個字的員工。
select * from emp where gender = '男' and ( age between 20 and 40 ) and name like '___';
3). 統計員工表中, 年齡小於60歲的 , 男性員工和女性員工的人數。
select gender, count(*) from emp where age < 60 group by gender;
4). 查詢所有年齡小於等於35歲員工的姓名和年齡,並對查詢結果按年齡升序排序,如果年齡相同按入職時間降序排序。
select name , age from emp where age <= 35 order by age asc , entrydate desc;
5). 查詢性別為男,且年齡在20-40 歲(含)以內的前5個員工信息,對查詢的結果按年齡升序排序,年齡相同按入職時間升序排序。
select * from emp where gender = '男' and age between 20 and 40 order by age asc , entrydate asc limit 5 ;
9、執行順序
在講解DQL語句的具體語法之前,我們已經講解了DQL語句的完整語法,及編寫順序,接下來,我們要來說明的是DQL語句在執行時的執行順序,也就是先執行那一部分,後執行那一部分。
驗證:
查詢年齡大於15的員工姓名、年齡,並根據年齡進行升序排序。
select name , age from emp where age > 15 order by age asc;
在查詢時,我們給emp表起一個別名 e,然後在select 及 where中使用該別名。
select e.name , e.age from emp e where e.age > 15 order by age asc;
執行上述SQL語句後,我們看到依然可以正常的查詢到結果,此時就說明: from 先執行, 然後where 和 select 執行。那 where 和 select 到底哪個先執行呢?
此時,此時我們可以給select後面的欄位起別名,然後在 where 中使用這個別名,然後看看是否可以執行成功。
select e.name ename , e.age eage from emp e where eage > 15 order by age asc;
執行上述SQL報錯了:
由此我們可以得出結論: from 先執行,然後執行 where , 再執行select 。
接下來,我們再執行如下SQL語句,查看執行效果:
select e.name ename , e.age eage from emp e where e.age > 15 order by eage asc;
結果執行成功。 那麼也就驗證了: order by 是在select 語句之後執行的。
綜上所述,我們可以看到DQL語句的執行順序為: from ... where ... group by ... having ... select ... order by ... limit ...
七、DCL
DCL英文全稱是Data Control Language(數據控制語言),用來管理資料庫用戶、控制資料庫的訪問許可權。
1、管理用戶
1). 查詢用戶
select * from mysql.user;
查詢的結果如下:
其中 Host代表當前用戶訪問的主機, 如果為localhost, 僅代表只能夠在當前本機訪問,是不可以遠程訪問的。 User代表的是訪問該資料庫的用戶名。在MySQL中需要通過Host和User來唯一標識一個用戶。
2). 創建用戶
CREATE USER '用戶名'@'主機名' IDENTIFIED BY '密碼';
3). 修改用戶密碼
ALTER USER '用戶名'@'主機名' IDENTIFIED WITH mysql_native_password BY '新密碼' ;
4). 刪除用戶
DROP USER '用戶名'@'主機名' ;
註意事項:
- 在MySQL中需要通過用戶名@主機名的方式,來唯一標識一個用戶。
- 主機名可以使用 % 通配。
- 這類SQL開發人員操作的比較少,主要是DBA( Database Administrator 資料庫管理員)使用。
案例:
A. 創建用戶itcast, 只能夠在當前主機localhost訪問, 密碼123456;
create user 'itcast'@'localhost' identified by '123456';
B. 創建用戶heima, 可以在任意主機訪問該資料庫, 密碼123456;
create user 'heima'@'%' identified by '123456';
C. 修改用戶heima的訪問密碼為1234;
alter user 'heima'@'%' identified with mysql_native_password by '1234';
D. 刪除 itcast@localhost 用戶
drop user 'itcast'@'localhost';
2、許可權控制
MySQL中定義了很多種許可權,但是常用的就以下幾種:
許可權 | 說明 |
ALL, ALL PRIVILEGES | 所有許可權 |
SELECT | 查詢數據 |
INSERT | 插入數據 |
UPDATE | 修改數據 |
DELETE | 刪除數據 |
ALTER | 修改表 |
DROP | 刪除資料庫/表/視圖 |
CREATE | 創建資料庫/表 |
上述只是簡單羅列了常見的幾種許可權描述,其他許可權描述及含義,可以直接參考官方文檔
1). 查詢許可權
SHOW GRANTS FOR '用戶名'@'主機名' ;
2). 授予許可權
GRANT 許可權列表 ON 資料庫名.表名 TO '用戶名'@'主機名';
3). 撤銷許可權
REVOKE 許可權列表 ON 資料庫名.表名 FROM '用戶名'@'主機名';
註意事項:
- 多個許可權之間,使用逗號分隔
- 授權時, 資料庫名和表名可以使用 * 進行通配,代表所有。
案例:
A. 查詢 'heima'@'%' 用戶的許可權
show grants for 'heima'@'%';
B. 授予 'heima'@'%' 用戶itcast資料庫所有表的所有操作許可權
grant all on itcast.* to 'heima'@'%';
C. 撤銷 'heima'@'%' 用戶的itcast資料庫的所有許可權
revoke all on itcast.* from 'heima'@'%';
參考:黑馬程式員