SQL通用語法和注釋,SQL語句分類(DDL,DML,DQL,DCL)及案例

目錄

SQL通用語法和注釋

SQL語句分類(DDL,DML,DQL,DCL,TPL,CCL)

DDL(數據定義語言)

數據庫操作

查詢(SHOW、SELECT)

創建(CREATE)

刪除(DROP)

使用(USE)

表操作

查詢(SHOW、DESC)

創建(CREATE)

修改(ALTER)

刪除(DROP)

DML(數據操作語言)

添加數據(INSERT)

修改數據(UPDATE)

刪除數據(DELETE)

DQL(數據查詢語言)

DQL執行順序

基本查詢

條件查詢(WHERE),比較運算符,邏輯運算符

分組查詢(GROUP BY)和 聚合函數

聚合函數(count、max、min、avg、sum)

分組查詢(GROUP BY)

排序查詢(ORDER BY)

分頁查詢(LIMIT)

案例

DCL(數據控制語言)

管理數據庫用戶

查詢用戶

創建用戶

修改用戶密碼

刪除用戶

權限控制

查詢用戶權限

授予用戶權限

撤銷用戶權限


SQL:操作關系型數據庫的編程語言,定義了一套操作關系型數據庫統一標準。

主流的關系型數據庫都支持SQL語言,在MySQL中SQL不區分大小寫。

SQL通用語法和注釋

SQL通用語法:

  1. SQL語句可以單行或多行書寫,以分號結尾
  2. SQL語句可以使用空格或者縮進(空格和縮進的個數是沒有限制的)來增強語句的可讀性(如果SQL語句過長)
  3. MySQL數據庫的SQL語句是不區分大小寫的,關鍵字建議大寫
  4. 注釋:
    1. 單行注釋:-- 注釋內容# 注釋內容
    2. 多行注釋:/*注釋內容*/

注意:在HeidiSQL中,可以使用快捷鍵ctrl+/自動注釋

SQL語句分類(DDL,DML,DQL,DCL,TPL,CCL)

SQL語句分為6類:

分類

全稱

說明

DDL

Data Definition Language

數據定義語言,用來定義數據庫對象(數據庫,表,字段等..)

DML

Data Manipulation Language

數據操作語言,用來對數據庫表中的數據進行增刪改

DQL

Data Query Language

數據查詢語言,用來查詢數據庫中表的記錄

DCL

Data Control Language

數據控制語言,用來管理數據庫用戶、控制用戶具有的數據庫的訪問權限

TPL

Data Query Language

事務處理語言,為了確保被DML語句影響的表可以及時更新

CCL

Cursor Control Language

指針控制語言,規定了SQL語句在宿主語言的程序中的使用的規則

DDL(數據定義語言)

DDL(Data Definition Language):數據定義語言,用來定義數據庫對象(數據庫,表,字段等..)。

數據庫操作
查詢(SHOW、SELECT)

查詢所有數據庫

SHOW DATABASES;

查詢當前所處的數據庫

SELECT DATABASE();

示例如下:

創建(CREATE)

創建數據庫

CREATE DATABASE [IF NOT EXISTS] 數據庫名 [DEFAULT CHARSET 字符集] [COLLATE 排序規則]

注意:

  1. IF NOT EXISTS:表示如果這個數據庫不存在,則創建該數據庫,否則不執行任何操作
  2. DEFAULT CHARSET:指定數據庫所使用的字符集,比如UTF-8(但UTF8它存儲的長度是3個字節,推薦使用UTF8mb4,它支持四個字節)
  3. COLLATE:指定排序規則

示例如下:

在Linux中的MySQL中,創建一個名為hyh2的數據庫

注意:在Linux的MySQL中,創建數據庫時,最好指定數據庫的字符集,不然后續中文容易出現錯誤。

輸入:CREATE DATABASE hyh2 CHARSET=UTF8MB4;

執行后,創建數據庫hyh2成功

刪除(DROP)

刪除數據庫

DROP DATABASE [IF EXISTS] 數據庫名;

注意:

IF EXISTS:表示如果存在,則刪除,否則不執行任何操作

示例如下:

使用(USE)

使用數據庫(切換到該數據庫)

USE 數據庫名;

示例如下:

表操作
查詢(SHOW、DESC)

查詢當前所在數據庫所有表

SHOW TABLES;

查詢表結構(查看該表中有哪些字段,字段的類型等..)

DESC 表名;

查詢指定表的建表語句

SHOW CREATE TABLE 表名;

查詢當前所在數據庫所有表-示例如下:

查詢表結構(查看該表中有哪些字段,字段的類型等..)-示例如下:

查詢指定表的建表語句-示例如下:

創建(CREATE)

創建表結構:

CREATE TABLE 表名(

字段1 類型 [約束] [COMMENT 字段1注釋],

字段2 類型 [約束] [COMMENT 字段2注釋]

字段N 類型 [約束] [COMMENT 字段N注釋]

)[COMMENT 表注釋]

注意:一般id可設置為主鍵(PRIMARY KEY),id字段一般會設置為自增(AUTO_INCREMENT)

創建表結構-示例如下:

案例:

根據需求設計表,要求合理數據類型和長度。

需求:

  1. 編號(純數字)
  2. 員工工號(字符串類型,長度不超過10位)
  3. 員工姓名(字符串類型,長度不超過10位)
  4. 性別(男/女,存儲一個漢字)
  5. 年齡
  6. 身份證號(二代身份證號均為18位,身份證中有X這樣的字符)
  7. 入職時間(年月日即可)

代碼如下:

CREATE TABLE emp(

id INT COMMENT '編號',

work_no VARCHAR(10) COMMENT '工號',

name VARCHAR(10) COMMENT '姓名',

gender char(1) COMMENT '性別',

age TINYINT UNSIGNED COMMENT '年齡',

id_card char(18) COMMENT '身份證號',

entry_date DATE COMMENT '入職時間'

) COMMENT '員工表';

注意:編碼格式要是UTF-8,最好在記事本上將代碼打出來,再拿去執行。

運行如下:

創建一個student表(學生表),有以下要求:

  1. 第一個字段:id(編號),整型,主鍵,自增,無符號
  2. 第二個字段:stu_name(姓名),字符串類型,非空
  3. 第三各字段:age(年齡),整型
  4. 第四個字段:height(身高),數值類型,精度是5,標度是2

輸入sql語句:

CREATE TABLE student(

??? id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '編號',

??? stu_name VARCHAR(20) NOT NULL COMMENT '姓名',

??? age INT COMMENT '年齡',

??? height DECIMAL(5, 2) COMMENT '身高'

)COMMENT '學生表';

執行后,表結構如下:

修改(ALTER)

往表中添加字段

ALTER TABLE 表名 ADD 字段名 類型(長度) [COMMENT 注釋] [約束];

示例如下:

為emp表中添加一個新字段“昵稱”nickname,類型為VARCHAR(20)

代碼:ALTER TABLE emp ADD nickname VARCHAR(20) COMMENT '昵稱';

修改字段的數據類型

ALTER TABLE 表名 MODIFY 字段名 新數據類型(長度);

示例如下:

將emp表中的age字段的數據類型改為CHAR(3)

代碼:ALTER TABLE emp MODIFY age CHAR(3)

修改字段名和字段類型

ALTER TABLE 表名 CHANGE 舊字段名 新字段名 類型(長度) [COMMENT 注釋] [約束];

示例如下:

將emp表的nickname修改為username,類型為VARCHAR(30)

代碼為:ALTER TABLE emp CHANGE nickname username VARCHAR(30) COMMENT '用戶名';

刪除表中字段

ALTER TABLE 表名 DROP 字段名;

示例如下:

將emp表中的username字段刪除

代碼:ALTER TABLE emp DROP username;

修改表名

ALTER TABLE 表名 RENAME TO 新表名;

示例如下:

將emp表的表名修改為employee

代碼:ALTER TABLE emp RENAME TO employee;

刪除(DROP)

刪除表

DROP TABLE [IF EXISTS] 表名;

注意:這種方式效率高

示例如下:

刪除table_user表

DROP TABLE IF EXISTS table_user;

刪除指定表,并重新創建該表

TRUNCATE TABLE 表名;

注意:

  1. 表中數據被刪除了,只留下了表結構(空表)
  2. 這種方式效率低

示例如下:

刪除表employee

代碼:TRUNCATE TABLE employee;

DML(數據操作語言)

DML(Data Manipulation Language):數據操作語言,用來對數據庫表中的數據進行增刪改

添加數據(INSERT)

給表中指定的字段添加數據

INSERT INTO 表名(字段名1, 字段名2, ...) VALUES(值1, 值2, ...);

給表中全部字段添加數據

INSERT INTO 表名 VALUES(值1, 值2, ...);

批量添加數據-給表中指定的字段添加數據

INSERT INTO 表名(字段名1, 字段名2, ...) VALUES(值1, 值2, ...), (值1, 值2, ...), (值1, 值2, ...)...;

批量添加數據-給表中全部字段添加數據

INSERT INTO 表名 VALUES(值1, 值2, ...), (值1, 值2, ...), (值1, 值2, ...)...;

以上4條語句-注意:

  1. 插入字段的值要與指定字段的順序一一對應;
  2. 字符串和日期型數據應該包含在引號中;
  3. 插入數據的大小,應該在字段的規定范圍內。
  4. 如果主鍵是自增的,可以用0或NULL代替

示例如下:

向test數據庫的employee表中插入3條數據:

代碼為:

/*給表中指定的字段添加數據*/

INSERT INTO employee(id, work_no, name, id_card) VALUES(1, '1', '小紅', '123456789012345678');

/*批量添加數據-給表中全部字段添加數據*/

INSERT INTO employee VALUES(2, '2', '小黑', '', 30, '123456789012345678', '2019-10-20'),

(3, '3', '小蘭', '', 26, '123456789012345678', '2020-03-31');

表student為空表,向student表中插入2條數據記錄

sql語句,如下:

INSERT INTO student VALUES(NULL, '學生001', 14, 165.19), (NULL, '學生002', 12, 154.67);

執行后,表student中的數據為:

修改數據(UPDATE)

修改表中字段的值

UPDATE 表名 SET 字段名1 = 值1, 字段名2 = 值2, ... [WHERE 條件];

注意:

UPDATE語句的條件如果沒有,則會修改整張表的所有數據。

示例如下:

  1. 將名字為小黑的這條記錄的年紀改為46
  2. 將所有員工的入職時間改為2024-09-08

代碼為:

/*將名字為小黑的這條記錄的年紀改為46*/

UPDATE employee SET age = 46 WHERE NAME = '小黑';

/*將所有員工的入職時間改為2024-09-08*/

UPDATE employee SET entry_date = '2024-09-08';

刪除數據(DELETE)

刪除表中的記錄

DELETE FROM 表名 [WHERE 條件];

注意:

  1. DELETE語句的條件如果沒有,則會刪除整張表的所有數據記錄;
  2. DELETE是刪除記錄的,要清除某字段的值要用UPDATE;
  3. DELETE刪除所有數據后,如果再插入數據記錄,自增長字段不會從1開始
  4. 這種方法是物理刪除(真刪)
  5. 工作中大部分使用邏輯刪除,即不真正的刪除記錄。邏輯刪除是指通過設定一個字段來標識當前記錄已經刪除。比如用:根據is_delete字段來標識,1代表刪除,0表示未刪除。比如:可以通過表中字段is_delete來判斷是否顯示該記錄給用戶,如下圖表中的數據:

示例如下:

  1. 刪除年紀為26的員工的記錄
  2. 刪除表中的所有員工的記錄

代碼為:

USE test;

/*刪除年紀為26的員工的記錄*/

DELETE FROM employee WHERE age = 26;

SELECT * FROM employee;

/*刪除所有員工記錄*/

DELETE FROM employee;

SELECT * FROM employee;

運行如下:

DQL(數據查詢語言)

DQL(Data Query Language):數據查詢語言,用來查詢數據庫中表的記錄。

DQL執行順序

DQL語法:

SELECT

字段名稱

FROM

表名列表

WHERE

條件列表

GROUP BY

分組字段列表

HAVING

分組后條件列表

ORDER BY

排序字段列表

LIMIT

分頁參數

DQL語句的先后執行順序為:

FROM

表名列表

WHERE

條件列表

GROUP BY

分組字段列表

HAVING

分組后條件列表

SELECT

字段列表

ORDER BY

排序字段列表

LIMIT

分頁參數

基本查詢

查詢表中指定字段數據

SELECT 字段1, 字段2, ... FROM 表名;

查詢表中指定字段數據,同時給字段設置別名(使SQL語句看起來更加精簡易讀,也避免查詢返回相同字段數據時的沖突)

SELECT 字段1 [AS 別名1], 字段2 [別名2], ... FROM 表名;

注意:AS可以省略。

查詢指定字段數據,同時去除重復記錄

SELECT DISTINCT 字段1, 字段2,... FROM 表名;

查詢表中所有字段數據(使用通配符*代表所有字段|也可以把所有的字段都列出來)

SELECT * FROM 表名;

注意:在實際開發中,盡量不要使用通配符*來查詢所有字段數據,因為*不直觀,同時會影響效率,在項目組中會有對應的開發規范,我們要遵循開發規范,盡量不要使用*。

示例如下:

數據準備:

創建表結構emp

CREATE TABLE emp(

id INT COMMENT '編號',

work_no VARCHAR(10) COMMENT '工號',

emp_name VARCHAR(10) COMMENT '姓名',

gender char(1) COMMENT '性別',

age TINYINT UNSIGNED COMMENT '年齡',

id_card char(18) COMMENT '身份證號',

work_address VARCHAR(30) COMMENT '工作地址',

entry_date DATE COMMENT '入職時間'

) COMMENT '員工表';

向表中添加數據記錄

INSERT INTO emp VALUES

(1, '1', '小黑', '', 31, '123456789012345678', '上海', '2019-10-20'),

(2, '2', '曉峰', '', 29, '123456789021345678', '上海', '2020-01-23'),

(3, '3', '小花', '', 30, '123456789031245678', '武漢', '2017-10-20'),

(4, '4', '小曉', '', 49, '123456789041235678', '上海', '2019-11-20'),

(5, '5', '思思', '', 30, '123456789051234678', '上海', '2016-10-20'),

(6, '6', '小齊', '', 36, '123456789061234578', '青島', '2019-08-21'),

(7, '7', '小華', '', 27, '123456789071234568', '上海', '2021-10-20'),

(8, '8', '露毛', '', 38, '123456789013245678', '上海', '2019-07-20'),

(9, '9', '小青', '', 46, '123456789014235678', '鄭州', '2012-9-20'),

(10, '10', '小五', '', 32, '12345678901567861X', '蘇州', '2020-07-08');

執行以上語句,運行完畢后,emp表中數據如下:

查詢emp表中指定字段:emp_nam,entry_date,work_address

代碼為:SELECT emp_name, entry_date, work_address FROM emp;

查詢emp返回所有字段數據

代碼:

/*列出所有字段,查詢所有字段數據*/

SELECT id, work_no, emp_name, gender, age, id_card, work_address, entry_date FROM emp;

/*使用通配符代表所有字段,查詢所有字段數據

但這種方法不建議,因為不直觀,也會影響開發效率*/

SELECT * FROM emp;

運行后

查詢emp表返回所有員工的work_address,同時給work_address起別名“工作地址”

代碼:

/*work_address起別名工作地址”*/

SELECT work_address AS '工作地址' FROM emp;

/*work_address起別名工作地址,省略AS*/

SELECT work_address '工作地址' FROM emp;

運行

查詢emp表中員工的上班地址都有哪些?(去重)

代碼:

/*查詢emp表中員工的上班地址都有哪些?(去重)*/

SELECT DISTINCT work_address AS "員工的上班地址" FROM emp;

條件查詢(WHERE),比較運算符,邏輯運算符

在表中查詢指定字段數據,同時字段數據要符合查詢條件

SELECT 字段列表 FROM 表名 WHERE 條件列表;

條件:

比較運算符

功能

>

大于

>=

大于等于

<

小于

<=

小于等于

=

等于

<>或!=

不等于

BETWEEN...AND...

在某個范圍之間(含最小和最大值)。

注意:先寫最小值,再寫最大值。

IN(...)

在in之后列表中的值,多選一

LIKE 占位符

模糊匹配(_匹配單個字符,%匹配任意字符)

IS NULL

是空

IS NOT NULL

不是空

邏輯運算符

功能

AND或&&

并且(多個條件同時成立)。

注意:&&將會在未來棄用,不建議使用該方式。

OR或||

或者(多個條件任意一個成立)

注意:||將會在未來棄用,不建議使用該方式。

NOT或!

非,不是

示例如下:

emp表中數據如下:

查詢emp表中年齡等于30的員工記錄

代碼:

/*查詢emp表中年齡等于30的員工記錄*/

SELECT * FROM emp WHERE age = 30;

執行

查詢emp表中年齡小于等于30的員工記錄

代碼:

/*查詢emp表中年齡小于等于30的員工記錄*/

SELECT * FROM emp WHERE age <= 30;

運行

查詢emp表中身份證號為空的員工記錄

代碼:

/*查詢emp表中身份證號為空的員工記錄*/

SELECT * FROM emp WHERE id_card IS NULL;

執行

查詢emp表中身份證號不為空的員工記錄

代碼:

/*方式1:查詢emp表中身份證號不為空的員工記錄*/

SELECT * FROM emp WHERE id_card IS NOT NULL;

/*方式2:查詢emp表中身份證號不為空的員工記錄*/

SELECT * FROM emp WHERE id_card !='';

運行

查詢emp表中工作地址(work_address)不在上海的員工記錄

代碼:

/*方式1:查詢emp表中工作地址(work_address)不在上海的員工記錄*/

SELECT * FROM emp WHERE work_address != '上海';

/*方式2:查詢emp表中工作地址(work_address)不在上海的員工記錄*/

SELECT * FROM emp WHERE work_address <> '上海';

/*方式3:查詢emp表中工作地址(work_address)不在上海的員工記錄*/

SELECT * FROM emp WHERE NOT work_address = '上海';

運行

查詢emp表中年齡(age)在30(包含)到36(包含)之間的員工記錄

代碼:

/*方式1:查詢emp表中年齡(age)在30(包含)到36(包含)之間的員工記錄*/

SELECT * FROM emp WHERE age BETWEEN 30 AND 36;

/*方式2:查詢emp表中年齡(age)在30(包含)到36(包含)之間的員工記錄*/

SELECT * FROM emp WHERE age >= 30 AND age <= 36;

/*方式3:查詢emp表中年齡(age)在30(包含)到36(包含)之間的員工記錄,注意:&&將會在未來棄用,不建議使用該方式*/

SELECT * FROM emp WHERE age >= 30 && age <= 36;

運行

查詢emp表中年齡小于40,且性別為女的員工記錄

代碼:

/*查詢emp表中年齡小于40,且性別為女的員工記錄*/

SELECT * FROM emp WHERE age < 40 AND gender = '';

運行

查詢emp表中年齡等于30或年齡等于36或年齡等于46的員工記錄

/*方式1:查詢emp表中年齡等于30或年齡等于36或年齡等于46的員工記錄*/

SELECT * FROM emp WHERE age = 30 OR age = 36 OR age = 46;

/*方式2:查詢emp表中年齡等于30或年齡等于36或年齡等于46的員工記錄,注意||將會過時,不建議使用該方式*/

SELECT * FROM emp WHERE age = 30 || age = 36 || age = 46;

/*方式3:查詢emp表中年齡等于30或年齡等于36或年齡等于46的員工記錄*/

SELECT * FROM emp WHERE age IN(30, 36, 46);

運行

更新emp表的數據

查詢emp表中姓名為3個字的員工記錄

代碼:

/*查詢emp表中姓名為3個字的員工記錄

使用3_下劃線,占位3個字符*/

SELECT * FROM emp WHERE emp_name LIKE '___';

運行

查詢emp表中入職時間在2010-2019(2010和2019都包含)年之間的員工記錄

/*查詢emp表中入職時間在2010-201920102019都包含)年之間的員工記錄*/

SELECT * FROM emp WHERE entry_date LIKE '201%';

運行

分組查詢(GROUP BY)和 聚合函數
聚合函數(count、max、min、avg、sum)

聚合函數:將一列數據作為一個整體,進行縱向計算;使用聚合函數方便進行數據統計。

常見的聚合函數

函數

功能

COUNT(*或字段名)

統計數量(統計指定字段不為NULL的記錄行數

MAX(字段名)

最大值(計算指定字段的數值和,如果指定列類型不是數值類型,則計算結果為0)

MIN(字段名)

最小值

AVG(字段名)

平均值(計算指定列的平均值,如果指定列類型不是數值類型,則計算結果為0

SUM(字段名)

求和

注意:null值不參與聚合函數的計算。

示例如下:

emp表中的數據如下:

統計emp表所有員工的數量

代碼:

/*方法1:統計emp表所有員工的數量*/

SELECT COUNT(*) FROM emp;

/*方法2:統計emp表所有員工的數量

注意:函數是統計列的數據,所以除了id

只要字段的數據不為空(比如:COUNT(id_card)9),其他的字段都可以作為統計*/

SELECT COUNT(id) FROM emp;

運行

統計emp表中員工的平均年齡

代碼:

/*統計emp表中員工的平均年齡*/

SELECT AVG(age) FROM emp;

運行

查詢emp表中員工的最大年齡

代碼:

/*查詢emp表中員工的最大年齡*/

SELECT MAX(age) FROM emp;

運行

查詢emp表中員工的最小年齡

代碼:

/*查詢emp表中員工的最小年齡*/

SELECT MIN(age) FROM emp;

運行

統計emp表中在上海工作的員工的年齡之和

代碼:

/*統計emp表中在上海工作的員工的年齡之和*/

SELECT SUM(age) FROM emp WHERE work_address = '上海';

運行

分組查詢(GROUP BY)

分組:按照字段分組,字段值相同的數據會被放到一個組中

分組的目的:是對每一組的數據進行統計(使用聚合函數)

分組查詢語法:

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

注意:

  1. 執行順序:WHERE > 聚合函數 > HAVING。
  2. 分組之后,查詢的字段一般為聚合函數和分組字段,查詢其他字段無任何意義。
  3. WHERE和HAVING的區別:
    1. 執行時機不同:WHERE是分組之前進行過濾,不滿足WHERE條件,不參與分組;而HAVING是分組之后對結果進行過濾
    2. 判斷條件不同:WHERE不能對聚合函數進行判斷,而HAVING可以。

示例如下:

emp表數據如下:

對emp表進行分組查詢:根據性別分組,統計男性員工和女性員工的數量。

代碼:

/*emp表進行分組查詢:根據性別分組,統計男性員工和女性員工的數量*/

SELECT gender, COUNT(*) FROM emp GROUP BY gender;

運行

對emp表進行分組查詢:根據性別分組,統計男性員工和女性員工的平均年齡。

代碼:

/*emp表進行分組查詢:根據性別分組,統計男性員工和女性員工的平均年齡*/

SELECT gender, AVG(age) FROM emp GROUP BY gender;

運行

  1. 對emp表進行分組查詢:查詢年齡小于36的員工,并根據工作地址分組。
  2. 對emp表進行分組查詢:查詢年齡小于36的員工,并根據工作地址分組,獲取員工數量大于等于2的工作地址。

代碼:

/*emp表進行分組查詢:查詢年齡小于36的員工,并根據工作地址分組*/

SELECT work_address, COUNT(*) FROM emp WHERE age < 36 GROUP BY work_address;

/*emp表進行分組查詢:查詢年齡小于36的員工,并根據工作地址分組,獲取員工數量大于等于2的工作地址*/

-- WHERE不能對聚合函數進行判斷,而HAVING可以

SELECT work_address, COUNT(*) FROM emp WHERE age < 36 GROUP BY work_address HAVING COUNT(*) >= 2;

運行

如下表,學生成績表:

要求:計算每個學生的總成績,sql語句如下:

-- 方式1

SELECT name, SUM(chinese + english + math) FROM exam GROUP BY id;

-- 方式2

SELECT id, name, (chinese + english + math) FROM exam;

執行結果,如下:

如下表,學生表:

要求1:查詢各種性別的人數, 每組最大年齡, 每組最小年齡

sql語句,如下:

SELECT sex, COUNT(*), MAX(age), MIN(age) FROM student_02 GROUP BY sex;

執行結果:

要求2:查詢每個班級中各種性別的人數, 各種性別的最小年齡

sql語句如下:

-- 思路:先按班級分組,再按性別分組

SELECT class, sex, COUNT(*), MIN(age) FROM student_02 GROUP BY class, sex;

執行結果:

要求3:查詢所有班級中不同性別的記錄數(個數)大于1的信息

sql語句如下:

-- WHERE不能對聚合函數進行判斷,而HAVING可以

SELECT class, sex, COUNT(*) FROM student_02 GROUP BY class, sex HAVING COUNT(*) > 1;

執行結果:

排序查詢(ORDER BY)

排序查詢語法

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

注意:

  1. 排序方式:
    1. ASC:升序(默認值)
    2. DESC:降序
  2. 如果是多字段排序,當第一個字段值相同時,才會根據第二個字段進行排序

示例如下:

emp表的數據如下:

在emp表中根據年齡對員工記錄進行升序排序

代碼:

/*emp表中根據年齡對員工記錄進行升序排序,ASC可以省略*/

SELECT * FROM emp ORDER BY age ASC;

運行

在emp表中根據入職時間對員工記錄進行降序排序

代碼:

/*emp表中根據入職時間對員工記錄進行降序排序*/

SELECT * FROM emp ORDER BY entry_date DESC;

運行

在emp表中,根據年齡對員工進行升序排序,如果年齡相同,再按照入職時間進行降序排序

代碼:

/*emp表中,根據年齡對員工進行升序排序,如果年齡相同,再按照入職時間進行降序排序,注意:ASC省略了*/

SELECT * FROM emp ORDER BY age, entry_date DESC;

運行

分頁查詢(LIMIT)

分頁查詢語法

SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查詢記錄數;

注意:

  1. 起始索引從0開始起始索引=(查詢頁碼-1)*每頁顯示記錄數
  2. 分頁查詢是數據庫的“方言”,不同的數據庫有不同的實現方式,MySQL中是LIMIT。
  3. 如果查詢的是第一頁,起始索引可以省略。

示例如下:

emp表數據如下:

在emp表中查詢第一頁員工數據,每頁顯示4條記錄

代碼:

/*emp表中查詢第一頁員工數據,每頁顯示4條記錄,注意:起始索引0可以省略*/

SELECT * FROM emp LIMIT 0, 4;

-- 省略起始索引0

SELECT * FROM emp LIMIT 4;

運行

在emp表中查詢第2頁員工數據,每頁顯示3條記錄

代碼:

/*emp表中查詢第2頁員工數據,每頁顯示3條記錄,起始索引 = (2-1)*3 = 3*/

SELECT * FROM emp LIMIT 3, 3;

運行

案例

emp表數據如下:

查詢emp表中年齡在29,32,30,46的女性員工記錄

代碼:

/*查詢emp表中年齡在29323046的女性員工記錄*/

SELECT * FROM emp WHERE age IN(29, 32, 30, 46) AND gender = '';

運行結果

查詢emp表中性別為男,年齡在30~40之間(包含30和40)并且姓名為2個字的員工記錄

代碼:

/*方式1:查詢emp表中性別為男,年齡在30~40之間(包含3040)并且姓名為2個字的員工記錄*/

SELECT * FROM emp WHERE gender = '' AND age BETWEEN 30 AND 40 AND emp_name LIKE '__';

/*方式2:查詢emp表中性別為男,年齡在30~40之間(包含3040)并且姓名為2個字的員工記錄*/

SELECT * FROM emp WHERE gender = '' AND (age >= 30 AND age <= 40) AND emp_name LIKE '__';

執行結果

統計emp表中,年齡小于40的,男性員工和女性員工的人數

/*統計emp表中,年齡小于40的,男性員工和女性員工的人數*/

SELECT gender, COUNT(*) AS '人數' FROM emp WHERE age < 40 GROUP BY gender;

運行結果

查詢emp表中年齡小于等于30歲的員工的姓名,年齡,入職時間,并對查詢結果按年齡進行升序排序,如果年齡相同就按入職時間降序排序

代碼:

-- 查詢emp表中年齡小于等于30歲的員工的姓名,年齡,入職時間,

-- 并對查詢結果按年齡進行升序排序,如果年齡相同就按入職時間降序排序

# 注意:ASC可以省略

SELECT emp_name, age, entry_date FROM emp WHERE age <= 30 ORDER BY age ASC, entry_date DESC;

運行結果

查詢emp表中性別為男,年齡在20~40(含20和40)之間的前4個員工記錄,并對查詢結果按年齡升序排序,如果年齡相同按入職時間降序排序

代碼:

/*

查詢emp表中性別為男,年齡在20~40(含2040)之間的前4個員工記錄,

并對查詢結果按年齡升序排序,如果年齡相同按入職時間降序排序

注意:ASC可以省略

*/

SELECT * FROM emp WHERE gender = '' AND (age BETWEEN 20 AND 40) ORDER BY age ASC, entry_date DESC LIMIT 0, 4;

運行結果

DCL(數據控制語言)

DCL(Data Control Language):數據控制語言,用來管理數據庫用戶、控制用戶具有的數據庫的訪問權限

注意:

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

管理數據庫用戶
查詢用戶

查詢用戶語法:

USE mysql;

SELECT * FROM user;

注意:

在MySQL數據庫中,用戶的信息和用戶具有的權限的信息都是存放在系統數據庫mysql的user表中的

查看mysql系統數據庫的user表中的數據

示例如下:

使用系統數據庫mysql,查詢user表中用戶的信息

代碼:

/*使用系統數據庫mysql*/

USE mysql;

/*查詢user表的數據*/

SELECT * FROM user;

運行結果

創建用戶

創建用戶語法:

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

注意:

主機名指的是在哪一個主機上這個用戶可以訪問MySQL數據庫;

示例如下:

創建數據庫用戶hyh,只能在localhost主機上訪問,密碼設置為123456

代碼:

/*創建數據庫用戶hyh,只能在localhost主機上訪問,密碼設置為123456

注意:還未分配權限*/

CREATE user 'hyh'@'localhost' IDENTIFIED BY '123456';

運行結果

創建用戶hyh2,想在任意的主機上都能訪問該數據庫,密碼123456

代碼:

/*創建用戶hyh2,想在任意的主機上都能訪問該數據庫,密碼123456

使用通配符%代表任意主機*/

CREATE user 'hyh2'@'%' IDENTIFIED BY '123456';

運行結果

修改用戶密碼

修改用戶密碼語法

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

注意:

Mysql_native_password是加密方式

示例如下:

修改用戶hyh2的密碼為123

代碼:

/*修改用戶hyh2的密碼為123*/

ALTER user 'hyh2'@'%' IDENTIFIED WITH mysql_native_password BY '123';

測試用戶hyh2的密碼

刪除用戶

刪除用戶的語法

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

示例如下:

刪除用戶hyh2

代碼:

/*刪除用戶hyh2*/

DROP user 'hyh2'@'%';

運行結果

權限控制

MySQL中常用的權限:

權限

說明

ALL,ALL PRIVILEGES

所有權限

SELECT

查詢權限

INSERT

插入數據

UPDATE

修改數據

DELETE

刪除數據

ALTER

修改表/字段

DROP

刪除數據庫/表/視圖

CREATE

創建數據庫/表

查詢用戶權限

查詢用戶權限語法:

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

示例如下:

查詢root@localhost用戶的權限

代碼:

SHOW GRANTS FOR 'root'@'localhost';

運行結果

查詢hyh@localhost用戶的權限

代碼:

SHOW GRANTS FOR 'hyh'@'localhost';

運行結果

授予用戶權限

授予用戶權限語法:

GRANT 權限列表 ON 數據庫名.表名 TO '用戶名'@'主機名';

注意:

如果要給所有數據庫,所有的表都賦予權限,可以寫*.*

示例如下:

授予hyh@localhost用戶的test數據庫的所有表的所有權限

代碼:

# 授予hyh@localhost用戶的test數據庫的所有表的權限

GRANT ALL ON test.* TO 'hyh'@'localhost';

運行結果

撤銷用戶權限

撤銷用戶權限語法:

REVOKE 權限列表 ON 數據庫名.表名 FROM '用戶名'@'主機名';

示例如下:

撤銷hyh@localhost用戶的test數據庫的所有表的所有權限

代碼:

# 授予hyh@localhost用戶的test數據庫的所有表的權限

REVOKE ALL ON test.* FROM 'hyh'@'localhost';

運行結果

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/76233.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76233.shtml
英文地址,請注明出處:http://en.pswp.cn/web/76233.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux:線程概念與控制

??所屬專欄&#xff1a;Linux?? ??作者主頁&#xff1a;嶔某?? Linux&#xff1a;線程概念于控制 var code “d7e241ae-ed4d-475f-aa3d-8d78f873fdca” 概念 在一個程序里的一個執行路線就叫做線程thread。更準確一點&#xff1a;線程是“一個進程內部的控制序列” …

人臉識別聯合行為檢測的辦公管理新模式

基于人臉識別與行為檢測的辦公智能化解決方案 一、背景 在傳統辦公場景中&#xff0c;員工考勤管理、工位使用情況統計、安全監控等環節存在諸多痛點。例如&#xff0c;傳統考勤方式如指紋打卡、刷卡等存在代打卡現象&#xff0c;考勤數據不準確&#xff1b;對于員工是否在工…

ceph weight 和 reweight 的區別

ceph osd df ID CLASS WEIGHT REWEIGHT SIZE RAW USE DATA OMAP META AVAIL %USE VAR PGS STATUS0 nvme 6.98630 0.95508 7.0 TiB 5.0 TiB 4.9 TiB 13 GiB 33 GiB 2.0 TiB 71.10 0.96 83 up1 nvme 6.98630

WInform當今技術特性分析

Windows Forms (WinForms) 技術特性分析 引言 Windows Forms (WinForms) 作為微軟最早推出的基于.NET的圖形用戶界面開發框架&#xff0c;已經存在了20多年。在如今充滿了各種現代UI框架的軟件開發生態系統中&#xff0c;WinForms仍然保持著其獨特的地位。本文將深入分析WinF…

Spark rdd算子解析與實踐

一、RDD基礎回顧 RDD&#xff08;Resilient Distributed Dataset&#xff09; 是Spark的核心抽象&#xff0c;代表一個不可變、分區的分布式數據集合。其核心特性包括&#xff1a; 容錯性&#xff1a;通過血緣&#xff08;Lineage&#xff09;記錄數據生成過程&#xff0c;支…

sqlite3的API以及命令行

sqlite是目前最流行的嵌入式數據庫。 所謂嵌入式&#xff0c;就是足夠簡單&#xff0c;可以嵌入到我們自己開發的應用程序之中。 在Linux系統中&#xff0c;sqlite的使用只需要使用它的API&#xff0c;連接它的動態連接庫&#xff0c;甚至都不用連接&#xff0c;sqlite的實現…

Allure測試報告按測試終端和測試類型智能分類查看

以下是實現Allure測試報告按測試終端和測試類型智能分類的完整方案: 一、測試框架分層設計 # 項目結構 project/ ├── api_tests/ # API測試 │ └── test_order.py ├── app_tests/ # 移動端測試 │ ├── android/ │ └── ios/ ├── pc_te…

Spine-Leaf 與 傳統三層架構:全面對比與解析

本文將詳細介紹Spine-Leaf架構&#xff0c;深入對比傳統三層架構&#xff08;Core、Aggre、Access&#xff09;&#xff0c;并探討其與Full-mesh網絡和軟件定義網絡&#xff08;SDN&#xff09;的關聯。通過通俗易懂的示例和數據中心網絡分析&#xff0c;我將幫助您理解Spine-L…

圖像預處理-圖像噪點消除

一.基本介紹 噪聲&#xff1a;指圖像中的一些干擾因素&#xff0c;也可以理解為有那么一些點的像素值與周圍的像素值格格不入。常見的噪聲類型包括高斯噪聲和椒鹽噪聲。 濾波器&#xff1a;也可以叫做卷積核 - 低通濾波器是模糊&#xff0c;高通濾波器是銳化 - 低通濾波器就…

安卓手機如何改ip地址教程

對于安卓手機用戶而言&#xff0c;ip修改用在電商、跨境電商、游戲搬磚、社交軟件這些需要開多個賬號的項目。因為多個設備或賬號又不能在同一ip網絡下&#xff0c;所以修改手機的IP地址防檢測成為一個必要的操作。以下是在安卓手機上更改IP地址的多種方法及詳細步驟&#xff0…

對象池模式在uniapp鴻蒙APP中的深度應用

文章目錄 對象池模式在uniapp鴻蒙APP中的深度應用指南一、對象池模式核心概念1.1 什么是對象池模式&#xff1f;1.2 為什么在鴻蒙APP中需要對象池&#xff1f;1.3 性能對比數據 二、uniapp中的對象池完整實現2.1 基礎對象池實現2.1.1 核心代碼結構2.1.2 在Vue組件中的應用 2.2 …

本地部署大模型實現掃描版PDF文件OCR識別!

在使用大模型處理書籍 PDF 時&#xff0c;有時你會遇到掃描版 PDF&#xff0c;也就是說每一頁其實是圖像形式。這時&#xff0c;大模型需要先從圖片中提取文本&#xff0c;而這就需要借助 OCR&#xff08;光學字符識別&#xff09;技術。 像 Gemini 2.5 這樣的強大模型&#x…

《Operating System Concepts》閱讀筆記:p700-p732

《Operating System Concepts》學習第 60 天&#xff0c;p700-p732 總結&#xff0c;總計 33 頁。 一、技術總結 1.Virtual machine manager (VMM) The computer function that manages the virtual machine; also called a hypervisor. VMM 也稱為 hypervisor。 2.types …

軟件項目驗收報告模板

軟件項目驗收報告 一、項目基本信息 項目名稱XX智能倉儲管理系統開發單位XX科技有限公司驗收單位XX物流集團合同簽訂日期2023年3月15日項目啟動日期2023年4月1日驗收日期2024年1月20日 二、驗收范圍 入庫管理模塊&#xff08;包含RFID識別、庫存預警&#xff09;出庫調度模…

深度學習筆記39_Pytorch文本分類入門

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 | 接輔導、項目定制 一、我的環境 1.語言環境&#xff1a;Python 3.8 2.編譯器&#xff1a;Pycharm 3.深度學習環境&#xff1a; torch1.12.1cu113torchvision…

二分查找-LeetCode

題目 給定一個 n 個元素有序的&#xff08;升序&#xff09;整型數組 nums 和一個目標值 target&#xff0c;寫一個函數搜索 nums 中的 target&#xff0c;如果目標值存在返回下標&#xff0c;否則返回 -1。 示例 1: 輸入: nums [-1,0,3,5,9,12], target 9 輸出: 4 解釋: …

從 Ext 到 F2FS,Linux 文件系統與存儲技術全面解析

與 Windows 和 macOS 操作系統不同&#xff0c;Linux 是由愛好者社區開發的大型開源項目。它的代碼始終可供那些想要做出貢獻的人使用&#xff0c;任何人都可以根據個人需求自由調整它&#xff0c;或在其基礎上創建自己的發行版本。這就是為什么 Linux 存在如此多的變體&#x…

leetcode:3210. 找出加密后的字符串(python3解法)

難度&#xff1a;簡單 給你一個字符串 s 和一個整數 k。請你使用以下算法加密字符串&#xff1a; 對于字符串 s 中的每個字符 c&#xff0c;用字符串中 c 后面的第 k 個字符替換 c&#xff08;以循環方式&#xff09;。 返回加密后的字符串。 示例 1&#xff1a; 輸入&#xff…

JVM詳解(曼波腦圖版)

(?ω?)&#xff89; 好噠&#xff01;曼波會用最可愛的比喻給小白同學講解JVM&#xff0c;準備好開啟奇妙旅程了嗎&#xff1f;(??????)? &#x1f4cc; 思維導圖 ━━━━━━━━━━━━━━━━━━━ &#x1f34e; JVM是什么&#xff1f;&#xff08;蘋果式比…

ZStack文檔DevOps平臺建設實踐

&#xff08;一&#xff09;前言 對于軟件產品而言&#xff0c;文檔是不可或缺的一環。文檔能幫助用戶快速了解并使用軟件&#xff0c;包括不限于特性概覽、用戶手冊、API手冊、安裝部署以及場景實踐教程等。由于軟件與文檔緊密耦合&#xff0c;面對業務的瞬息萬變以及軟件的飛…