MySQL8_SQL語法

来源:https://www.cnblogs.com/it-log/archive/2023/08/02/17581780.html
-Advertisement-
Play Games

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'@'%';

參考:黑馬程式員

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • # C#委托 太久沒用了,簡單的複習一下 快速過一遍語法使用 ## 使用委托的步驟 1.定義一個委托類型 只需要在聲明的前面加上delegate關鍵字,其他的就跟聲明一個方法(函數)類似 ~~~ public delegate void SayHello(string name); ~~~ 2.使用 ...
  • # Unity BuildPlayerProcessor Unity BuildPlayerProcessor是Unity引擎中的一個非常有用的功能,它可以讓開發者在構建項目時自動執行一些操作。這個功能可以幫助開發者提高工作效率,減少手動操作的時間和錯誤率。在本文中,我們將介紹Unity Build ...
  • module_init是linux內核提供的一個巨集, 可以用來在編寫內核模塊時註冊一個初始化函數, 當模塊被載入的時候, 內核負責執行這個初始化函數. 在編寫設備驅動程式時, 使用這個巨集看起來理所應當, 沒什麼特別的, 但畢竟我還是一個有點追求的程式員嘛:P, 這篇文章是我學習module_init... ...
  • 第一種 每打開一次終端都輸入一次 source /etc/profile,這樣就可以載入配置文件,環境變數自然就有了 第二種 輸入vim ./bashrc,在底部添加配置在/etc/profile里的配置,這樣就可以無需使用source命令載入了 也可以在./bashrc底部添加 source /e... ...
  • ![](https://img2023.cnblogs.com/blog/3076680/202308/3076680-20230802124620904-1514854566.png) # 1. 示例數據 ## 1.1. student ```sql insert into student val ...
  • 當企業的業務發展到一定的階段時,在系統中引入[監控告警系統](https://www.dtstack.com/dtengine/easymr?src=szsm)來對系統/業務進行監控是必備的流程。沒有監控或者沒有一個好的監控,會導致開發人員無法快速判斷系統是否健康;告警的實質則是“把人當服務用”,用 ...
  • 開發者的技術能力良莠不齊,DBA對資料庫知識的局限性導致爛SQL無處不在,而且隨著資料庫的不斷變更或演進,一些好的SQL也可能逐步變成需要優化的爛SQL, 我們要時刻不斷地找尋它們的蹤跡。 ...
  • ### 分享技術,用心生活 >背景:系統中有一個統計頁面載入特別慢,前端設置的40s超時時間都載入不出來數據,因為是個統計頁面,基本上一猜就知道是mysql的語句有問題,遺留了很久沒有解決,正好趁不忙的時候,下定決心一定把它給搞定! ## 1. 分析原因 (mysql5.7) 執行一下問題sql,可 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...