《MySQL從入門到精通》

文章目錄

  • 《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通用語法

    1. SOL語句可以單行或多行書寫,以分號結尾;
    2. SOL語句可以使用空格/縮進來增強語句的可讀性;
    3. MySQL數據庫的SQL語句不區分大小寫,關鍵字建議使用大寫;
    4. 注釋:
      • 單行注釋:–注釋內容 或 #注釋內容(MySQL特有)
      • 多行注釋: /*注釋內容 */
  • SQL分類

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

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

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

    4. DCL(Data Control Language):數據控制語言,用來創建數據庫用戶、控制數據庫的訪問權限

2. 基礎-SQL-DDL-數據庫操作


問題記錄:ssh無法登錄,問題原因ssh服務無法啟動,權限受限
解決過程:

  1. 使用ssh -t 命令查看原因
  2. 使用 # chmod 600 /var/empty/sshd 添加權限(只能是600 的權限狀態才可以)
  3. 使用# systemctl restart sshd.service 重啟服務
  4. 使用# systemctl status sshd.service 查看狀態
  • DDL-數據庫操作
    1. 查詢
      • 查詢所有數據庫:SHOW DATABASES;
      • 查詢當前數據庫:SELECT DATABASE();
    2. 創建
      • CREATE DATABASE [IF NOT EXISTS] 數據庫名 [DEFAULT CHARSET 字符集] [COLLATE 排序規則];
    3. 刪除
      • DROP DATABASE [IF EXISTS] 數據庫名;
    4. 使用
      • USE 數據庫名;

3. 基礎-SQL-DDL-表操作-創建&查詢

  • DDL-表操作-查詢

    1. 查詢當前數據庫所有表 : SHOW TABLES;
    2. 查詢表結構 : DESC 表名;
    3. 查詢指定表的建表語句: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-表操作-約束

    • 概念:約束是作用于表中字段上的規則,用于限制存儲在表中的數據。

    • 目的:保證數據庫中數據的正確性、有效性和完整性。

    • 常見約束

      1. 非空約束(not null):限制該字段值不能為null
      2. 唯一約束(unique):保證字段的所有數據都是唯一、不重復的,
      3. 主鍵約束(primary key):主鍵是一行數據的唯一標識,要求非空且唯一
      4. 默認約束(default):保存數據時,如果未指定該字段值,則采用默認值
      5. 外鍵約束(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-表操作-修改

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

    • 案例:為employe表增加一個新的字段”昵稱”為nickname,類型為varchar(20)
    mysql> alter table employe add nickname varchar(20) comment "昵稱";
    
  2. 修改數據類型

    • ALTER TABLE 表名 MODIFY 字段名 新數據類型(長度);
  3. 修改字段名和字段類型

    • ALTER TABLE 表名 CHANGE 舊字段名 新字段名 類型(長度)[COMMENT 注釋][約束];
    • 案例:將employe表的nickname字段修改為username,類型為varchar(30)
    mysql> alter table employe change nickname username varchar(30) comment "用戶名";
    
  4. 刪除字段

    • ALTER TABLE 表名 DROP 字段名;
    • 案例:將employe表的字段username刪除
    mysql> alter table employe drop nickname;
    
  5. 修改表名

    • ALTER TABLE 表名 RENAME TO 表名;
    • 案例:將employe表的表名修改為emp。
    mysql> alter table employe rename to emp;
    

5.2 DDL-表操作-刪除

  1. 刪除表
    • DROP TABLE [IF EXISTS] 表名;
    mysql> drop table if exists tb_user;
    
  2. 刪除指定表,并重新創建該表
    • 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-基本查詢

  1. 查詢返回指定字段
    SELECT `name`,entrydate FROM tb_emp;
    
  2. 查詢返回所有字段
    SELECT id, username, `password`, `name`,gender,image,job,entrydate,create_time,update_time FROM tb_emp;
    -- 或者
    SELECT * FROM tb_emp;
    
  3. 別名應用
    SELECT `name` AS '姓名',entrydate AS '入職日期' FROM tb_emp; 
    -- AS關鍵字可以省略
    SELECT `name` '姓名',entrydate '入職日期' FROM tb_emp;
    
  4. DISTINCT關鍵字,去除重復
    SELECT DISTINCT job FROM tb_emp;
    

9.2 基礎-SQL-DQL-條件查詢

  1. 查詢姓名為楊逍的員工
    SELECT * FROM tb_emp WHERE name = '楊逍';
    
  2. 查詢ID小于等于5的員工信息
    SELECT * FROM tb_emp WHERE id <= 5;
    
  3. 查詢沒有分配職位的員工信息
    SELECT * FROM tb_emp WHERE job IS NULL;
    
  4. 查詢有職位的員工信息
    SELECT * FROM tb_emp WHERE job IS NOT NULL;
    
  5. 查詢密碼字段不是“123456”的員工信息
    SELECT * FROM tb_emp WHERE `password` != '123456';SELECT * FROM tb_emp WHERE `password` <> '123456';
    
  6. 查詢入職日期在’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';
    
  7. 查詢 入職日期 在’2000-01-01’(包含) 到 ‘2010-01-01’(包含) 之間 且 性別為女性的員工信息
    SELECT * FROM tb_emp WHERE entrydate BETWEEN '2000-01-01' AND '2010-01-01' && gender = 2;
    
  8. 查詢職位是 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;
    
  9. 查詢 姓名 為兩個字的員工信息
    SELECT * FROM tb_emp WHERE `name` LIKE '__';
    
  10. 查詢 姓"張"的員工信息
    SELECT * FROM tb_emp WHERE `name` LIKE '張%';
    

9.3 基礎-SQL-DQL-分組查詢

  • 聚合函數:將一列數據作為一個整體,進行縱向計算;
  • 語法:select 聚合函數(字段列表) from 表名
  1. 統計改企業員工的數量
     A.count(字段),不能統計null值,需要統計非空字段才能統計準確
    SELECT count(job) FROM tb_emp;
    
    -- B.count(常量)
    SELECT COUNT(1) FROM tb_emp;
    
    -- C.count(*)-推薦
    SELECT COUNT(*) FROM tb_emp;
    
  2. 統計企業最早入職的員工
    SELECT MIN(entrydate) FROM tb_emp;
    
  3. 統計企業最遲入職的員工
    SELECT MAX(entrydate) FROM tb_emp;
    
  4. 統計該企業員工ID的平均值
    SELECT AVG(id) FROM tb_emp;
    
  5. 統計該企業員工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 降序
  1. 根據入職時間,對員工進行升序排序

    SELECT * FROM tb_emp ORDER BY entrydate ASC;
    
  2. 根據入職時間,對員工進行降序排序

    SELECT * FROM tb_emp ORDER BY entrydate DESC;
    
  3. 根據入職時間,對員工進行升序排序,排序后如果入職時間相同,再按照更新時間進行降序排序

    SELECT * FROM tb_emp ORDER BY entrydate ASC, update_time DESC;
    
  • 注意:如果是多字段排序,當第一個字段值相同時,才會根據第二個字段進行排序。

9.5 基礎-SQL-DQL-分頁查詢

  • 語法:select 字段列表 from 表名 limit 起始索引,查詢記錄數;
  1. 從起始索引0 開始查詢員工數據,每頁展示5條記錄
    SELECT * FROM tb_emp LIMIT 0,5;
    
  2. 查詢 第1頁員工數據 每頁展示5條記錄;
    SELECT * FROM tb_emp LIMIT 0,5;
    
  3. 查詢 第2頁員工數據 每頁展示5條記錄;
    SELECT * FROM tb_emp LIMIT 5,5;
    
  4. 查詢 第3頁員工數據 每頁展示5條記錄;
    SELECT * FROM tb_emp LIMIT 10,5;
    
  • 起始索引 = (頁碼 - 1)*每頁展示記錄數;
  • 如果查詢的是第一頁數據,起始索引可以省略;

9.6 基礎-SQL-DQL-案例

  1. 案例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
    • 案例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-多表查詢-概述

  1. 多表查詢:是指從多張表中查詢數據;
  2. 笛卡爾積:笛卡爾積乘積是指在數學中,兩個集合(A集合和B集合)的所有情況;
  3. 多表查詢分類:
    • 內連接:相當于查詢A、B交集部分數據;
    • 外連接
      • 左外連接:查詢左表所有的數據(包括兩張表交集部分數據);
      • 右外連接:查詢右表所有的數據(包括兩張表交集部分數據);
    • 子查詢

14.Mysql-多表查詢-內連接

  1. 隱式內連接:select 字段列表 from 表1,表2 where 條件...;
  2. 顯式內連接:select 字段列表 from 表1 [inner] join 表2 on 連接條件;
  3. 舉例:
    -- --------多表查詢:隱式內連接-----------
    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;
    
  4. 多表查詢中為了書寫方便可以給表起別名:
    select e.`name`,d.`name` from  tb_emp e,tb_dept d where e.dept_id = d.id; 
    

15.Mysql-多表查詢-外連接

  1. 左外連接語法:select 字段列表 from 表1 left [outer] join 表2 on 連接條件....;
  2. 右外連接語法:select 字段列表 from 表1 rigth [outer] join 表2 on 連接條件...;
  3. 舉例
    -- --------多表查詢:左外連接-----------
    -- 查詢員工表 所有 員工的姓名,和對應的部門名稱
    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-多表查詢-子查詢(標量、列)

  1. 子查詢概述:
    • 介紹:SQL語句中嵌套select語句,稱為嵌套查詢,又稱子查詢。
    • 形式:select *from tl where column1=(select column1 from t2 ... );
    • 子查詢外部的語句可以是insert/update/delete/select 的任何一個,最常見的是 select。
  2. 子查詢的分類
    • 標量子查詢:子查詢返回的結果為單個值;
    • 列子查詢:子查詢返回的結果為一列;
    • 行子查詢:子查詢返回的結果為一行;
    • 表子查詢:子查詢返回的結果為多行多列;
  3. 標量子查詢
    • 子查詢返回的結果是單個值(數字、字符串、日期等),最簡單的形式
    • 常用的操作符:= <> > >= < <=
    • 舉例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`= "方東白");
      
  4. 列子查詢
    • 子查詢返回的結果是一列(可以是多行);
    • 常用的操作符: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-多表查詢-子查詢(行、表)

  1. 行子查詢

    • 子查詢返回的結果是一行(可以是多列)
    • 常用的操作符:=、<>、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`='韋一笑');
      
  2. 表子查詢

    • 子查詢返回的結果是多行多列,常作為臨時表
    • 常用的操作符: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

  1. 查詢價格低于10元的菜品的名稱、價格 及其 菜品的分類名稱

    select d.`name`,d.price,c.`name` 
    from dish d,category c 
    where d.category_id = c.id and d.price < 10;
    
  2. 查詢所有價格在 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-事務-四大特性

  1. 原子性:事務是不可分割的最小單元,要么全部成功,要么全部失敗;
  2. 一致性:事務完成時,必須使所有數據都保持一致狀態;
  3. 隔離性:數據庫系統提供的隔離機制,保證事務在不受外部并發操作影響的獨立環境下運行;
  4. 持久性:事務一旦回滾或提交,它對數據庫中的數據的改變就是永久的;

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;
    
  • 注意:

    • 主鍵字段,在建表時,會自動創建主鍵索引;
    • 添加唯一約束時,數據庫實際上會添加唯一索引;

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

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

相關文章

Vccaux_IO在DDR3接口中的作用

一、Vccaux_IO在DDR3接口中的作用 1.vccaux_io通常為FPGA的IO bank的輔助電源&#xff0c;用于支持特定電壓的IO標準 2.在DDR3接口中&#xff0c;FPGA的IO bank需要DDR3芯片的電壓(1.5v/1.35v)匹配 3.Vccaux_IO用于為FPGA的DDR3接口I/O Bank供電&#xff0c;其電壓值、噪聲和穩…

深入理解Apache Kafka

引言 在現代分布式系統架構中&#xff0c;中間件扮演著至關重要的角色&#xff0c;它作為系統各組件之間的橋梁&#xff0c;負責處理數據傳遞、消息通信、負載均衡等關鍵任務。在眾多中間件解決方案中&#xff0c;Apache Kafka憑借其高吞吐量、低延遲和可擴展性&#xff0c;已…

【NLP】 21. Transformer整體流程概述 Encoder 與 Decoder架構對比

1. Transformer 整體流程概述 Transformer 模型的整個處理流程可以概括為從自注意力&#xff08;Self-Attention&#xff09;到多頭注意力&#xff0c;再加上殘差連接、層歸一化、堆疊多層的結構。其核心思想是利用注意力機制對輸入進行并行計算&#xff0c;從而避免傳統 RNN …

路由器端口映射的意思、使用場景、及內網ip讓公網訪問常見問題和解決方法

一、端口映射是什么意思 端口映射是將內網主機的IP地址端口映射到公網中&#xff0c;內部機器提供相應的互聯網服務。當異地用戶訪問該這個端口時&#xff0c;會自動將請求映射到對應局域網內部的機器上。 二、端口映射常見使用場景 1&#xff0c;遠程訪問需求。當有…

GEO全域優化白皮書:盈達科技如何打造AI生態中的認知護城河

副標題&#xff1a;讓內容被AI優先引用&#xff0c;占領生成式引擎的“主屏入口” 一、GEO&#xff1a;生成式引擎時代的內容占位權之戰 隨著ChatGPT、Kimi、DeepSeek等生成式AI快速成為信息獲取的主流方式&#xff0c;搜索邏輯正在根本性改變&#xff1a;從“網頁排名”轉向“…

如何用DeepSeek大模型提升MySQL DBA工作效率?實戰案例解析

如何用DeepSeek大模型提升MySQL DBA工作效率&#xff1f;實戰案例解析 MySQL DBA&#xff08;數據庫管理員&#xff09;的工作涉及數據庫監控、SQL優化、故障排查、備份恢復等復雜任務&#xff0c;傳統方式依賴手動操作和經驗判斷&#xff0c;效率較低。而DeepSeek大模型可以結…

系統設計思維的討論

我們經常說自己熟悉了spring&#xff0c;能夠搭建起一個項目基本框架&#xff0c;并且在此之上進行開發&#xff0c;用戶or客戶提出需求碰到不會的百度找找就可以實現。干個四五年下一份工作就去面試架構師了&#xff0c;運氣好一些可能在中小公司真的找到一份架構師、技術負責…

項目部署-(二)Linux下SpringBoot項目自動部署

一、項目部署架構 二、項目部署環境 192.168.138.100(服務器A)&#xff1a; -Nginx :部署前端項目、配置反向代理 -MySQL:主從復制結構中的主庫 192.168.138.101(服務器B)&#xff1a; -JDK&#xff1a;運行Java項目 -Git&#xff1a;版本控制工具 -Maven&#xff1a;項目構建…

【LeetCode 熱題 100】哈希 系列

&#x1f4c1;1. 兩數之和 本題就是將通過兩層遍歷優化而成的&#xff0c;為什么需要兩層遍歷&#xff0c;因為遍歷 i 位置時&#xff0c;不知道i-1之前的元素是多少&#xff0c;如果我們知道了&#xff0c;就可以通過兩數相加和target比較即可。 因為本題要求返回下標&#xf…

【Kubernetes基礎】--查閱筆記1

目錄 Kubernetes 是什么為什么要用 KubernetesKubernetes 概念MasterNodePodLabelReplication ControllerDeploymentHorizontal Pod AutoscalerStatefulSetService服務發現機制 JobVolumePersistent VolumeNamespaceConfigmap Kubernetes 是什么 Kubernetes是一個開放的開發平…

卷積神經網絡CNN到底在卷些什么?

來源&#xff1a; 卷積神經網絡&#xff08;CNN&#xff09;到底卷了啥&#xff1f;8分鐘帶你快速了解&#xff01;_嗶哩嗶哩_bilibili卷積神經網絡&#xff08;CNN&#xff09;到底卷了啥&#xff1f;8分鐘帶你快速了解&#xff01;共計2條視頻&#xff0c;包括&#xff1a;卷…

Axios 的 POST 請求:QS 處理數據的奧秘與使用場景解析

在現代前端開發中&#xff0c;Axios 已經成為了進行 HTTP 請求的首選庫之一&#xff0c;它的簡潔易用和強大功能深受開發者喜愛。當使用 Axios 進行 POST 請求時&#xff0c;我們常常會遇到一個問題&#xff1a;是否需要使用 QS 庫來處理請求數據&#xff1f;什么時候又可以不用…

java面試題帶答案2025最新整理

文章目錄 一、java面試題集合框架1. 請簡要介紹 Java 集合框架的體系結構2. ArrayList 和 LinkedList 的區別是什么3. HashMap 的工作原理是什么&#xff0c;它在 JDK 7 和 JDK 8 中有哪些不同4. 如何解決 HashMap 的線程安全問題5. TreeSet 是如何保證元素有序的 二、java面試…

4.B-樹

一、常見的查找方式 順序查找 O(N) 二分查找 O(logN)&#xff08;要求有序和隨機訪問&#xff09; 二叉搜索樹 O(N) 平衡二叉搜索樹(AVL樹和紅黑樹) O(logN) 哈希 O(1) 考慮效率和要求而言&#xff0c;正常選用 平衡二叉搜索樹 和 哈希 作為查找方式。 但這兩種結構適合用于…

CTF--shell

一、原題 &#xff08;1&#xff09;提示&#xff1a; $poc"a#s#s#e#r#t";$poc_1explode("#",$poc);$poc_2$poc_1[0].$poc_1[1].$poc_1[2].$poc_1[3].$poc_1[4].$poc_1[5]; $poc_2($_GET[s]) &#xff08;2&#xff09;原網頁&#xff1a;一片空白什么都…

基于51單片機的正負5V數字電壓表( proteus仿真+程序+設計報告+講解視頻)

基于51單片機的正負5V數字電壓表( proteus仿真程序設計報告講解視頻&#xff09; 仿真圖proteus7.8及以上 程序編譯器&#xff1a;keil 4/keil 5 編程語言&#xff1a;C語言 設計編號&#xff1a;S0101 1. 主要功能&#xff1a; 設計一個基于51單片機數字電壓表 1、能夠…

hive數倉要點總結

1.OLTP和OLAP區別 OLTP&#xff08;On-Line Transaction Processing&#xff09;即聯機事務處理&#xff0c;也稱為面向交易的處理過程&#xff0c;其基本特征是前臺接收的用戶數據可以立即傳送到計算中心進行處理&#xff0c;并在很短的時間內給出處理結果&#xff0c;是對用…

【實戰手冊】8000w數據遷移實踐:MySQL到MongoDB的完整解決方案

?? 本文將帶你深入解析大規模數據遷移的實踐方案,從架構設計到代碼實現,手把手教你解決數據遷移過程中的各種挑戰。 ??博主其他匠心之作,強推專欄: 小游戲開發【博主強推 匠心之作 拿來即用無門檻】文章目錄 一、場景引入1. 問題背景2. 場景分析為什么需要消息隊列?為…

運行小程序需要選擇什么配置的服務器

主要是看有多少人瀏覽&#xff0c;如果是每天有幾十個人瀏覽&#xff0c;通常2核或者4核就可以滿足需求&#xff0c;內存的話建議4g或者8g&#xff0c;足夠的內存可以使服務器同時處理多個請求&#xff0c;避免因內存不足導致的卡頓或程序崩潰。 硬盤存儲方面&#xff0c;50GB…

基于SpringBoo的地方美食分享網站

作者&#xff1a;計算機學姐 開發技術&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源碼”。 專欄推薦&#xff1a;前后端分離項目源碼、SpringBoot項目源碼、Vue項目源碼、SSM項目源碼、微信小程序源碼 精品專欄&#xff1a;…