《MySQL从入门到精通》

news2025/4/16 18:57:44

文章目录

  • 《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 = 1
    	AND entrydate
    	BETWEEN '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 查询 "教研部" 的id
      
      select 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.coloradmin.cn/o/2335231.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux: 线程同步

目录 一 前言 二 线程饥饿 三 线程同步 四 条件变量 1. cond &#xff08; condition&#xff09; 2. pthread_cond_wait() &#xff1a; 3. pthread_cond_signal() 五 条件变量的使用 一 前言 在上篇文章Linux : 多线程互斥-CSDN博客我们讲解了线程互斥的概念&#xff…

golang-context详解

Context是什么 cancel 其实就是通过chan select进行提前中断返回 如果没有context&#xff0c;携程之间怎么做这些交互呢&#xff1f;肯定也能做 跨线程通讯如共享内存&#xff0c;pipe等等都可以做到&#xff0c;但是就需要开发者对通讯设计建模、规划数据同步方式等&#xf…

Spring Boot 集成 RocketMQ 全流程指南:从依赖引入到消息收发

前言 在分布式系统中&#xff0c;消息中间件是解耦服务、实现异步通信的核心组件。RocketMQ 作为阿里巴巴开源的高性能分布式消息中间件&#xff0c;凭借其高吞吐、低延迟、高可靠等特性&#xff0c;成为企业级应用的首选。而 Spring Boot 通过其“约定优于配置”的设计理念&a…

AI与我共创WEB界面

记录一次压测后的自我技术提升 这事儿得从机房停电说起。那天吭哧吭哧做完并发压测,正准备截Zabbix监控图写报告,突然发现监控曲线神秘失踪——系统组小哥挠着头说:“上次停电后,zabbix服务好像就没起来过…” 我盯着空荡荡的图表界面,大脑的CPU温度可能比服务器还高。 其…

基于频率约束条件的最小惯量需求评估,包括频率变化率ROCOF约束和频率最低点约束matlab/simulink

基于频率约束条件的最小惯量评估&#xff0c;包括频率变化率ROCOF约束和频率最低点约束matlab/simulink 1建立了含新能源调频的频域仿真传函模型&#xff0c;虚拟惯量下垂控制 2基于构建的模型&#xff0c;考虑了不同调频系数&#xff0c;不同扰动情况下的系统最小惯量需求

深入理解浏览器的 Cookie:全面解析与实践指南

在现代 Web 开发中&#xff0c;Cookie 扮演着举足轻重的角色。它不仅用于管理用户会话、记录用户偏好&#xff0c;还在行为追踪、广告投放以及安全防护等诸多方面发挥着重要作用。随着互联网应用场景的不断丰富&#xff0c;Cookie 的使用和管理也日趋复杂&#xff0c;如何在保障…

Java 正则表达式综合实战:URL 匹配与源码解析

在 Web 应用开发中&#xff0c;我们经常需要对 URL 进行格式验证。今天我们结合 Java 的 Pattern 和 Matcher 类&#xff0c;深入理解正则表达式在实际应用中的强大功能&#xff0c;并剖析一段实际的 Java 示例源码。 package com.RegExpInfo;import java.util.regex.Matcher; …

【C++】前向声明(Forward Declaration)

前向声明&#xff08;Forward Declaration&#xff09;是在C、C等编程语言中&#xff0c;在使用一个类、结构体或其他类型之前&#xff0c;仅声明其名称而不给出完整定义的一种方式。 作用 减少编译依赖&#xff1a;当一个源文件包含大量头文件时&#xff0c;编译时间会显著增…

numpy.ma.masked_where:屏蔽满足条件的数组

1.函数功能 屏蔽满足条件的数组内容&#xff0c;返回值为掩码数组 2.语法结构 np.ma.masked_where(condition, a, copyTrue)3. 参数 参数含义condition屏蔽条件a要操作的数组copy布尔值&#xff0c;取值为True时&#xff0c;结果复制数组(原始数据不变)&#xff0c;否则返回…

【解决】bartender软件换网之后神秘变慢

下的山寨版本bartender软件&#xff0c;用着一直都挺好&#xff0c;结果一次换网之后&#xff0c;启动&#xff0c;排版&#xff0c;打印各种动作都要转个几分钟才行&#xff0c;非常奇怪。直接说解决过程。 首先联想网络没有动以及脱机的时候&#xff0c;都没有这个问题。那么…

[福游宝——AI智能旅游信息查询平台]全栈AI项目-阶段二:聊天咨询业务组件开发

简言 本项目旨在构建一个以AI智能体为核心的福建省旅游信息查询系统&#xff0c;聚焦景点推荐、路线规划、交通天气查询等功能&#xff0c;为游客提供智能化、便捷化的旅游信息服务。项目采用前后端分离架构&#xff0c;前端基于Vite TypeScript Vue3技术栈&#xff0c;搭配…

【教学类-102-11】蝴蝶外轮廓01——Python对黑白图片进行PS填充三种颜色+图案描边+图案填充白色+制作1图2图6图24图

背景需求: 用Python,对白色255背景的图片进行了透明化、制作点状或线段的描边裁剪线 【教学类-102-10】剪纸图案全套代码09——Python线条虚线优化版04(原图放大白背景)+制作1图2图6图24图-CSDN博客文章浏览阅读1k次,点赞27次,收藏8次。【教学类-102-10】剪纸图案全套代…

MCP的另一面

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

微信小程序 - swiper轮播图

官方文档&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/component/swiper.html <swiper indicator-color"ivory" indicator-active-color"#d43c33" indicator-dots autoplay><swiper-item><image src"/images/banner…

2025年第十六届蓝桥杯省赛C++ 研究生组真题

2025年第十六届蓝桥杯省赛C 研究生组真题 1.说明2.题目A&#xff1a;数位倍数&#xff08;5分&#xff09;3.题目B&#xff1a;IPv6&#xff08;5分&#xff09;4.题目C&#xff1a;变换数组&#xff08;10分&#xff09;5.题目D&#xff1a;最大数字&#xff08;10分&#xff…

七、自动化概念篇

自动化测试概念 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常&#xff0c;在设计了测试用例并通过评审之后&#xff0c;由测试人员根据测试用例中描述的过程一步步执行测试&#xff0c;得到实际结果与期望结果的比较。在此过程中&#xff0c;为了节省人…

【第43节】实验分析windows异常分发原理

目录 前言 一、异常处理大致流程图 二、实验一&#xff1a;分析 KiTrap03 三、实验二&#xff1a;分析CommonDispatchException 四、代码探究&#xff1a;分析 KiDispatchException 函数 五、代码探究&#xff1a;伪代码分析用户层KiUserExceptionDispatcher 前言 在Wind…

如何在AMD MI300X 服务器上部署 DeepSeek R1模型?

DeepSeek-R1凭借其深度推理能力备受关注&#xff0c;在语言模型性能基准测试中可与顶级闭源模型匹敌。 AMD Instinct MI300X GPU可在单节点上高效运行新发布的DeepSeek-R1和V3模型。 用户通过SGLang优化&#xff0c;将MI300X的性能提升至初始版本的4倍&#xff0c;且更多优化将…

RTX 5060 Ti 3DMark跑分首次流出:比RTX 4060 Ti快20%

快科技4月14日消息&#xff0c;根据VideoCardz拿到的数据&#xff0c;RTX 5060 Ti 16GB在3DMark的系列基准测试中&#xff0c;平均较上一代RTX 4060 Ti 16GB高出20%。 具体来看&#xff0c;RTX 5060 Ti 16GB在3DMark的测试中表现如下&#xff1a; TimeSpy&#xff08;1440p&a…

【STL】set

在 C C C S T L STL STL 标准库中&#xff0c; s e t set set 是一个关联式容器&#xff0c;表示一个集合&#xff0c;用于存储唯一元素的容器。 s e t set set 中的元素会自动按照一定的顺序排序&#xff08;默认情况下是升序&#xff09;。这意味着在 s e t set set 中不能…