MySQL基础环节余胜军课堂笔记
MySQL快速入门
MySQL的特点:
1.MySQL数据库使用C和C++语言编写的,以保证源码的可移植性
2.支持多个操作系统,例如:Windows、Linux、Mac OS等
3.支持多线程,可以充分地利用CPU资源
4.为多种编程语言提供API,包括C语言,Java,PHP,python,go等
5.MySQL优化了SQL算法,有效地提高了查询速度。
6.MySQL开放源代码且无版权制约,自主性强,使用成本低
7.MySQL历史悠久,社区及用户非常活跃,遇到问题能够很快地得到帮助
关于安装MySQL时的my.in文件
需要配置下环境变量--类比于配置JDK,这里不做介绍
接下来,使用管理员身份打开cmd命令提示窗口:
1.初始化:mysqld --initialize --user=mysql --console
2.添加服务:mysqld -install
3.启动MySQL服务:net start mysql
4.修改root用户的密码:alter user root@localhost identified by 'root';# 修改root用户的密码为root
退出:exit
关于在使用navicat时,连接MySQL8.0以上版本报错的情况:
MySQL8.0起,引入了新特性caching_sha2_password;这种密码加密方式客户端不支持;客户端支持的是mysql_native_password 这种格式;
1.mysql -u root -p;
2.use mysql;
3.alter user 'root'@'localhost' identified with mysql_native_password by 'root';
4.flush pribileges;
数据库的基本操作
DDL
数据库模式定义语言(Data Definition Language),是用于描述数据库中要存储的现实世界实体的语言。
1.对数据库创建、删除、修改操作
2.对表结构创建、删除、修改操作
数据库操作
查询
创建
删除
修改
表操作
创建表
修改
1.修改表的名称:
语法;alter table 表名 rename to 新的表名;
alter table mayikt_user rename to meite_user;
删除表
drop table 表名;
drop table if exists 表名;
数据库中的数据类型
MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
数值类型
日期和时间类型
表示时间值的日期和事件类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR
字符串类型
char(n)和varchar(n)中括号中的n代表字符的个数,并不代表字节个数。比如char(30)就可以存储30个字符
DML
数据操作语句,用于添加、删除、更新和查询数据库记录,并检擦数据完整性,常用的数据关键字主要包括:
insert、delete、update和select(俗话说的,增删改查)
DML与DDL区别?
DDL:主要针对的是对数据库和表结构的操作,增加、删除和修改操作。
DML:是对表结构中的数据做增删改查操作。
insert
insert into 语句,用于向表格中插入新的行
语法格式
insert into 表名称 (列名1,列名2...) values(值1,值2...)//插入数据列要与值的顺序需要一一对应
insert into 表名称 values(值1,值2...);//向表中插入所有列
eg:
insert into mayikt_user (id,name,age,address,create_time) values(1,20,'shanghai',2023-02-19);
insert into mayikt_user values(1,20,'shanghai',2023-02-19);
update
语法格式:
update 表名称 set 字段=值,字段=值,...;----直接修改整张表的所有行数据
update 表名称 set 字段=值,字段=值,where 条件---根据条件查找到对应行数据 修改
例子:
update mayikt_user set name=‘李四’,age=25 where id=1;
update city set name=‘杭州’---修改所有
delete
语法格式:
delete from 表名称 where 条件 根据条件删除表中的数据
truncate mayikt_use---清空表中的所有数据
例子:
delete from mayikt_user wher id =1;--根据条件id=1,删除id=1行数据
delete from mayikt_user;--清空表中所有的数据
truncate mayikt_user;--清空表中所有的数据
truncate 与 delete的区别?
truncate会清空表中所有的数据,速度快,不可回滚,实质是删除整张表包括数据再重新创建表;
delete逐行删除数据,每步删除是有日志记录的,可以回滚数据;实质是逐行删除表中的数据。
约束
什么是约束
用于限制表中的数据,为了保证表中数据的准确性和可靠性,不符合约束的数据,插入时就会失败。
约束条件在创建表时可以使用,也可以修改表的时候添加约束条件
例如:用户信息表中,手机号码不允许重复,身份证号码不允许重复
约束作用
用于限制表中的数据,为了保证表中数据的准确性和可靠性,不符合约束的数据,插入时就会失败。
约束分类
1.NOT NULL:非空,用于保证该字段的值不能为空。例如学生表的学生姓名及学号等等。
2.DEFAULT:默认值,用于保证该字段有默认值。例如学生表学生的性别。
3.PRIMARY KEY:主键,用于保证该字段的值具有唯一性且非空。例如学生表中的学号等。
4.UNIQUE:唯一,用于保证该字段的值具有唯一性,可以为空。例如注册用户的手机号、身份证号等
5.CHECK:检查约束(MySQL不支持),检查字段的值是否为指定的值
6.FOREIGN KEY:外键,用于限制两个表的关系;用于保证该字段的值必须来自于主表关联列的值;在从表添加外键约束,用于引用主表中某些的值。例如学生表的专业编号。
主键约束
1.MySQL主键约束是一个列或者多个列的组合,其值能唯一地标识表中的每一行,这样的一列或多列成为表的主键,通过它可以强制表的实体完整性,同时可以方便根据主键查询该行数据。
2.选取设置主键约束的字段,主键约束即在表中定义一个主键来唯一确定表中每一行数据的标识符。主键是可以表中的某一列或者多列的组合,其中由多列组合的主键成为复合主键,主键应该遵守下面的规则。
3.每个表只能定义一个主键,主键值必须唯一标识表中的每一行,且不能为null,即表中不可能存在两行数据有相同的主键值,这是唯一性原则。
4.在创建表时,设置主键约束,在CREATE TABLE语句中,主键是通过PRIMARY KEY关键字来指定的。
5.当创建主键的约束时,系统会默认所在的列和列组合,建立对应的索引,方便提高查询效率。
如果使用表中的一列 主键 --- 单列主键
使用表中的多个列(id,手机号码,身份证号码)多列 --多列主键(复合主键)
条件:一张表中只能够允许有一个主键,主键值不允许为空,主键保证每行数据完整唯一性。
不允许重复的。
MySQL查询高级知识 -- 索引 方便提高查询效率
1.添加单列主键
2.添加多列联合主键
使用主键约束primary key
单列主键
1.定义字段时,指定单列主键
语法格式:
create table 表的名称(
<字段名> <字段类型> primary key
)
2.定义完字段之后,指定主键列(复合主键)
create table 表的名称(
...
constraint 主键名称 primary key(主键列)
);
联合主键
联合主键(复合主键),由多个列(字段组成)。
注意事项:
1.当主键是有一个列组成时,不能够直接在字段名称后面声明主键约束;
2.一张表只能够允许一个主键
自定增长约束
设置自动增长
1.在MySQL中,当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值,每增加一条记录,主键自动增加。
2.通过给字段添加auto_increment 属性来实现主键自动增长
3.语法格式如下:
字段名 数据类型 auto_increment
4.默认情况下,auto_increment的初始值是1,每新增一条记录,字段值自动加1.
一个表中只能有一个字段使用auto_increment约束,且该字段必须有唯一索引,以避免序号重复(即为主键或主键的一部分)。
auto_increment约束的字段必须具备not null属性。
auto_increment约束的字段只能是整数类型(tinyint,smallint,int,bigint等)
auto_increment约束字段的最大值受该字段的数据类型约束,如果达到上限,auto_increment就会失效。
注意:
1.一张表中只能有一个自动增长的字段
2.配合主键一起使用,并且适用于整数类型
3.自动增长默认的初始值为1,每次增加一条数据,该字段的值机会增1
自动增长设置初始值
默认自动增长初始值是从1开始
MySQL指定自动增长字段初始值 1000 2000
1.创建表的时候指定
2.创建表之后修改自定义增长开始值
alter table mayikt_users auto_increment 2000;
delete与truncate删除数据的区别?
delete删除数据之后,自动增长还是从最后一个数据的id基础之上做自增
truncate清空数据之后,自动增长是从初始值1开始
delete from mayikt_user --- 清空表数据
truncate mayikt_users --- 清空表数据
truncate与delete不同?
truncate:会清空表中所有的数据,速度快,不可回滚;实质是删除整张表包括数据再重新创建表;
自动设定初始值失效
delete:逐行删除数据,每步删除都是有日志记录的,可以回滚数据;实质是逐行删除表中的数据。
非空约束
1.MySql -- not null 非空约束用于确保当前列的值不为空;在创建表时,如果指定not null 该字段在插入数据时
不允许为空;
2.语法格式;
2.1 创建表的时候 <字段名><数据类型>NOT NULL;
2.2 alter table 【数据库名.】 表名称 modify 字段名 数据类型 not null
唯一约束
MySQL唯一约束(unique key)是指所有记录中该字段的值不能重复出现。例如为phone字段加上唯一性约束后,每条记录的phone值都是唯一的,不能出现重复的情况。如果其中一条记录的phone值为‘110’,那么就意味着表中就不能够出现第二个'110',唯一约束值可以为null。
主键约束 满足唯一性且值不允许为null,而我们的唯一约束允许值为null
一张表结构中只允许一个主键约束,但是可以有多个唯一约束。
例如:手机号码是唯一约束,每条记录的手机号码是不允许重复且保证唯一。
1.在创建表时设置唯一约束
语法规则:
unique key 约束名称(约束字段)
2.在修改表的时候添加唯一约束
语法规则如下:
alter table <数据表名> add constraint <唯一约束名> unique(<列名>);
3.删除约束
alter table mayikt_users drop index unique_phone;
默认约束
默认值(Default)的完整称呼是‘默认值约束(Default Constraint)‘,用来指定某列的默认值。在表中插入一条新记录时,如果没有为某个字段赋值,系统就会自动为这个字段插入默认值。其中,“默认值”为该字段设置的默认值,如果是字符类型的,要用单引号括起来。
1.在创建表的时候设置默认值约束
<字段名> <数据类型> default <默认值>;
2.在修改表的时候添加默认值约束
alter table <数据表名> change column <字段名> <数据类型> default <默认值>;
零填充约束
定义了数据类型的长度,如果实际位数小于定义的长度,显示时会在左边用0填充
语法:
create table 表名(字段名称 int zerofill,...);
DQL
什么是DQL
1.DQL(Data Query Language)即数据库查询语言,用来查询所需要的信息, 在查询的过程中,需要判断所查询的数据与表之间的关系,我们可以使用select语句来查询数据。
select * from 表名 where 查询的条件'
DDL与DML区别?
DDL对数据库、表结构做增加、修改和删除操作
DML对表结构中的数据做增删改查
2.查询语句语法格式
分页、分组、排序
select *(列名称)from 表名称 where 条件
1.查询语句中,你可以使用一个表或者多个表,表之间用逗号(,)分割,并使用where语句来设定查询条件。
2.select 命令可以读取一条或者多条记录
3.使用星号(*)来代替其他字段,select语句会返回表的所有字段数据----【实际开发中严禁这么做,会导致全表查询,速度非常慢还可能导致数据库服务宕机】
4.使用where语句来包含任何条件
5.使用limit属性来设定返回的记录数
6.offset指定select语句开始查询的数据偏移量。默认情况下偏移量为0.
3.数据的初始化
运算符
数据库中的表结构确立后,表中的数据代表的意义就已经确定。而通过MySQL运算符进行运算,就可以获取到表结构以外的另一种数据。例如:学生表中存在一个birth(出生日期)字段,这个字段表示学生的出生年份,而运用MySQL的算术运算符用当前的年份减学生出生的年份,那么得到的即使这个学生的实际年龄数据。这就是MySQL的运算符,所以熟悉并掌握运算符的使用,我们需要熟悉一下MySQL支持的4种运算符都具备哪些功能?
算术运算符
比较运算符
逻辑运算符
位运算符
算数运算符
算数运算符是MySQL种最常用的一类运算符。MySQL支持的运算符,包括:加、减、乘、除、取余
比较运算符
比较运算符是查询数据时最常用的一类运算符。select语句中的条件语句经常要使用比较运算符。通过这些比较运算,可以判断表中的哪些记录是符合条件的。
逻辑运算符
逻辑运算符用来判断表达式的真假。如果表达式是真,结果返回1。如果表达式是假,结果返回0。逻辑运算符又称为布尔运算符。MySQL种支持4种逻辑运算符,分别是与或非和异或。
位运算符
参与运算符的操作数,按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)6种。
相关练习以及答案
排序
如果我们需要对读取的数据进行排序,可以利用order by,根据字段来进行升序或者是降序排列,再返回结果。
升序:从小到大
降序:从大到小
order by 根据字段 数字、字母、汉字
语法格式:
1.asc代表升序排列,desc代表降序排列。默认是升序,升序就是从小到大、降序就是从大到小
2.order by可以支持单个字段、多个字段
3.order by放在查询语句最后面,limit分页除外;
相关练习
一般情况下,我们使用数字排序,从小到大或者从大到小;
如果是字母排序,则根据字母的顺序从A-Z排序,或者从Z-A排序
如果是汉字的拼音排序,用的比较多是在人名的排序种中,按照姓氏的拼音字母,从A-Z排序
分页
概述:limit
在MySQL中,当数据量很大时,显示屏长度有限,我们可以对数据进行分页显示。例如数据总共100条,每页10条数据,可以分成10页。
格式:
m:整数,表示从第几条索引开始,计算方式(当前页-1)*每页显示条数
n:整数,表示查询多少条数据
eg:
需求:
聚合查询
我们在之前的查询是根据条件一行一行的判断,而使用聚合查询,它是对列的值进行计算,然后返回一个单一的值。
练习
关于使用聚合查询null的处理
1.count函数对null值的处理
如果count函数的参数(*),则统计所有记录的行数;如果参数是为某字段,不统计含有null值记录行数。
2.sum、avg、max,min函数对null也是做忽略处理
练习
分组查询
分组查询是指使用group by关键字对查询信息进行分组。
黑龙江省
广东省
浙江省
格式:
select 字段1,字段2,...from 表名称 group by 分组字段 having 分组条件;
注意:分组的条件使用分组查询中特有的链接关键字 having而不能使用where
案例:
注意:分组,返回列只能为分组的字段或者聚合函数;
分组之后的条件筛选
1.分组之后对统计结果进行分组条件筛选,必须使用having,不能够使用where
2.having语句通常与group by联合使用,用来过滤由group by语句返回的记录集
语法格式:
案例需求:
先from、group by,count、having
注意事项:
1.where后面不能跟聚合函数,因为where执行顺序优先于聚合函数
2.where子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行
3.having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。
作业
题目1
题目2
CREATE TABLE `employee` (
`number` int DEFAULT NULL COMMENT '员工编号',
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '姓名',
`hiredate` date DEFAULT NULL COMMENT '入职时间',
`salary` double DEFAULT NULL COMMENT '薪资',
`bonus` double DEFAULT NULL COMMENT '奖金',
`department` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '部门编号'
)
INSERT INTO `mayikt`.`employee` (`number`, `name`, `hiredate`, `salary`, `bonus`, `department`) VALUES ('1001', '余胜军', '2020-06-01', '18000', '3000', '研发部门');
INSERT INTO `mayikt`.`employee` (`number`, `name`, `hiredate`, `salary`, `bonus`, `department`) VALUES ('1002', '刘军', '2019-06-01', '16000', '1000', '研发部门');
INSERT INTO `mayikt`.`employee` (`number`, `name`, `hiredate`, `salary`, `bonus`, `department`) VALUES ('1003', '张三', '2018-02-10', '6000', '500', '财务部门');
INSERT INTO `mayikt`.`employee` (`number`, `name`, `hiredate`, `salary`, `bonus`, `department`) VALUES ('1004', '王麻子', '2022-02-10', '27000', '500', '财务部门');
INSERT INTO `mayikt`.`employee` (`number`, `name`, `hiredate`, `salary`, `bonus`, `department`) VALUES ('1005', '刘软', '2013-02-10', '6000', '500', 'UI部门');
INSERT INTO `mayikt`.`employee` (`number`, `name`, `hiredate`, `salary`, `bonus`, `department`) VALUES ('1006', '王麻子', '2022-02-10', '6000', '500', 'UI部门');
INSERT INTO `mayikt`.`employee` (`number`, `name`, `hiredate`, `salary`, `bonus`, `department`) VALUES ('1007', '李四', '2022-02-25', '5000', '100', '财务部门');
INSERT INTO `mayikt`.`employee` (`number`, `name`, `hiredate`, `salary`, `bonus`, `department`) VALUES ('1008', '余国军', '2022-02-25', '10000', '50', '研发部门');
-- 1. 根据员工的薪资升序或者降序排列
-- 2.根据员工的薪资升序排列,且不查询到财务部门的员工信息
-- 3.查询姓名第二字非“麻”的且薪资>=15000的员工信息,根据薪资升序排列
-- 4.查询每位员工综合年薪 根据年薪降序排列
-- 5.求每个不同部门的平均薪水
-- 6.求每个不同部门的平均薪水且平均薪资大于13000的部门
-- 7.求每个部门中最高薪水
-- 8.求每个部门有多少员工
-- 9.查询员工最高薪资和最低薪资员工信息
-- 10.查询员工最高薪资和最低薪资的差距
多表关系
实际的项目开发中,一个项目通常需要很多张表才能完成。这些表之间存在的一定关系。
例如:
1.一对一 使用较少
2.一对多
3.多对多
一对一
1.一个学生只有一张身份证,一个身份证也只能够对应一个学生
2.一般一对一关系使用频率很低
一对多
例如:学生班级表(stu_class)、学生信息表(stu_info)等多张表
1.一个学生只有一个班级,学生信息表与班级表一一对应
2.在表中添加一个外键,指向另一方主键,确保一对一关系
多对多
学生和课堂
1.一个学生可以选择多门课程学习,一个课程也可以被多名学生选择
原则:多对多关系实现需要借助第三张中间表实现,中间表至少需要包含两个字段,将多对多的关系拆分成一对多的关系。
外键约束
MySQL外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关字段中主键所在的表就是主表(父表),外键所在的表即使从表(子表)。
外键用来建立主表与从表的关联关系为两个表的数据建立连接,约束两个表中数据的一致性和完整性。
注意事项:
主表删除某条记录时,从表中与之对应的记录也必须有相应的改变。一个表可以有一个或多个外键,外键值可以为空,若不为空值,则每一个外键的值必须等于主表中主键的某个值。
定义外键时,需要遵守一下规则:
1.主表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则主表与从表是同一个表,这样的表称为自参照表,这种结构称之为自参照完整性。
2.必须在主表中定义主键
3.主键不能包含空值,但允许在外键中出现空。也就是说,只要外键的每个非空值出现在指定的主键中;
4.外键中列的数据类型必须和主表主键中对应列的数据类型相同。
创建主外键
在create table 语句中,通过foreign key关键字来指定外键,具体的语法如下:
例如:
删除外键约束
验证:外键约束
1.先向主表新增数据,再向从表新增数据
2.外键列的值必须要在主表中存在或者是为空
3.主表的数据不能够随便删除,从表数据可以随便删除或者先删除从表索引数据没有任何关联主表的字段,再可以删除主表的对应的数据
联表查询
多表联查是指多张表联合一起查询,例如学生信息与学生班级表、部门与员工表。
1.交叉连接查询(笛卡尔积)
2.内连接查询
3.外连接查询
4.子查询
5.表自关联
数据的准备:
CREATE TABLE `mayikt_class` (
`id` int NOT NULL,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `mayikt_student` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`age` tinyint DEFAULT '0',
`address` varchar(255) DEFAULT NULL,
`class_id` int DEFAULT NULL,
PRIMARY KEY (`id`),
CONSTRAINT mayikt_class_id FOREIGN KEY (class_id) REFERENCES mayikt_class(id) -- 外键约束
);
INSERT INTO `mayikt`.`mayikt_class` (`id`, `name`) VALUES ('1', '第一期');
INSERT INTO `mayikt`.`mayikt_class` (`id`, `name`) VALUES ('2', '第二期');
INSERT INTO `mayikt`.`mayikt_student` (`id`, `name`, `age`, `address`, `class_id`) VALUES ('1', 'mayikt', '18', '武汉市', '1');
INSERT INTO `mayikt`.`mayikt_student` (`id`, `name`, `age`, `address`, `class_id`) VALUES ('2', 'meite', '23', '上海市', '2');
INSERT INTO `mayikt`.`mayikt_student` (`id`, `name`, `age`, `address`, `class_id`) VALUES ('3', '李思', '12', '孝感市', '1');
INSERT INTO `mayikt`.`mayikt_student` (`id`, `name`, `age`, `address`, `class_id`) VALUES ('4', '刘流', '27', '武汉市', '1');
交叉连接查询(笛卡尔积)
语法:select * from 表名1,表名2;
得到的结果是两张表的笛卡尔积,也就是表1中的每条数据都去匹配表2中的所有数据,获得的结果往往不是我们需要的,一般很少使用交叉连接,缺点数据冗余。
内连接
显示内连接:
SELECT * FROM A INNER JOIN B ON 条件;
隐示内连接:
SELECT * FROM A,B WHERE 条件;
案例
-- 1.查询每个班级下所有学生信息
-- 显示内连接
select * from mayikt_class INNER JOIN mayikt_student
on mayikt_class.id =mayikt_student.class_id;
-- 隐士内连接
SELECT * from mayikt_class ,mayikt_student where mayikt_student.class_id=
mayikt_class.id
-- 2.需求查询第一期所有学生
SELECT * from mayikt_class ,mayikt_student where mayikt_student.class_id=
mayikt_class.id and mayikt_class.id='1'
select * from mayikt_class INNER JOIN mayikt_student
on mayikt_class.id =mayikt_student.class_id and mayikt_class.id='1'
-- 3.查询第一期和第二期所有的学生
select * from mayikt_class INNER JOIN mayikt_student
on mayikt_class.id =mayikt_student.class_id and (mayikt_class.id='1'
or mayikt_class.id='2')
select * from mayikt_class INNER JOIN mayikt_student
on mayikt_class.id =mayikt_student.class_id and mayikt_student.class_id in
(1,2)
-- 4.查询每个班级下的学生总数 并且学生总数升序排列
select mayikt_class.`name` , count(*) from mayikt_class INNER JOIN mayikt_student
on mayikt_class.id =mayikt_student.class_id GROUP BY mayikt_class.id
order by count(*) asc
-- 5.查询班级总人数>2的班级,并且人数降序排列
select mayikt_class.`name` , count(*) from mayikt_class INNER JOIN mayikt_student
on mayikt_class.id =mayikt_student.class_id GROUP BY mayikt_class.id HAVING
count(*)>2
order by count(*) asc
外连接
外连接:左外连接、右外连接,全外连接(union)。
1.左外连接:(left outer join,outer可以省略)
语法:select * from A left outer join B on 条件;
左外连接获得的查询结果是左边的表A 的全部信息和A,B两张表的交集;左边A表的全部包含A 表在B表中没有对应关系的信息。
2.右外连接(right outer join,outer可以省略)
语法:select * from A right outer join B on 条件;
总结:右外连接获得的查询结果是右边的表B的全部信息和A,B两张表的交集;右边B表的全部包含B表中在A 表中没有对应关系的信息。
3.全外连接
左连接:以左边为准,左边有该数据就返回,右边没有匹配上就直接返回null
右连接:以右边为准,右边有该数据就返回,左边没有匹配上就直接返回null
内连接:左右两边都是必须匹配才会返回
案例需求:
MySQL union操作符用于连接两个以上的select语句的结果组合到一个结果集合中。多个select语句会删除掉重复的数据。
子查询
基本子查询
子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQL4.1开始引入,在select子句中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一个表或者多个表。
通俗易懂来说就是select嵌套的查询,类比于Java中的嵌套循环
子查询中常用的操作符有 any(some)、all、in和exists
需求:
1.查询年龄最大的学生信息,显示信息包含学生的id,学生的姓名和学生年龄
2.查第一期和第三期学生信息
3.查询第一期学生年龄大于18岁的学生信息
子查询关键字---all
all关键字用在比较操作操作符后面,表示查询结果的多个数据中的所有数据都满足该比较操作符才算满足
比较操作符:=、>、!=、>=、<=等
子查询关键字---any
需求:查询学生年龄大于第一期任意一个学生年龄的信息
all 底层 多个 and 比较
any 底层 多个or 或者比较
子查询关键之---not in 和 in
语法:
特点:
in关键字,用于判断某个记录的值,是否在指定的集合中。
使用not in可以实现取反
需求:
查询第一期和第三期所有学生信息
in 子查询语句中 等于or连接比较
select * from mayikt_student where class_id=1 or class_id=3;
all 子查询语句中 and 比较符
any 子查询语句中 or 比较符
子查询关键字之exists
EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False
EXISTS比in关键字运算效率高,实际开发中 如果是数据量大的情况下 推荐使用EXISTS关键字。
语法:
需求1:
查询学生年龄大于18岁的学生信息
2.查询班级下有学生的班级
3.查询有班级的学生信息
子查询之自关联查询
对MySQL数据自身进行关联查询(类比于Java中的递归),即一张表自己玩,自己和自己关联,一张表当成多张表来使用。但要注意,关联查询时必须给表取别名
高难度的多表联查练习1
表结构
CREATE TABLE `mayikt_dept` (
`dept_no` int NOT NULL COMMENT '部门id',
`dept_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '部门名称',
`dept_address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '部门地址',
PRIMARY KEY (`dept_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
CREATE TABLE `mayikt_emp` (
`emp_number` int DEFAULT NULL COMMENT '员工编号',
`emp_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '员工编号',
`emp_post` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '员工职务',
`emp_leader_number` int DEFAULT NULL COMMENT '员工领导编号',
`emp_hiredate` datetime DEFAULT NULL COMMENT '员工入职时间',
`emp_salary` double(10,0) DEFAULT NULL COMMENT '员工薪水',
`emp_bonus` int DEFAULT NULL COMMENT '员工奖金',
`emp_deptno` int DEFAULT NULL COMMENT '员工对外部门表外键'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
INSERT INTO `mayikt`.`mayikt_dept` (`dept_no`, `dept_name`, `dept_address`) VALUES ('1', '技术部门', '湖北武汉市');
INSERT INTO `mayikt`.`mayikt_dept` (`dept_no`, `dept_name`, `dept_address`) VALUES ('2', '财务部门', '中国上海市');
INSERT INTO `mayikt`.`mayikt_dept` (`dept_no`, `dept_name`, `dept_address`) VALUES ('3', '设计部门', '湖北孝感市');
INSERT INTO `mayikt`.`mayikt_emp` (`emp_number`, `emp_name`, `emp_post`, `emp_leader_number`, `emp_hiredate`, `emp_salary`, `emp_bonus`, `emp_deptno`) VALUES ('1001', '余胜军', 'CEO', NULL, '2021-11-01 11:32:46', '20000', '10000', '1');
INSERT INTO `mayikt`.`mayikt_emp` (`emp_number`, `emp_name`, `emp_post`, `emp_leader_number`, `emp_hiredate`, `emp_salary`, `emp_bonus`, `emp_deptno`) VALUES ('1002', '小薇', 'CFO', '1001', '2021-10-01 11:32:46', '5000', '10000', '2');
INSERT INTO `mayikt`.`mayikt_emp` (`emp_number`, `emp_name`, `emp_post`, `emp_leader_number`, `emp_hiredate`, `emp_salary`, `emp_bonus`, `emp_deptno`) VALUES ('1004', '张三', 'CTO', NULL, '2021-11-01 11:32:46', '80000', '10000', '1');
INSERT INTO `mayikt`.`mayikt_emp` (`emp_number`, `emp_name`, `emp_post`, `emp_leader_number`, `emp_hiredate`, `emp_salary`, `emp_bonus`, `emp_deptno`) VALUES ('1005', '李四', '技术总监', '1004', '2021-11-01 11:32:46', '20000', '10000', '1');
INSERT INTO `mayikt`.`mayikt_emp` (`emp_number`, `emp_name`, `emp_post`, `emp_leader_number`, `emp_hiredate`, `emp_salary`, `emp_bonus`, `emp_deptno`) VALUES ('1006', '王麻子', '客服', NULL, '2022-03-02 11:49:45', '3500', NULL, NULL);
1.返回员工拥有部门的 员工信息含员工部门
select * from mayikt_emp as a join mayikt_dept as b
on a.emp_deptno=b.dept_no;
2.查询员工薪资大于小薇的 员工信息
select * from mayikt_emp where emp_salary>(
select emp_salary from mayikt_emp where emp_number='1002'
)
3.返回员工所属领导信息
select * from mayikt_emp as a, mayikt_emp as b
where a.emp_number=b.emp_leader_number
4.返回入职时间早于领导 入职时间
select * from mayikt_emp as a, mayikt_emp as b
where a.emp_number=b.emp_leader_number
and a.emp_hiredate>b.emp_hiredate
5.返回从事财务工作的员工信息
select * from mayikt_emp as a join mayikt_dept as b
on a.emp_deptno=b.dept_no
and b.dept_name='财务部门'
6.求每个部门 最低员工薪资
select emp_deptno,min(emp_salary)
from mayikt_emp GROUP BY emp_deptno
7.返回员工薪资大于 平均薪资员工
select *
from mayikt_emp where emp_salary >(
select avg(emp_salary)
from mayikt_emp
)
题目2
数据sql
CREATE TABLE `mayikt_salgrade` (
`grade` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '员工等级',
`losal` double(255,0) DEFAULT NULL COMMENT '最低工资',
`hisal` double DEFAULT NULL COMMENT '最高工资'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
1.查询工资大于财务部所有员工的 信息
select *
from mayikt_emp where emp_salary > all(
select emp_salary
from mayikt_emp where emp_salary and emp_deptno='2'
)
2.求从事相同职务工作最低工资和最高工资
select emp_post,min(emp_salary) as 最低工资,max(emp_salary) as 最高工资
from mayikt_emp GROUP BY emp_post
3.计算每位员工的年薪,并且以年薪降序排列
select ((emp_salary *12)+emp_bonus) as 年薪
from mayikt_emp ORDER BY 年薪 desc
4.返回工资处于P4级别员工的信息
select *
from mayikt_emp where emp_salary BETWEEN (
select losal
from mayikt_salgrade where grade='P4'
) and (
select hisal
from mayikt_salgrade where grade='P4'
)
5.返回工资处于P1员工信息含部门名称
select *
from mayikt_emp as e join
mayikt_dept as d on e.emp_deptno=d.dept_no
join mayikt_salgrade s
on s.grade='p1' and e.emp_salary>=s.losal and e.emp_salary
<=s.hisal
1.查询工资大于财务部所有员工的 信息
2.求从事相同职务工作最低工资和最高工资
3.计算每位员工的年薪,并且以年薪降序排列
4.返回工资处于P4级别员工的信息
5.返回工资处于P1员工信息含部门名称
MySQL基础环节余胜军课堂笔记相关推荐
- Java集合框架笔记记录 --- 原创@余胜军 但有个人心得
Java集合框架课程安排 1.集合框架API知识 List/Set/Map集合 2.常见数据结构 数组/链表/队列/树 3.集合源码解读 List/Set/Map1.为什么需要学习Java中集合框架呢 ...
- 蚂蚁课堂 - springboot入门(非常详细)讲解人:(余胜军)
蚂蚁课堂 - springboot入门(非常详细)讲解人:(余胜军) http://www.mayikt.com/course/video/1172
- SpringBoot入门到精通 idea教学 (余胜军通俗易懂版本)
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过 ...
- 蚂蚁课堂(每特教育)-余胜军-史上最全SpringCloud微服务视频教程教程
网盘地址: https://pan.baidu.com/s/1PWPaPvD0Smvk__b6IIzr9A 附录 其他一些视频教程 https://www.fageka.com/Store/Index ...
- MySQL基础-传智黑马网课笔记
今日内容 1. 数据库的基本概念 2. SQL 数据库的基本概念 1. 数据库的英文单词: DataBase 简称 : DB 2. 什么数据库?* 用于存储和管理数据的仓库.3. 数据库的特点:1. ...
- 潭州课堂25班:Ph201805201 爬虫基础 第九课 图像处理- PIL (课堂笔记)
Python图像处理-Pillow 简介 Python传统的图像处理库PIL(Python Imaging Library ),可以说基本上是Python处理图像的标准库,功能强大,使用简单. 但是由 ...
- 潭州课堂25班:Ph201805201 爬虫基础 第六课 选择器 (课堂笔记)
HTML解析库BeautifulSoup4 BeautifulSoup 是一个可以从HTML或XML文件中提取数据的Python库,它的使用方式相对于正则来说更加的简单方便,常常能够节省我们大量的时间 ...
- mysql循环查询一个表中的数据并进行修改_JavaScript学习笔记(二十四)-- MYSQL基础操作...
MYSQL mysql 是一个数据库的名字 和 php 合作的比较好的数据库 之前我们说过一个问题,前端向后端索要数据,后端就是去数据库中查询数据,返回给前端 接下来就聊聊使用 php 操作数据库 M ...
- MySQL约束- 基础(课堂笔记)
# DQL:查询语句 1.排序查询 * 语法:order by 子句 *order by 排序字段1 排 ...
最新文章
- GPU—加速数据科学工作流程
- sys.argv[n] (终端运行python文件第n个参数) 在 pycharm 中的应用
- Ubuntu下安装ruby的三种方式
- Flex中如何通过horizontalTickAligned和verticalTickAligned样式指定线图LineChart横竖方向轴心标记的例子...
- Map集合中的一些具体方法的体现
- 北邮计算机系统结构课件,TEC-8 运算器组成实验(北邮).ppt
- 【转】[完全免费] 在线UML Sequence Diagram 时序图工具 - 教程第3部分
- 刚刚,华为云找到了更安全更卫生的乘坐电梯方式
- 80后屌丝站长自曝日赚6000(纯分享贴)
- ognl概念和原理详解
- Atitit.atiagent agent分销系统 代理系统 设计文档
- python存钱挑战_案例(4):52周存钱法
- 【延展Extension的使用场景 Objective-C语言】
- 基于stm32单片机的空气质量检测仿真(仿真+源码+全套资料)
- 三星s4流量显示无服务器,三星s4有什么隐藏功能
- Windows10使用自带表情包
- PTA 天梯赛 L1-7 天梯赛的善良 (20 分)
- 实例6.1 六度空间分数 30 DS课程组 单位 浙江大学
- HackMyvm(二十)Driftingblues8系列文章持续更新
- Netty的UDP广播发送与接收
热门文章
- 【雷达基础知识】-------德雅村支书第二更(浅谈dB的计算以及波段的划分[L,S,C,X等波段])(原创内容,转载请标注德雅村支书)
- (mt6735)Android5.1横屏修改记录
- 天津高中春招考计算机题,春季高考历年真题-天津市春季高考计算机试卷.doc
- 留给房产公司抛售房子的时间最多5个月
- 运放方波发生器原理分析及实践过程
- 计算机综述性论文范文例文,综述性论文范文例文(综述论文范文模板例文)
- html实现点击部分页面跳转,打造营销服务闭环,在基木鱼如何利用美洽高效赋能客户...
- 计算机辅助诊断(Computer-aided diagnosis)小总结
- CADe_SIMu V1.0.0.1仿真软件分享
- Linux下Makefile编写语法