《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.mzph.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;…