一. 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 排序 規則 ] ;
案例1: 創建一個yun3k資料庫,使用資料庫默認的字符集,
create database yun3k;
案例2:在同一個資料庫服務器中,不能創建兩個名稱相同的資料庫,否則會報錯,
案例3:可以通過if not exists 引數來解決這個問題,資料庫不存在,則創建該資料庫,如果存在,則不創建,
create database if not exists yun3k;
案例4:創建一個yun3k_com資料庫并指定字符集
create database yun3k_com default charset utf8mb4;
(4). 洗掉資料庫
drop database [ if exists ] 資料庫名 ;
案例1:如果洗掉一個不存在的資料庫,將會報錯,此時,可以加上引數 if exists,如果資料庫存在,再執行洗掉,否則不執行洗掉,
(5). 切換資料庫
use 資料庫名;
案例1:我們要操作某一個資料庫下的表時,就需要通過該指令,切換到對應的資料庫下,否則是不能操作的,比如,切換到yun3k資料庫,
use yun3k;
2. 表操作
(1). 查詢當前資料庫所有表
show tables;
(2). 查詢指定表結構
查看指定表的欄位,欄位的型別、是否可以為NULL,是否存在默認值等資訊
desc 表明名;
案例1:查詢mysql資料庫下的component欄位
desc component;
(3). 查詢指定表的建表陳述句
查看建表陳述句,而有部分引數我們在創建表的時候,并未指定也會查詢到,因為這部分是資料庫的默認值,如:存盤引擎、字符集等,
show create table 表名;
案例1:查詢mysql資料庫下的component建表陳述句
show create table component;
(4). 創建表結構
CREATE TABLE 表名(
欄位1 欄位1型別 [ COMMENT 欄位1注釋 ],
欄位2 欄位2型別 [COMMENT 欄位2注釋 ],
欄位3 欄位3型別 [COMMENT 欄位3注釋 ],
......
欄位n 欄位n型別 [COMMENT 欄位n注釋 ]
) [ COMMENT 表注釋 ] ;
注意:[...]內為可選引數,最后一個欄位后面沒有逗號
案例1:在yun3k資料庫下創建一張表yun3k_user,對應的結構如下,那么建表陳述句為:
id | name | age | gender |
---|---|---|---|
1 | 楊過 | 23 | 男 |
2 | 小龍女 | 28 | 女 |
3 | 黃蓉 | 45 | 女 |
create table yun3k_user(
id int comment '編號',
name varchar(50) comment '姓名',
age int comment '年齡',
gender varchar(1) comment '性別'
) comment '用戶表';
(5). 資料型別
Mysql中的資料型別有很多,主要分為三類:樹值型別、字串型別、日期時間型別,
- 數值型別
型別 | 大小 | 有符號(SIGNED)范圍 | 無符號(UNSIGNED)范圍 | 描述 |
---|---|---|---|---|
TINYINT | 1 byte | (-128, 127) | (0, 255) | 小整數值 |
SMALLINT | 2 bytes | (-32768, 32767) | (0, 65536) | 大整數值 |
MEDIUMINT | 3 bytes | (-8388608, 8388607) | (0, 16777215) | 大整數值 |
INT/INTEGER | 4 bytes | (-2147483648, 2147483647) | (0, 4294967295) | 大整數值 |
BIGINT | 8 bytes | (-2^63, 2^63 - 1) | (0, 2^64 - 1) | 極大整數值 |
FLOAT | 4 bytes | (-3.402823466 E+38, 3.402823466351 E+38) | 0和(1.175494351 E-38, 3.402823466 E + 38) | 單精度浮點數值 |
DOUBLE | 8 bytes | (-1.7976931348623157 E+308, 1.7976931348623157 E+308) | 0和(2.2250738585072014 E-308, 1.7976931348623157 E+308) | 雙精度浮點數值 |
DECIMAL | 依賴于M(精度)和D(標度)的值 | 依賴于M(精度)和D(標度)的值 | 小數值(精確定點數) |
案例1:年齡欄位,不會出現負數,而且人的年齡不會太大
age tintyint unsigned
案例2:分數,總分100分,最多出現一位小數
score double(4, 1)
- 字串型別
型別 | 大小 | 描述 |
---|---|---|
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 - 16777215 bytes | 二進制形式的中等長度文本 |
MEDIUMTEXT | 0 - 16777215 bytes | 中等長度文本資料 |
LONGBLOB | 0 - 4294967295 bytes | 二進制形式的極大文本資料 |
LONGTEXT | 0 - 4294967295 bytes | 極大文本資料 |
注:char與varchar都可以描述字串,char是定長字串,指定長度多少,就占用多少個字符,和欄位值的長度無關,而varchar是變長字串,指定的長度為最大占用長度,相對來說,char的性能會更高些
案例1:用戶名 username長度不定,最長不會超過50
username varchar(20)
案例2:性別 gender存盤值,不是男,就是女
gender char(1)
案例3:手機號 phone固定長度為11
phone char(11)
- 日期時間型別
型別 | 大小 | 范圍 | 格式 | 描述 |
---|---|---|---|---|
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
(6). 表操作案例
- 員工資訊表
設計一張員工資訊表,要求如下:
-
編號(純數字)
-
員工工號(字串型別,長度不超過10位)
-
員工姓名(字串型別,長度不超過10位)
-
性別(男/女,存盤一個漢字)
-
年齡(正常人年齡,不可能存盤負數)
-
身份證號(二代身份證號均為18位,身份證中有X這樣的字符)
-
入職時間(取值年月日即可)
create table yun3k_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 '員工表';
(7). 修改表
- 添加欄位
ALTER TABLE 表名 ADD 欄位名 型別 (長度) [ COMMENT 注釋 ] [ 約束 ];
案例1:為yun3k_emp表增加一個新的欄位”昵稱”為nickname,型別為varchar(20),
ALTER TABLE yun3k_emp ADD nickname varchar(20) COMMENT '昵稱';
- 修改資料型別
ALTER TABLE 表名 MODIFY 欄位名 新資料型別 (長度);
案例1:將yun3k_emp表的nickname欄位型別改為varchar(100),
ALTER TABLE yun3k_emp MODIFY nickname varchar(100);
- 修改欄位名和欄位型別
ALTER TABLE 表名 CHANGE 舊欄位名 新欄位名 型別 (長度) [ COMMENT 注釋 ] [ 約束 ];
案例1:將yun3k_emp表的nickname欄位修改為username,型別為varchar(30),
ALTER TABLE yun3k_emp CHANGE nickname username varchar(30) COMMENT '昵稱';
- 洗掉欄位
ALTER TABLE 表名 DROP 欄位名;
案例1:將yun3k_emp表的欄位username洗掉
ALTER TABLE yun3k_emp DROP username;
- 修改表名
ALTER TABLE 表名 RENAME TO 新表名;
案例1:將yun3k_emp表的表名修改為yun3k_employee,
ALTER TABLE yun3k_emp RENAME TO yun3k_employee;
(8). 洗掉表
- 洗掉表
DROP TABLE [ IF EXISTS ] 表名;
注:可選項 IF EXISTS 代表,只有表名存在時才會洗掉該表,表名不存在,則不執行洗掉操作(如果不加該引數項,洗掉一張不存在的表,執行將會報錯),
案例1:如果yun3k_user表存在,則洗掉yun3k_user表,
DROP TABLE IF EXISTS yun3k_user;
- 洗掉指定表,并重新創建表
TRUNCATE TABLE 表名;
注:在洗掉表的時候,表中的全部資料也都會被洗掉,
案例1:洗掉并重新創建yun3k_employee,
TRUNCATE TABLE yun3k_employee;
三. DML
DML英文全稱是Data Manipulation Language(資料庫操作語言),用來對資料庫中表的記錄進行增、刪、改操作,
-
添加資料(INSERT)
-
修改資料(UPDATE)
-
洗掉資料(DELETE)
1. 添加資料
(1). 給指定欄位添加資料
INSERT INTO 表名 (欄位名1, 欄位名2, ...) VALUES (值1, 值2, ...);
案例1:給yun3k_employee表所有的欄位添加資料,
insert into yun3k_employee(id,workno,name,gender,age,idcard,entrydate) values(1,'1','yun3k','男',10,'123456789012345678','2000-01-01');
(2). 給全部欄位添加資料
INSERT INTO 表名 VALUES (值1, 值2, ...);
案例1:給yun3k_employee表所有的欄位添加資料,
insert into yun3k_employee values(2,'2','yun3k_com','男',20,'123456789012345679','2020-01-01');
(3). 批量添加資料
INSERT INTO 表名 (欄位名1, 欄位名2, ...) VALUES (值1, 值2, ...), (值1, 值2, ...), (值 1, 值2, ...);
INSERT INTO 表名 VALUES (值1, 值2, ...), (值1, 值2, ...), (值1, 值2, ...);
案例1:批量插入資料到yun3k_employee表中
insert into yun3k_employee
values(3,'3','楊過','男',38,'123456789018845670','2005-01-01'),(4,'4','小龍女','女',40,'123477789018845670','2015-01-01');
注:
-
插入資料時,指定的欄位順序需要與值的順序是一一對應的,
-
字串和日期型資料應該包含在引號中,
-
插入的資料大小,應該在欄位的規定范圍內,
2. 修改資料
UPDATE 表名 SET 欄位名1 = 值1 , 欄位名2 = 值2 , .... [ WHERE 條件 ];
案例1:修改yun3k_employee表中id為1的資料,將name修改為yun3k_net,
update yun3k_employee set name = 'yun3k_net' where id = 1;
案例2:修改yun3k_employee表中id為1的資料,將name修改為黃蓉,gender修改為女,
update yun3k_employee set name = '黃蓉', gender = '女' where id = 1;
案例3:將所有的員工入職日期entrydate修改為2009-01-01,
update yun3k_employee set entrydate = '2009-01-01';
注:修改陳述句的條件可以有,也可以沒有,如果沒有條件,則會修改整張表的所有資料,
3. 洗掉資料
DELETE FROM 表名 [ WHERE 條件 ];
案例1:洗掉yun3k_employee表中gender為女的員工,
delete from yun3k_employee where gender = '女';
案例2:洗掉yun3k_employee表中的所有員工,
delete from yun3k_employee;
注:
-
DELETE 陳述句的條件可以有,也可以沒有,如果沒有條件,則會洗掉整張表的所有資料
-
DELETE 陳述句不能洗掉某一個欄位的值(可以使用UPDATE,將該欄位值置為NULL即可),
四. DQL
DQL英文全稱是Data Query Language(資料查詢語言),資料查詢語言是用來查詢資料庫中表的記錄
運行以下sql,準備資料:
drop table if exists yun3k_employee;
create table yun3k_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 yun3k_emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (1, '00001', '柳巖666', '女', 20, '123456789012345678', '北京', '2000-01-01');
INSERT INTO yun3k_emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (2, '00002', '張無忌', '男', 18, '123456789012345670', '北京', '2005-09-01');
INSERT INTO yun3k_emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (3, '00003', '韋一笑', '男', 38, '123456789712345670', '上海', '2005-08-01');
INSERT INTO yun3k_emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (4, '00004', '趙敏', '女', 18, '123456757123845670', '北京', '2009-12-01');
INSERT INTO yun3k_emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (5, '00005', '小昭', '女', 16, '123456769012345678', '上海', '2007-07-01');
INSERT INTO yun3k_emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (6, '00006', '楊逍', '男', 28, '12345678931234567X', '北京', '2006-01-01');
INSERT INTO yun3k_emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (7, '00007', '范瑤', '男', 40, '123456789212345670', '北京', '2005-05-01');
INSERT INTO yun3k_emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (8, '00008', '黛綺絲', '女', 38, '123456157123645670', '天津', '2015-05-01');
INSERT INTO yun3k_emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (9, '00009', '范涼涼', '女', 45, '123156789012345678', '北京', '2010-04-01');
INSERT INTO yun3k_emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (10, '00010', '陳友諒', '男', 53, '123456789012345670', '上海', '2011-01-01');
INSERT INTO yun3k_emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (11, '00011', '張士誠', '男', 55, '123567897123465670', '江蘇', '2015-05-01');
INSERT INTO yun3k_emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (12, '00012', '常遇春', '男', 32, '123446757152345670', '北京', '2004-02-01');
INSERT INTO yun3k_emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (13, '00013', '張三豐', '男', 88, '123656789012345678', '江蘇', '2020-11-01');
INSERT INTO yun3k_emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (14, '00014', '滅絕', '女', 65, '123456719012345670', '西安', '2019-05-01');
INSERT INTO yun3k_emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (15, '00015', '胡青牛', '男', 70, '12345674971234567X', '西安', '2018-04-01');
INSERT INTO yun3k_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. 基礎查詢
(1). 查詢多個欄位
SELECT 欄位1, 欄位2, 欄位3 ... FROM 表名;
SELECT * FROM 表名;
注: 號代表查詢所有欄位,在實際開發中盡量少用(不直觀、影響效率),*
案例1:查詢yun3k_emp指定欄位 name,workno,age并回傳
select name,workno,age from yun3k_emp;
案例2:查詢回傳所有欄位
select id ,workno,name,gender,age,idcard,workaddress,entrydate from yun3k_emp;
select * from yun3k_emp;
(2). 欄位設定別名
SELECT 欄位1 [ AS 別名1 ] , 欄位2 [ AS 別名2 ] ... FROM 表名;
SELECT 欄位1 [ 別名1 ] , 欄位2 [ 別名2 ] ... FROM 表名;
案例1:查詢所有員工的作業地址,起別名
select workaddress as '作業地址' from yun3k_emp;
-- as可以省略
select workaddress '作業地址' from yun3k_emp;
(3). 去除重復記錄
SELECT DISTINCT 欄位串列 FROM 表名;
案例1:查詢公司員工的上班地址有哪些(不要重復)
select distinct workaddress '作業地址' from yun3k_emp;
3. 條件查詢
(1). 語法
SELECT 欄位串列 FROM 表名 WHERE 條件串列;
(2). 條件
比較運算子 | 功能 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
= | 等于 |
<> 或 != | 不等于 |
BETWEEN ... AND ... | 在某個范圍之內(含最小、最大值) |
IN(...) | 在in之后的串列中的值,多選一 |
LIKE 占位符 | 模糊匹配(_匹配單個字符,%匹配任意個字符) |
IS NULL | 是NULL |
邏輯運算子 | 功能 |
---|---|
AND 或 && | 并且(多個條件同時成立) |
OR 或 || | 或者(多個條件任意一個成立) |
NOT 或 ! | 非,不是 |
案例1:查詢年齡等于88的員工
select * from yun3k_emp where age = 88;
案例2:查詢年齡小于20的員工資訊
select * from yun3k_emp where age < 20;
案例3:查詢年齡小于等于20的員工資訊
select * from yun3k_emp where age <= 20;
案例4:查詢沒有身份證號的員工資訊
select * from yun3k_emp where idcard is null;
案例5:查詢有身份證號的員工資訊
select * from yun3k_emp where idcard is not null;
案例6:查詢年齡不等于88的員工資訊
select * from yun3k_emp where age != 88;
select * from yun3k_emp where age <> 88;
案例7:查詢年齡在15歲(包含)到20歲(包含)之間的員工資訊
select * from yun3k_emp where age >= 15 && age <= 20;
select * from yun3k_emp where age >= 15 and age <= 20;
select * from yun3k_emp where age between 15 and 20;
案例8:查詢性別為 女 且年齡 小于 5歲的員工資訊
select * from yun3k_emp where gender = '女' and age < 25;
案例9:查詢年齡等于18或20或40的員工資訊
select * from yun3k_emp where age = 18 or age = 20 or age =40;
select * from yun3k_emp where age in(18,20,40);
案例10:查詢姓名為兩個字的員工資訊
select * from yun3k_emp where name like '__';
案例11:查詢身份證號最后一位是X的員工資訊
select * from yun3k_emp where idcard like '%X';
select * from yun3k_emp where idcard like '_________________X';
4. 聚合函式
(1). 語法
SELECT 聚合函式(欄位串列) FROM 表名;
注:NULL值是不參與所有聚合函式運算的
(2). 常見的聚合函式
函式 | 功能 |
---|---|
count | 統計數量 |
max | 最大值 |
min | 最小值 |
avg | 平均值 |
sum | 求和 |
案例1:統計該企業員工數量
select count(*) from yun3k_emp; -- 統計的是總記錄數
select count(idcard) from yun3k_emp; -- 統計的是idcard欄位不為null的記錄數
注:對于count聚合函式,統計符合條件的總記錄數,還可以通過count(數字/字串)進行統計查詢,比如:
select count(1) from yun3k_emp;
案例2:統計該企業員工的平均年齡
select avg(age) from yun3k_emp;
案例3:統計該企業員工的最大年齡
select max(age) from yun3k_emp;
案例4:統計該企業員工的最小年齡
select min(age) from yun3k_emp;
案例5:統計西安地區員工的年齡之和
select sum(age) from yun3k_emp where workaddress = '西安';
5. 分組查詢
(1). 語法
SELECT 欄位串列 FROM 表名 [ WHERE 條件 ] GROUP BY 分組欄位名 [ HAVING 分組 后過濾條件 ];
(2). where和having區別
-
執行時機不同:where是分組之前進行過濾,不滿足where條件,不參與分組;而having是分組之后對結果進行過濾,
-
判斷條件不同:were不能對聚合函式進行判斷,而having可以,
注:
-
分組之后,查詢的欄位一般為聚合函式和分組欄位,查詢其他欄位無任何意義
-
執行順序:where > 聚合函式 > having
-
支持多欄位分組,具體語法為:group by columnA, columnB
案例1:根據性別分組,統計男性員工和女性員工的數量
select gender, count(*) from yun3k_emp group by gender;
案例2:根據性別分組,統計男性員工和女性員工的平均年齡
select gender, avg(age) from yun3k_emp group by gender;
案例3:查詢年齡小于45的員工,并根據作業地址分組,獲取員工數量大于等于3的作業地址
select workaddress, count(*) address_count from yun3k_emp where age < 45 group by workaddress having address_count >= 3;
案例4:統計各個作業地址上班的男性及女性員工的數量
select workaddress, gender, count(*) '數量' from yun3k_emp group by gender , workaddress;
6. 排序查詢
(1). 語法
SELECT 欄位串列 FROM 表名 ORDER BY 欄位1 排序方式1 , 欄位2 排序方式2;
(2). 排序方式
-
ASC:升序(默認值)
-
DESC:降序
注:
-
如果是升序,可以不指定排序方式ASC;
-
如果是多欄位排序,當第一個欄位值相同時,才會根據第二個欄位進行排序
案例1:根據年齡對公司的員工進行升序排序
select * from yun3k_emp order by age asc;
select * from yun3k_emp order by age;
案例2:根據入職時間,對員工進行降序排序
select * from yun3k_emp order by entrydate desc;
案例3:根據年齡對公司的員工進行升序排序,年齡相同,再按照入職時間進行降序排序
select * from yun3k_emp order by age asc, entrydate desc;
7. 分頁查詢
(1). 語法
SELECT 欄位串列 FROM 表名 LIMIT 起始索引, 查詢記錄數;
注:
-
起始索引從0開始,起始索引 = (查詢頁碼 - 1) 每頁顯示記錄數,*
-
分頁查詢是資料庫的方言,不同的資料庫有不同的實作,Mysql中是LIMIT,
-
如果查詢的是第一頁資料,起始索引可以省略,直接簡寫為 limit 10,
案例1:查詢第1頁員工資料,每頁展示10條記錄
select * from yun3k_emp limit 0,10;
select * from yun3k_emp limit 10;
案例2:查詢第2頁員工資料,每頁展示10條記錄((頁碼 - 1) 頁展示記錄數)*
select * from yun3k_emp limit 10,10;
8. 綜合案例
(1). 查詢年齡為20,21,22,23歲的員工資訊,
select * from yun3k_emp where gender = '女' and age in(20,21,22,23);
(2).查詢性別為男,并且年齡在20-40歲(含)以內的姓名為三個字的員工,
select * from yun3k_emp where gender = '男' and (age between 20 and 40) and name like '___';
(3).統計員工表中,年齡小于60歲的,男性員工和女性員工的人數
select gender, count(*) from yun3k_emp where age < 60 group by gender;
(4).查詢所有年齡小于等于35歲員工的姓名和年齡,并對查詢結果按年齡升序排序,如果年齡相同按入職時間將序排序
select name, age from yun3k_emp where age <= 35 order by age asc , entrydate desc;
(5). 查詢性別為男,且年齡為20-40歲(含)以內的前5個員工資訊,對查詢的結果按年齡升序排序,年齡相同按入職時間升序排序,
select * from yun3k_emp where gender = '男' and age between 20 and 40 order by age asc , entrydate asc limit 5;
9. 執行順序
驗證:
查詢年齡大于15的員工姓名、年齡,并根據年齡進行升序排序,
select name, age from yun3k_emp where age > 15 order by age asc;
在查詢時,我們給yun3k_emp表起一個別名 e,然后在select及where中使用該別名,
select e.name, e.age from yun3k_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 yun3k_emp e where eage > 15 order by age asc;
執行上述sql報錯了:
由此我們可以得出結論:from先執行,然后執行where,再執行select,
接下來,我們再執行如下SQL陳述句,查看執行效果:
select e.name ename , e.age eage from yun3k_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 '密碼';
案例1:創建一個名為"yun3k"的用戶,設定密碼為”123456”,并且只能本地訪問,
CREATE USER 'yun3k'@'localhost' IDENTIFIED BY '123456';
案例2:創建一個名為”yun3k_com”的用戶,可以在任意主機訪問該資料庫
CREATE USER 'yun3k_com'@'%' IDENTIFIED BY '123456';
(3).修改用戶密碼
ALTER USER '用戶名'@'主機名' IDENTIFIED WITH mysql_native_password BY '新密碼';
案例1:修改”yun3k”的用戶密碼為”654321”,
ALTER USER 'yun3k'@'localhost' IDENTIFIED WITH mysql_native_password BY '654321';
(4). 洗掉用戶
DROP USER '用戶名'@'主機名' ;
案例1:洗掉”yun3k”用戶,
DROP USER 'yun3k'@'localhost';
注:
-
在Mysql中需要通過用戶名@主機名的方式來唯一標識一個用戶,
-
主機名可以使用%通配,
2. 權限控制
常用權限如下:
權限 | 說明 |
---|---|
ALL,ALL PRIVILEGES | 所有權限 |
SELECT | 查詢資料 |
INSERT | 插入資料 |
UPDATE | 修改資料 |
DELETE | 洗掉資料 |
ALTER | 修改表 |
DROP | 洗掉資料庫/表 |
CREATE | 創建資料庫/表 |
(1). 查詢權限
SHOW GRANTS FOR '用戶名'@'主機名' ;
案例1:查詢'yun3k_com'@'%'用戶的權限
SHOW GRANTS FOR 'yun3k_com'@'%' ;
(2). 授予權限
GRANT 權限串列 ON 資料庫名.表名 TO '用戶名'@'主機名';
案例1:授予'yun3k_com'@'%'用戶yun3k資料庫所有表的所有操作權限
grant all on yun3k.* to 'yun3k_com'@'%';
(3). 撤銷權限
REVOKE 權限串列 ON 資料庫名.表名 FROM '用戶名'@'主機名';
案例1:撤銷'yun3k_com'@'%'用戶的yun3k資料庫的所有權限
revoke all on yun3k.* from 'yun3k_com'@'%';
注:
-
多個權限之間,使用逗號分隔
-
授權事時,資料庫名和表名可以使用*進行通配,代表所有
更多mysql學習請關注微信公眾號”云哥技術yun3k”,回復”mysql學習”,免費領取mysql全套學習資料,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/556564.html
標籤:MySQL
上一篇:es 筆記二之基礎查詢
下一篇:返回列表