文章目錄
- 《MySQL從入門到精通》
- 1. 基礎-SQL通用語法及分類
- 2. 基礎-SQL-DDL-數據庫操作
- 3. 基礎-SQL-DDL-表操作-創建&查詢
- 4. 基礎-SQL-DDL-數據類型及案例
- 4.1 數值類型
- 4.2 字符串類型
- 4.3 時間和日期類型
- 5. 基礎-SQL-DDL-表操作-修改&刪除
- 5.1 DDL-表操作-修改
- 5.2 DDL-表操作-刪除
- 6. 基礎-SQL-DML-添加表數據insert
- 7. 基礎-SQL-DML-修改表數據update
- 8. 基礎-SQL-DML-刪除表數據delete
- 9. 基礎-SQL-DQL-數據查詢
- 9.1基礎-SQL-DQL-基本查詢
- 9.2 基礎-SQL-DQL-條件查詢
- 9.3 基礎-SQL-DQL-分組查詢
- 9.4 基礎-SQL-DQL-排序查詢
- 9.5 基礎-SQL-DQL-分頁查詢
- 9.6 基礎-SQL-DQL-案例
- 10.Mysql-多表設計-一對多
- 11.Mysql-多表設計-一對多-外鍵
- 12.Mysql-多表設計-一對一&一對多
- 13.Mysql-多表查詢-概述
- 14.Mysql-多表查詢-內連接
- 15.Mysql-多表查詢-外連接
- 16.Mysql-多表查詢-子查詢(標量、列)
- 17.Mysql-多表查詢-子查詢(行、表)
- 18.Mysql-多表查詢-案例1
- 19.Mysql-事務-介紹與操作
- 20.Mysql-事務-四大特性
- 21.Mysql-索引-介紹
- 22.MySQL-索引-結構
- 23. MySQL-索引-語法
《MySQL從入門到精通》
1. 基礎-SQL通用語法及分類
-
SOL通用語法
- SOL語句可以單行或多行書寫,以分號結尾;
- SOL語句可以使用空格/縮進來增強語句的可讀性;
- MySQL數據庫的SQL語句不區分大小寫,關鍵字建議使用大寫;
- 注釋:
- 單行注釋:–注釋內容 或 #注釋內容(MySQL特有)
- 多行注釋: /*注釋內容 */
-
SQL分類
-
DDL(Data Definition Language)
:(數據定義語言,用來定義數據庫對象(數據庫,表,字段)) -
DML(Data Manipulation Language)
:數據操作語言,用來對數據庫表中的數據進行增刪改 -
DQL(Data Query Language)
:數據查詢語言,用來查詢數據庫中表的記錄 -
DCL(Data Control Language)
:數據控制語言,用來創建數據庫用戶、控制數據庫的訪問權限
-
2. 基礎-SQL-DDL-數據庫操作
問題記錄:ssh無法登錄,問題原因ssh服務無法啟動,權限受限
解決過程:
- 使用
ssh -t
命令查看原因- 使用
# chmod 600 /var/empty/sshd
添加權限(只能是600 的權限狀態才可以)- 使用
# systemctl restart sshd.service
重啟服務- 使用
# systemctl status sshd.service
查看狀態
- DDL-數據庫操作
- 查詢
- 查詢所有數據庫:
SHOW DATABASES;
- 查詢當前數據庫:
SELECT DATABASE();
- 查詢所有數據庫:
- 創建
CREATE DATABASE [IF NOT EXISTS] 數據庫名 [DEFAULT CHARSET 字符集] [COLLATE 排序規則];
- 刪除
DROP DATABASE [IF EXISTS] 數據庫名;
- 使用
USE 數據庫名;
- 查詢
3. 基礎-SQL-DDL-表操作-創建&查詢
-
DDL-表操作-查詢
- 查詢當前數據庫所有表 :
SHOW TABLES;
- 查詢表結構 :
DESC 表名;
- 查詢指定表的建表語句:
SHOW CREATE TABLE 表名;
- 查詢當前數據庫所有表 :
-
DDL-表操作-創建
CREATE TABLE 表名(字段1 字段1類型[COMMENT 字段1注釋],字段2 字段2類型[COMMENT 字段2注釋],字段3 字段3類型[COMMENT 字段3注釋],字段n 字段n類型[COMMENT 字段n注釋] )[COMMENT 表注釋];
mysql> create table tb_user( mysql> id int comment "編號", mysql> name varchar(50) comment "姓名", mysql> age int comment "年齡", mysql> gender varchar(1) comment "性別" mysql> ) comment "用戶表";
- 注意:[…]為可選參數,最后一個字段后面沒有逗號,并且所有符號都是英文。
-
DDL-表操作-約束
-
概念:約束是作用于表中字段上的規則,用于限制存儲在表中的數據。
-
目的:保證數據庫中數據的正確性、有效性和完整性。
-
常見約束
- 非空約束(not null):限制該字段值不能為null
- 唯一約束(unique):保證字段的所有數據都是唯一、不重復的,
- 主鍵約束(primary key):主鍵是一行數據的唯一標識,要求非空且唯一
- 默認約束(default):保存數據時,如果未指定該字段值,則采用默認值
- 外鍵約束(foreign key):讓兩張表的數據建立連接,保證數據的一致性和完整性
-
4. 基礎-SQL-DDL-數據類型及案例
4.1 數值類型
4.2 字符串類型
4.3 時間和日期類型
- 案例:創建一張員工表
create table employe(id int comment "編號",name varchar(10) comment "姓名",gender char(1) comment "性別",age tinyint unsigned comment "年齡",idcard char(18) comment "身份證號",entrydate date comment "入職時間") comment "員工表";
5. 基礎-SQL-DDL-表操作-修改&刪除
5.1 DDL-表操作-修改
-
添加字段:
ALTER TABLE 表名 ADD 字段名 類型 (長度) [COMMENT 注釋] [約束];
- 案例:為employe表增加一個新的字段”昵稱”為nickname,類型為varchar(20)
mysql> alter table employe add nickname varchar(20) comment "昵稱";
-
修改數據類型
ALTER TABLE 表名 MODIFY 字段名 新數據類型(長度);
-
修改字段名和字段類型
ALTER TABLE 表名 CHANGE 舊字段名 新字段名 類型(長度)[COMMENT 注釋][約束];
- 案例:將employe表的nickname字段修改為username,類型為varchar(30)
mysql> alter table employe change nickname username varchar(30) comment "用戶名";
-
刪除字段
ALTER TABLE 表名 DROP 字段名;
- 案例:將employe表的字段username刪除
mysql> alter table employe drop nickname;
-
修改表名
ALTER TABLE 表名 RENAME TO 表名;
- 案例:將employe表的表名修改為emp。
mysql> alter table employe rename to emp;
5.2 DDL-表操作-刪除
- 刪除表
DROP TABLE [IF EXISTS] 表名;
mysql> drop table if exists tb_user;
- 刪除指定表,并重新創建該表
TRUNCATE TABLE 表名;
mysql> truncate table emp;
- 注意:
TRUNCATE TABLE 表名;
是刪除并重建,重建后的表為空表,原有內容已經被刪除。
6. 基礎-SQL-DML-添加表數據insert
-
指定字段添加數據:
insert into 表名(字段名1,字段名2) values(值1,值2);
INSERT INTO tb_emp (username,name,gender,create_time,update_time) VALUES ('wuji2','張無忌2',1,NOW(),NOW());
-
全部字段添加數據:
insert into values(值1,值2,值3......);
INSERT into tb_emp VALUES(null,'zhiruo2','123','周芷若2',1,'1.jpg',1,'2020-01-01',NOW(),NOW());
-
批量添加數據(指定字段):
insert into 表名 (字段1,字段2) values(值1,值2),(值1,值2);
INSERT INTO tb_emp (username,name,gender,create_time,update_time) VALUES ('xieshiwang','謝遜',1,NOW(),NOW()),('wufuwang','韋一笑',1,NOW(),NOW()),('wuji3','張無忌3',1,NOW(),NOW());
-
批量添加數據(全部字段):
insert into 表名 values(值1,值2,值3......)(值1,值2,值3......);
INSERT into tb_emp VALUES(null,'zhiruo8','123','周芷若8',1,'1.jpg',1,'2020-01-01',NOW(),NOW()),(null,'zhiruo9','123','周芷若9',1,'1.jpg',1,'2020-01-01',NOW(),NOW());
7. 基礎-SQL-DML-修改表數據update
update 表名 set 字段名1 = 值1,字段名2 = 值2,字段名3 = 值3,......[where 條件];
UPDATE tb_emp SET name= '張三',update_time = NOW() WHERE id = 1;
8. 基礎-SQL-DML-刪除表數據delete
- 刪除數據:
delete from 表名 [where 條件];
DELETE FROM tb_emp WHERE id = 22;
9. 基礎-SQL-DQL-數據查詢
- DQL:Data Query Language (數據查詢語言),用于查詢數據表中的數據。
- 基本查詢:
select 字段1,字段2 from 表名;
- 條件查詢:
select 字段1,字段2 from 表名 where 條件列表;
- 分組查詢:
- 排序查詢:
- 分頁查詢:
9.1基礎-SQL-DQL-基本查詢
- 查詢返回指定字段
SELECT `name`,entrydate FROM tb_emp;
- 查詢返回所有字段
SELECT id, username, `password`, `name`,gender,image,job,entrydate,create_time,update_time FROM tb_emp; -- 或者 SELECT * FROM tb_emp;
- 別名應用
SELECT `name` AS '姓名',entrydate AS '入職日期' FROM tb_emp; -- AS關鍵字可以省略 SELECT `name` '姓名',entrydate '入職日期' FROM tb_emp;
- DISTINCT關鍵字,去除重復
SELECT DISTINCT job FROM tb_emp;
9.2 基礎-SQL-DQL-條件查詢
- 查詢姓名為楊逍的員工
SELECT * FROM tb_emp WHERE name = '楊逍';
- 查詢ID小于等于5的員工信息
SELECT * FROM tb_emp WHERE id <= 5;
- 查詢沒有分配職位的員工信息
SELECT * FROM tb_emp WHERE job IS NULL;
- 查詢有職位的員工信息
SELECT * FROM tb_emp WHERE job IS NOT NULL;
- 查詢密碼字段不是“123456”的員工信息
SELECT * FROM tb_emp WHERE `password` != '123456'; 或 SELECT * FROM tb_emp WHERE `password` <> '123456';
- 查詢入職日期在’2000-01-01’(包含) 到 ‘2010-01-01’(包含) 之間的員工信息
SELECT * FROM tb_emp WHERE entrydate BETWEEN '2000-01-01' AND '2010-01-01'; 或 SELECT * FROM tb_emp WHERE entrydate >= '2000-01-01' && entrydate <= '2010-01-01';
- 查詢 入職日期 在’2000-01-01’(包含) 到 ‘2010-01-01’(包含) 之間 且 性別為女性的員工信息
SELECT * FROM tb_emp WHERE entrydate BETWEEN '2000-01-01' AND '2010-01-01' && gender = 2;
- 查詢職位是 2(講師),3(學工主管),4(教研主管)的員工信息
SELECT * FROM tb_emp WHERE job IN(2,3,4); 或 SELECT * FROM tb_emp WHERE job=1 || job=2 || job=3; 或 SELECT * FROM tb_emp WHERE job=1 OR job=2 OR job=3;
- 查詢 姓名 為兩個字的員工信息
SELECT * FROM tb_emp WHERE `name` LIKE '__';
- 查詢 姓"張"的員工信息
SELECT * FROM tb_emp WHERE `name` LIKE '張%';
9.3 基礎-SQL-DQL-分組查詢
- 聚合函數:將一列數據作為一個整體,進行縱向計算;
- 語法:
select 聚合函數(字段列表) from 表名
- 統計改企業員工的數量
A.count(字段),不能統計null值,需要統計非空字段才能統計準確 SELECT count(job) FROM tb_emp;
-- B.count(常量) SELECT COUNT(1) FROM tb_emp;
-- C.count(*)-推薦 SELECT COUNT(*) FROM tb_emp;
- 統計企業最早入職的員工
SELECT MIN(entrydate) FROM tb_emp;
- 統計企業最遲入職的員工
SELECT MAX(entrydate) FROM tb_emp;
- 統計該企業員工ID的平均值
SELECT AVG(id) FROM tb_emp;
- 統計該企業員工ID的和
SELECT SUM(id) FROM tb_emp;
- 分組查詢語法
select 字段列表 from 表名 [where 條件] group by 分組字段名 [having 分組后過濾條件];
- where與having區別
- 執行時機不同:where是分組之前進行過濾,不滿足where條件,不參與分組;而having是分組之后對結果進行過濾。
- 判斷條件不同:where不能對聚合函數進行判斷,而having可以。
- 注意事項
- 分組之后,查詢的字段一般為聚合函數和分組字段,查詢其他字段無任何意義。
- 執行順序: where >聚合函數>having 。
9.4 基礎-SQL-DQL-排序查詢
- 條件查詢:
select 字段列表 from 表名 [where 條件列表] order by 字段1 排列方式1,字段1 排列方式2;
- 排列方式:ASC 升序 DESC 降序
-
根據入職時間,對員工進行升序排序
SELECT * FROM tb_emp ORDER BY entrydate ASC;
-
根據入職時間,對員工進行降序排序
SELECT * FROM tb_emp ORDER BY entrydate DESC;
-
根據入職時間,對員工進行升序排序,排序后如果入職時間相同,再按照更新時間進行降序排序
SELECT * FROM tb_emp ORDER BY entrydate ASC, update_time DESC;
- 注意:如果是多字段排序,當第一個字段值相同時,才會根據第二個字段進行排序。
9.5 基礎-SQL-DQL-分頁查詢
- 語法:
select 字段列表 from 表名 limit 起始索引,查詢記錄數;
- 從起始索引0 開始查詢員工數據,每頁展示5條記錄
SELECT * FROM tb_emp LIMIT 0,5;
- 查詢 第1頁員工數據 每頁展示5條記錄;
SELECT * FROM tb_emp LIMIT 0,5;
- 查詢 第2頁員工數據 每頁展示5條記錄;
SELECT * FROM tb_emp LIMIT 5,5;
- 查詢 第3頁員工數據 每頁展示5條記錄;
SELECT * FROM tb_emp LIMIT 10,5;
- 起始索引 = (頁碼 - 1)*每頁展示記錄數;
- 如果查詢的是第一頁數據,起始索引可以省略;
9.6 基礎-SQL-DQL-案例
- 案例1:
- 按要求完成員工管理的條件分頁查詢,根據輸入條件,查詢第1頁數據,每頁展示10條記錄
- 輸入條件
- 姓名:張
- 性別:男
- 入職時間:2000-01-01 2015-12-31
SELECT * FROM tb_emp WHERE name LIKE '%張%'AND gender = 1AND entrydateBETWEEN '2000-01-01' AND '2015-12-31' ORDER BY update_time DESC LIMIT 10,10;
- 案例2
- 案例2-1 : 根據需求,完成員工性別統計 - count(*)
- if流程函數:
if (表達式,tvalue, fvalue)
:當前表達式的是為true時,取值tvalue,當前 表達式的值為false時,取值為fvalue;
SELECT IF(gender = 1,'男性員工','女性員工')性別,gender,COUNT(*) FROM tb_emp GROUP BY gender;
- 案例2-2 : 根據需求完成員工職位信息的統計;
- case流程函數:
case expr when value1 then result1 [when value2 then result2]...[else result] end
SELECT (CASE job WHEN 1 THEN '班主任' WHEN 2 THEN'講師' WHEN 3 THEN '學工主管' WHEN 4 THEN '教研主管' ELSE '未分配職位'END) AS 職位, COUNT(*) FROM tb_emp GROUP BY job;
10.Mysql-多表設計-一對多
- 項目開發中,在進行數據庫表結構設計時,會根據業務需求及業務模塊之間的關系,分析并設計表結構,由于業務之間相互關聯,所以各個表結構之間也存在著各種聯系,基本上分為三種:
- 一對多(多對一)
- 多對多
- 一對一
- 一對多表設計案例:根據 頁面原型 及 需求文檔 ,完成部門及員工模塊的表結構設計。
CREATE TABLE tb_emp (id INT UNSIGNED PRIMARY KEY auto_increment COMMENT 'ID',username VARCHAR(20) NOT NULL UNIQUE COMMENT '用戶名',password VARCHAR(32) DEFAULT '123456' COMMENT '密碼',name VARCHAR(10) NOT NULL COMMENT '姓名',gender TINYINT UNSIGNED NOT NULL COMMENT '性別,說明,1 男,1 女',image VARCHAR(300) COMMENT '圖像',job TINYINT UNSIGNED COMMENT '職位,說明 1 班主任,2 講師, 3 學工主管 4 教研主管',entrydate DATE COMMENT '入職時間',dept_id INT UNSIGNED COMMENT '部門ID',create_time datetime NOT NULL COMMENT '創建時間',update_time datetime NOT NULL COMMENT '修改時間'
) COMMENT '員工表';create table tb_dept(id int unsigned primary key auto_increment COMMENT 'ID',name varchar(10) NOT NULL UNIQUE COMMENT '部門名稱',create_time datetime NOT NULL COMMENT '創建時間',update_time datetime NOT NULL COMMENT '修改時間'
)comment '部門表'
- 一對多關系實現:在數據庫表中多的一方,添加字段,來關聯一的一方的主鍵,例如以上案例tb_emp表中的部門字段,關聯 tb_dept表中的’ID’主鍵字段。
11.Mysql-多表設計-一對多-外鍵
-
創建表時指定
create table 表名( 字段名 數據類型 ... [constraint] [外鍵名稱] foreign key (外鍵字段名) references 主表 (字段名) );
-
建完表后,添加外鍵
alter table 表名 add constraint 外鍵名稱 foreign key(外鍵字段名)references 主表(字段名);
-
案例
ALTER TABLE `db03`.`tb_emp` ADD CONSTRAINT `tb_emp_fk_tb_dept` FOREIGN KEY (`dept_id`) REFERENCES `db03`.`tb_dept` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT;
12.Mysql-多表設計-一對一&一對多
- 案例:用戶 與 身份證信息 的關系(一對一)
- 關系:一對一關系,多用于單表拆分,將一張表的基礎字段放在一張表中,其他字段放在另一張表中,以提升操作效率
-- ===========================================一對一=====================================
create table tb_user(id int unsigned primary key auto_increment comment 'ID',name varchar(10) not null comment '姓名',gender tinyint unsigned not null comment '性別, 1 男 2 女',phone char(11) comment '手機號',degree varchar(10) comment '學歷'
) comment '用戶信息表';insert into tb_user values (1,'白眉鷹王',1,'18812340001','初中'),(2,'青翼蝠王',1,'18812340002','大專'),(3,'金毛獅王',1,'18812340003','初中'),(4,'紫衫龍王',2,'18812340004','碩士');create table tb_user_card(id int unsigned primary key auto_increment comment 'ID',nationality varchar(10) not null comment '民族',birthday date not null comment '生日',idcard char(18) not null comment '身份證號',issued varchar(20) not null comment '簽發機關',expire_begin date not null comment '有效期限-開始',expire_end date comment '有效期限-結束',user_id int unsigned not null unique comment '用戶ID',constraint fk_user_id foreign key (user_id) references tb_user(id)
) comment '用戶信息表';insert into tb_user_card values (1,'漢','1960-11-06','100000100000100001','朝陽區公安局','2000-06-10',null,1),(2,'漢','1971-11-06','100000100000100002','靜安區公安局','2005-06-10','2025-06-10',2),(3,'漢','1963-11-06','100000100000100003','昌平區公安局','2006-06-10',null,3),(4,'回','1980-11-06','100000100000100004','海淀區公安局','2008-06-10','2028-06-10',4);
- 案例: 學生 與 課程的關系(多對多)
- 關系:一個學生可以選修多門課程,一門課程也可以供多個學生選擇實現:建立第三張中間表,中間表至少包含兩個外鍵,分別關聯兩方主鍵
-- ======================================多對多=============================
create table tb_student(id int auto_increment primary key comment '主鍵ID',name varchar(10) comment '姓名',no varchar(10) comment '學號'
) comment '學生表';
insert into tb_student(name, no) values ('黛綺絲', '2000100101'),('謝遜', '2000100102'),('殷天正', '2000100103'),('韋一笑', '2000100104');create table tb_course(id int auto_increment primary key comment '主鍵ID',name varchar(10) comment '課程名稱'
) comment '課程表';
insert into tb_course (name) values ('Java'), ('PHP'), ('MySQL') , ('Hadoop');create table tb_student_course(id int auto_increment comment '主鍵' primary key,student_id int not null comment '學生ID',course_id int not null comment '課程ID',constraint fk_courseid foreign key (course_id) references tb_course (id),constraint fk_studentid foreign key (student_id) references tb_student (id)
)comment '學生課程中間表';insert into tb_student_course(student_id, course_id) values (1,1),(1,2),(1,3),(2,2),(2,3),(3,4);
13.Mysql-多表查詢-概述
- 多表查詢:是指從多張表中查詢數據;
- 笛卡爾積:笛卡爾積乘積是指在數學中,兩個集合(A集合和B集合)的所有情況;
- 多表查詢分類:
- 內連接:相當于查詢A、B交集部分數據;
- 外連接
- 左外連接:查詢左表所有的數據(包括兩張表交集部分數據);
- 右外連接:查詢右表所有的數據(包括兩張表交集部分數據);
- 子查詢
14.Mysql-多表查詢-內連接
- 隱式內連接:
select 字段列表 from 表1,表2 where 條件...;
- 顯式內連接:
select 字段列表 from 表1 [inner] join 表2 on 連接條件;
- 舉例:
-- --------多表查詢:隱式內連接----------- select tb_emp.`name`,tb_dept.`name` from tb_emp,tb_dept where tb_emp.dept_id = tb_dept.id;-- --------多表查詢:顯式內連接----------- select tb_emp.`name`,tb_dept.`name` from tb_emp inner join tb_dept on tb_emp.dept_id = tb_dept.id;
- 多表查詢中為了書寫方便可以給表起別名:
select e.`name`,d.`name` from tb_emp e,tb_dept d where e.dept_id = d.id;
15.Mysql-多表查詢-外連接
- 左外連接語法:
select 字段列表 from 表1 left [outer] join 表2 on 連接條件....;
- 右外連接語法:
select 字段列表 from 表1 rigth [outer] join 表2 on 連接條件...;
- 舉例
-- --------多表查詢:左外連接----------- -- 查詢員工表 所有 員工的姓名,和對應的部門名稱 select e.`name`,d.`name` from tb_emp e left outer join tb_dept d on e.dept_id = d.id;-- --------多表查詢:右外連接----------- -- 查詢部門表 所有 部門的名稱,和對應員工的名稱 select e.`name`,d.`name` from tb_emp e right outer join tb_dept d on e.dept_id = d.id;
16.Mysql-多表查詢-子查詢(標量、列)
- 子查詢概述:
- 介紹:SQL語句中嵌套select語句,稱為嵌套查詢,又稱子查詢。
- 形式:
select *from tl where column1=(select column1 from t2 ... );
- 子查詢外部的語句可以是insert/update/delete/select 的任何一個,最常見的是 select。
- 子查詢的分類
- 標量子查詢:子查詢返回的結果為單個值;
- 列子查詢:子查詢返回的結果為一列;
- 行子查詢:子查詢返回的結果為一行;
- 表子查詢:子查詢返回的結果為多行多列;
- 標量子查詢
- 子查詢返回的結果是單個值(數字、字符串、日期等),最簡單的形式
- 常用的操作符:
= <> > >= < <=
- 舉例1
-- -------標量子查詢-------- -- 1.查詢"教研部"所有的員工信息-- 1.1 查詢 "教研部" 的idselect id from tb_dept where `name`="教研部";-- 1.2 使用“教研部”的id,查詢“教研部”所有的員工select * from tb_emp where dept_id = 2;-- 1.3 將以上兩個查詢合成一個,因為子查詢只返回一個值,所以叫做標量子查詢 select * from tb_emp where dept_id = (select id from tb_dept where `name`="教研部");
- 舉例2:
-- 2.查詢在“方東白”入職之后的員工信息-- 2.1 查詢“方東白”入職的日期select entrydate from tb_emp where `name`= "方東白";-- 2.2 使用“東方東白”入職日期作為條件,查詢在“東方白”入職之后的員工信息select * from tb_emp where entrydate > "2012-11-01";-- 2.3 以上兩個查詢語句合成1個select * from tb_emp where entrydate > (select entrydate from tb_emp where `name`= "方東白");
- 列子查詢
- 子查詢返回的結果是一列(可以是多行);
- 常用的操作符:
in、not in
等; - 舉例1:
-- ----------列子查詢----------- -- 3. 查詢“教研部”和“咨詢部”的所有員工信息-- 3.1 查詢“教研部”和“咨詢部”的id;select id from tb_dept where `name`= '教研部' or `name`= '咨詢部';-- 3.2 使用查詢的id,查詢“教研部”和“咨詢部”的所有員工信息select * from tb_emp where dept_id in (2,3);-- 3.3 將以上兩個查詢合成一個,子查詢就是一個列子查詢select * from tb_emp where dept_id in (select id from tb_dept where `name`= '教研部' or `name`= '咨詢部');
17.Mysql-多表查詢-子查詢(行、表)
-
行子查詢
- 子查詢返回的結果是一行(可以是多列)
- 常用的操作符:=、<>、in、not in
- 舉例:
-- -----------行子查詢---------- -- 4 查詢與“韋一笑”的入職日期 及職位都相同的員工信息 -- 4.1 查詢“韋一笑”的入職日期 及 職位 select entrydate,job from tb_emp where `name`='韋一笑'; -- 4.2 使用查詢到的“韋一笑”的入職日期 及 職位作為條件,查詢相同的員工信息 select * from tb_emp where entrydate = '2007-01-01' and job = 2; -- 4.3 將上面兩個查詢合為一個,子查詢查詢到的是一行數據,所以叫做行子查詢 select * from tb_emp where (entrydate,job) = (select entrydate,job from tb_emp where `name`='韋一笑');
-
表子查詢
- 子查詢返回的結果是多行多列,常作為臨時表
- 常用的操作符:in
- 舉例:
-- ----------表子查詢---------- -- 5 查詢入職日期是2006-01-01 之后的員工信息,及其部門 -- 5.1 查詢入職日期在2006-01-01 之后的員工信息 select * from tb_emp where entrydate > '2006-01-01'; -- 5.2 使用上面查詢到的信息作為臨時表,查詢對應的部門 select e.*, tb_dept.`name` from (select * from tb_emp where entrydate > '2006-01-01') e,tb_dept where e.dept_id = tb_dept.id;
18.Mysql-多表查詢-案例1
-
查詢價格低于10元的菜品的名稱、價格 及其 菜品的分類名稱
select d.`name`,d.price,c.`name` from dish d,category c where d.category_id = c.id and d.price < 10;
-
查詢所有價格在 10元(含)到50元(含)之間 且 狀態為“起售”的菜品,展示出菜品的名稱、價格、及其 菜品的分類(即使菜品沒有分類,也要將菜品查詢出來)
select d.name,d.price,c.name from dish d left join category c on d.category_id = c.id where d.price between 10 and 50 and d.status= 1;
- 3 查詢每個分類下最貴的菜品,展示出分類的名稱、最貴的菜品的價格。
select c.name,max(d.price) from dish d,category c where d.category_id = c.id group by c.name;
- 4.查詢各個分類下 菜品狀態為‘起售’ ,并且該分類下菜品總數大于等于3 的 分類名稱。
select c.`name`,count(*) from dish d,category c where d.category_id = c.id and d.`status`= 1 group by c.`name` having count(*) >= 3;
- 5.查詢“商務套餐A”中包含了哪些菜品(展示出套餐名稱、價格、包含菜品名稱、價格、份數)
select s.`name`,s.price,d.`name`,d.price,sd.copies from dish d,setmeal s, setmeal_dish sd where sd.dish_id = d.id and sd.setmeal_id = s.id and s.`name`='商務套餐A';
- 6.查詢第低于菜品平均價格的菜品信息(展示出菜品名稱、菜品價格)
select * from dish where price < (select avg(price) from dish);
19.Mysql-事務-介紹與操作
- 事務的概念:事務是一組操作的集合,他是一組不可分割的工作單位。事務會把所有的操作作為一個整體一起向系統提交或撤銷操作請求,這些操作要么同時成功,要么同時失敗。
- 注意事項:默認MySQL的事務是自動提交的,也就是說,當執行一條DML語句,MySQL會立即隱式的提交事務。
- 事務控制:
- 事務開始 :
start transaction; / begin;
- 事務提交:
commit;
- 事務回滾:
ollback;
- 事務開始 :
20.Mysql-事務-四大特性
- 原子性:事務是不可分割的最小單元,要么全部成功,要么全部失敗;
- 一致性:事務完成時,必須使所有數據都保持一致狀態;
- 隔離性:數據庫系統提供的隔離機制,保證事務在不受外部并發操作影響的獨立環境下運行;
- 持久性:事務一旦回滾或提交,它對數據庫中的數據的改變就是永久的;
21.Mysql-索引-介紹
概念:索引是幫助數據庫高效獲取數據的數據結構;
優點:提高數據庫查詢的效率,降低數據庫的IO成本;通過索引列對數據進行排列,降低數據排列的成本,降低CPU的消耗。
缺點:索引會占用存儲空間;索引大大提高了查詢的效率,同時也降低了 insert、update、delete效率;
22.MySQL-索引-結構
- B + Tree:多路平衡搜索樹
- 特點:
- 每一個節點,可以存儲多個Key(有n個Key就有n個指針);
- 所有的數據都存儲在葉子節點,非葉子節點僅用于索引數據;
- 葉子節點形成了一顆雙向鏈表,便于數據的排序及區間范圍查詢;
23. MySQL-索引-語法
-
創建索引:
create [unique] index 索引名 on 表名(字段名,...);
-
查看索引:
show index from 表名;
-
刪除索引:
drop index 索引名 on 表名;
-
舉例:
-- 為tb_emp表的name字段創建一個索引 create index idx_emp_name on tb_emp(name);-- 查詢tb_emp表的索引信息 show index from tb_emp;-- 刪除tb_emp表中的name丟字段的索引; drop index idx_emp_name on tb_emp;
-
注意:
- 主鍵字段,在建表時,會自動創建主鍵索引;
- 添加唯一約束時,數據庫實際上會添加唯一索引;