MySQL第四讲
昨日内容回顾
表与表之间建关系(外键)
"""
表与表之间最多只有四种关系
一对多
多对多
一对一
没有关系 在确定表与表之间的关系的时候记住一句话
换位思考
"""
# 一对多(一对多、多对一都叫 一对多)
"""
一对多关系字段放在多的一方
以员工表和部门表
员工表就是多的一方 所以外键字段应该建在员工表里面
"""
站在两张表的基础之上 只有一方成立 那么就是一对多
create table dep(
id int primary key auto_increment,
dep_name char(16),
dep_desc char(32)
);
create table emp(
id int primary key auto_increment,
name char(16),
age int,
dep_id int,
foreign key(dep_id) references dep(id)
) # 多对多
站在两张表的基础之上 双方都成立 那么就是多对多
多对多需要创建第三张关系表来存储两张表的关系,两张表自身没有任何额外字段
"""
以图书表和作者表为例
多对多外键字段放在第三张表中
"""
create table book(
id int primary key auto_increment,
title char(16),
price float(10,2)
);
create table author(
id int primary key auto_increment,
name char(16),
age int
);
create table book2author(
id int primary key auto_increment, book_id int,
foreign key(book_id) references book(id)
on update cascade
on delete cascade, author_id int,
foreign key(author_id) references author(id)
on update cascade
on delete cascade
) # 一对一
"""
以用户与用户详情 针对一对一的外键关系 外键字段建在任意一方都可以
但是我们推荐你建在查询频率/使用频率较高的那张表
"""
站在双方的角度都不成立 一对一/没有关系
create table user(
id int primary key auto_increment,
name char(64) default 'jason',
gender enum('male','female','others') default 'male', user_detail_id int unique,
foreign key(user_detail_id) references user_detail(id)
on update cascade
on delete cascade
) create table user_detail(
id int primary key auto_increment,
phone int,
addr char(64)
)
外键注意事项
1.必须先创建被关联表(dep表) 2.录入数据的时候也是先录入被关联表的数据(dep表) 3.想要有关系的数据同步更新同步删除
create table emp(
id int primary key auto_increment,
name char(16),
age int,
dep_id int,
foreign key(dep_id) references dep(id)
on update cascade
on delete cascade
)
其他需要了解的sql语句操作
主要是针对表的操作 1.修改表名
alter table t1 rename t666; 2.添加字段
alter table t666 add password int;
alter table t666 add gender char(4) first;
alter table t666 add age int after name; 3.修改字段
alter table t666 modify password bigint;
alter table t666 change password pwd int; 4.删除字段
alter table t666 drop pwd;
复制表(了解)
"""
我们sql语句执行的结果可以把它看成是一张虚拟表
"""
create table t1 select * from t666;
# 将t666的数据复制到t1中了 但是没有外键、主键、索引....
作业
1.书籍表和出版社表(版权问题一本书不能被多个出版社出版)
一本书能否对应多个出版社 不可以
一个出版社能否对应多本书 可以
一对多
多:书
一:出版社
外键字段建在书的一方 2.文章表和文章分类表(按男女分类...)
一遍文章能够对应多个分类 不可以
一个分类能否对应多个文章 可以
一对多
多:文章
一:分类
外键字段建在文章的一方 3.文章表和文章标签表(一个人可以有多个标签)
一遍文章可以有多个标签 可以
一个标签能否对应多个文章 可以
多对多
需要创建第三张关系表 4.作者表和作者详情表
一对一
今日内容概要
单表操作
select
from
where
group by
having
distinct
order by
limit
...
多表操作
1.子查询
2.联表查询
今日内容详细
前期表及数据准备
create table emp(
id int primary key auto_increment,
name varchar(20) not null,
sex enum('male','female') not null default 'male', #大部分是男的
age int unsigned not null default 28,
hire_date date not null,
post varchar(50),
post_comment varchar(100),
salary double(15,2),
office int, #一个部门一个屋子
depart_id int
);
# 插入数据
insert into emp(name,sex,age,hire_date,post,salary,office,depart_id) values
('jason','male',18,'20170301','张江第一帅形象代言',7300.33,401,1), #以下是教学部
('tom','male',78,'20150302','teacher',1000000.31,401,1),
('kevin','male',81,'20130305','teacher',8300,401,1),
('tony','male',73,'20140701','teacher',3500,401,1),
('owen','male',28,'20121101','teacher',2100,401,1),
('jack','female',18,'20110211','teacher',9000,401,1),
('jenny','male',18,'19000301','teacher',30000,401,1),
('sank','male',48,'20101111','teacher',10000,401,1),
('哈哈','female',48,'20150311','sale',3000.13,402,2),#以下是销售部门
('呵呵','female',38,'20101101','sale',2000.35,402,2),
('西西','female',18,'20110312','sale',1000.37,402,2),
('乐乐','female',18,'20160513','sale',3000.29,402,2),
('拉拉','female',28,'20170127','sale',4000.33,402,2),
('僧龙','male',28,'20160311','operation',10000.13,403,3), #以下是运营部门
('程咬金','male',18,'19970312','operation',20000,403,3),
('程咬银','female',18,'20130311','operation',19000,403,3),
('程咬铜','male',18,'20150411','operation',18000,403,3),
('程咬铁','female',18,'20140512','operation',17000,403,3);
ps:
select * from emp;
select * from emp\G;
*************************** 16. row ***************************
id: 16
name: 程咬银
sex: female
age: 18
hire_date: 2013-03-11
post: operation
post_comment: NULL
salary: 19000.00
office: 403
depart_id: 3
*************************** 17. row ***************************
"""
如果在windows系统中,插入中文字符,select的结果为空白,可以将所有字符编码统一设置成gbk
将配置文件中所有的编码由原来的utf8换成gbk
然后重启mysql服务端
"""
sql语句书写顺序和执行顺序
select name,salary from emp where id < 5;
# 执行顺序
from 1.先确定从哪张表找数据
where 2.再根据where后面的条件筛选
select 3.再获取指定的字段对应的数据
where筛选
"""
and 与 and连接的条件必须都满足
or 或 or连接的条件满足一个就可以
not 非 not取反
"""
# where后面跟得其实就是筛选条件
# 1.查询id大于等于3小于等于6的数据
select * from emp where id >= 3 and id <= 6 ;
select * from emp where id between 3 and 6; # 随你自己
# 2.查询薪资是20000或者18000或者17000的数据
select * from emp where salary=20000 or salary=18000 or salary=17000;
select * from emp where salary in (20000,18000,17000);
# 3.查询员工姓名中包含o字母的员工姓名和薪资
"""
模糊匹配
关键字 like
特殊符号
% 匹配任意个数的任意字符
_ 匹配一个任意字符
"""
select name,salary from emp where name like '%o%';
mysql> select name,salary from emp where name like '%o%';
+-------+------------+
| name | salary |
+-------+------------+
| jason | 7300.33 |
| tom | 1000000.31 |
| tony | 3500.00 |
| owen | 2100.00 |
+-------+------------+
mysql> select name,salary from emp where name like 'o%';
+------+---------+
| name | salary |
+------+---------+
| owen | 2100.00 |
+------+---------+
mysql> select name,salary from emp where name like '%o';
# 4.查询员工姓名是由四个字符组成的员工姓名与其薪资
select name,salary from emp where name like '%%%%'; 不行!!!
select name,salary from emp where name like '____';
# 5.查询id小于3或者大于6的数据
select * from emp where id < 3 or id > 6;
# 6.查询薪资不在20000,18000,17000的数据
select * from emp where salary not in (20000,18000,17000);
# 7.查询岗位描述为空的员工名与岗位名
select name,post from emp where post_comment=NULL; 没有效果!!!
select name,post from emp where post_comment is NULL;
针对null不能用等号,只能用is
group by分组
"""
聚合函数
max 求最大值
min 求最小值
avg 求平均值
sum 求和
count 统计个数
聚合函数只能在分组之后使用
"""
# 数据分组应用场景:每个部门的平均薪资,男女比例等
"""
将个体按照组 组成一个个的整体
然后就以整体为单位操作
"""
# 1.按部门分组
select * from emp group by post; # group by后面跟什么就按照什么分组
"""
分组之后默认情况下不应该再直接获取到组内单个元素的数据,而是只能获取分组的依据
按照部门分组的话 那么你就只能获取到部门
5.6及之前的版本 没有设置严格模式 分组之后数据随便拿也不报错
5.6之后的版本的 分组之后select后面只能写分组的依据 不能直接写其他字段
"""
set global sql_mode="strict_trans_tables,only_full_group_by";
退出客户端重新进入即可
mysql> select * from emp group by post;
ERROR 1055 (42000): 'day04.emp.id' isn't in GROUP BY
mysql> select name from emp group by post;
ERROR 1055 (42000): 'day04.emp.name' isn't in GROUP BY
mysql> select salary from emp group by post;
ERROR 1055 (42000): 'day04.emp.salary' isn't in GROUP BY
mysql> select post from emp group by post;
+-----------------------------+
| post |
+-----------------------------+
| operation |
| sale |
| teacher |
| 张江第一帅形象代言 |
+-----------------------------+
'''
# 1 获取每个部门的最高工资
select max(salary) from emp group by post;
mysql> select post,max(salary) from emp group by post;
+-----------------------------+-------------+
| post | max(salary) |
+-----------------------------+-------------+
| operation | 20000.00 |
| sale | 4000.33 |
| teacher | 1000000.31 |
| 张江第一帅形象代言 | 7300.33 |
+-----------------------------+-------------+
mysql> select post,max(salary) as '最高薪资' from emp group by post;
+-----------------------------+--------------+
| post | 最高薪资 |
+-----------------------------+--------------+
| operation | 20000.00 |
| sale | 4000.33 |
| teacher | 1000000.31 |
| 张江第一帅形象代言 | 7300.33 |
+-----------------------------+--------------+
mysql> select post as '部门',max(salary) as '最高薪资' from emp group by post;
+-----------------------------+--------------+
| 部门 | 最高薪资 |
+-----------------------------+--------------+
| operation | 20000.00 |
| sale | 4000.33 |
| teacher | 1000000.31 |
| 张江第一帅形象代言 | 7300.33 |
+-----------------------------+--------------+
# 每个部门的最低工资
select post,min(salary) from emp group by post;
# 每个部门的平均工资
select post as '部门', avg(salary) as '平均工资' from emp group by post;
# 每个部门的员工人数
select post as '部门',count(id) as '员工人数' from emp group by post;
# 3.查询分组之后的部门名称和每个部门下所有的学生姓名
select post,group_concat(name) from emp group by post;
select post,group_concat(name,'_NB') from emp group by post;
select post,group_concat(name,':',salary) from emp group by post;
"""
数据的拼接操作
分组之后可以使用
group_concat
分组之前可以使用
concat
"""
# 4.补充concat(不分组时用)拼接字符串达到更好的显示效果 as语法使用
select name as 姓名,salary as 薪资 from emp;
select concat("NAME: ",name) as 姓名,concat("SAL: ",salary) as 薪资 from emp;
分组注意事项
select id,name,age from emp where max(salary) > 3000; 不能这么用
select max(salary) from emp;
不分组的情况下默认整体就是一组 可以在select的后面使用聚合函数
8、统计各部门年龄在30岁以上的员工平均工资
# 1.先拿到所有年龄大于30岁的员工数据
select * from emp where age > 30;
# 2.再按照部门分组 得到年龄大于30岁的部门
select post,group_concat(name) from emp where age > 30 group by post;
# 最终完成
select post,avg(salary) from emp where age > 30 group by post;
having分组之后过滤
"""
where
having
两者的功能都是筛选数据 是一样的
但是两者的使用场景不一样
where分组之前使用
having分组之后使用
"""
1、统计各部门年龄在30岁以上的员工平均工资,并且保留平均工资大于10000的部门
select post,avg(salary) from emp
where age > 30 # 1 先筛掉年龄小于30的
group by post # 2 得到30岁以上的员工组成的部门
having avg(salary) > 10000;
"""
1.from
2.where
3.group by
4.having
5.select
"""
#强调:having必须在group by后面使用
select * from emp having avg(salary) > 10000; # 报错
distinct去重
"""
distinct去重
必须是完全一样的数据才能去重
"""
select distinct id,age from emp; # 包含id肯定无法去重
order by排序
# 按照年龄排序
select * from emp order by age; # 默认 升序(从小到大) asc
select * from emp order by age asc; # 升序
select * from emp order by age desc; # 降序
# 单个条件比不出大小 可以比多个
select * from emp order by age,salary; # 第一个字段比不出来就用第二个
select * from emp order by age,salary desc;
# 统计各部门年龄在10岁以上的员工平均工资,并且保留平均工资大于1000的部门,然后对平均工资进行排序
select post,avg(salary) from emp
where age > 10
group by post
having avg(salary) > 1000
order by avg(salary);
limit限制展示条数
select * from emp limit 5; # 只要最开始的五条
select * from emp limit 0,5;
select * from emp limit 5,5;
select * from emp limit 起始位置,展示条数;
正则
我们的sql语句中也支持你书写正则表达式
"""
就是用特殊的符号 来帮你去一大段文本中匹配对应的内容
"""
select * from emp where name regexp '^j.*(n|y)$';
'^j.*(n|y)$':查看以字母j开头 字母n或者y结尾的字符串
多表操作
#建表
create table dep(
id int primary key auto_increment,
name varchar(20)
);
create table emp(
id int primary key auto_increment,
name varchar(20),
sex enum('male','female') not null default 'male',
age int,
dep_id int
);
#插入数据
insert into dep values
(200,'技术'),
(201,'人力资源'),
(202,'销售'),
(203,'运营');
insert into emp(name,sex,age,dep_id) values
('jason','male',18,200),
('egon','female',48,201),
('kevin','male',18,201),
('nick','male',28,202),
('owen','male',18,203),
('jerry','female',18,204);
select * from dep,emp; # 结果是一个笛卡尔积(不需要掌握)
select * from dep,emp where dep.id = emp.dep_id; # 一定要加表前缀
连表操作
"""
inner join
left join
right join
union
"""
# inner join 内连接 只按照两张表都有的数据拼接(没有的就都不拼接)
select * from dep inner join emp on dep.id = emp.dep_id;
# left join 左连接 以左表为基准展示所有的数据(没有对应的用NULL代替)
select * from dep left join emp on dep.id = emp.dep_id;
# right join 右连接 以右表为基准展示所有的数据(没有对应的用NULL代替)
select * from dep right join emp on dep.id = emp.dep_id;
# union
select * from dep left join emp on dep.id = emp.dep_id
union
select * from dep right join emp on dep.id =emp.dep_id
MySQL第四讲的更多相关文章
- linux 学习3 第四讲 文件常用命令
好几天没有在网上总结了.我把ppt先誊写在本子上,这样听的时候记录就方便很多,添些东西就可以. 我想先看shell那部分,但是没有之前几章的准备,是没法跟着视频动手操作的.所以还是按部就班得学习. 虽 ...
- 极客时间 Mysql实战45讲 07讲行锁功过:怎么减少行锁对性能的影响笔记 极客时间
极客时间 Mysql实战45讲 07讲行锁功过:怎么减少行锁对性能的影响笔记 极客时间极客时间 Mysql实战45讲 07讲行锁功过:怎么减少行锁对性能的影响笔记 极客时间 笔记体会: 方案一,事务相 ...
- Mysql实战45讲 04讲深入浅出索引(上)读书笔记 极客时间
极客时间 Mysql实战45讲 04讲深入浅出索引 极客时间(上)读书笔记 笔记体悟 1.索引的作用:提高数据查询效率2.常见索引模型:哈希表.有序数组.搜索树3.哈希表:键 - 值(key - v ...
- 深挖计算机基础:MySQL实战45讲学习笔记
参考极客时间专栏<MySQL实战45讲>学习笔记 一.基础篇(8讲) MySQL实战45讲学习笔记:第一讲 MySQL实战45讲学习笔记:第二讲 MySQL实战45讲学习笔记:第三讲 My ...
- MySQL实战45讲学习笔记:第三十九讲
一.本节概况 MySQL实战45讲学习笔记:自增主键为什么不是连续的?(第39讲) 在第 4 篇文章中,我们提到过自增主键,由于自增主键可以让主键索引尽量地保持递增顺序插入,避免了页分裂,因此索引更紧 ...
- 《MySQL实战45讲》(1-7)笔记
<MySQL实战45讲>笔记 目录 <MySQL实战45讲>笔记 第一节: 基础架构:一条SQL查询语句是如何执行的? 连接器 查询缓存 分析器 优化器 执行器 第二节:日志系 ...
- 《MySQL实战45讲》(8-15)笔记
MySQL实战45讲 目录 MySQL实战45讲 第八节: 事务到底是隔离的还是不隔离的? 在MySQL里,有两个"视图"的概念: "快照"在MVCC里是怎么工 ...
- Stanford机器学习---第四讲. 神经网络的表示 Neural Networks representation
原文 http://blog.csdn.net/abcjennifer/article/details/7749309 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归 ...
- 转:C#精髓 第四讲 GridView 72般绝技
说明:准备出一个系列,所谓精髓讲C#语言要点.这个系列没有先后顺序,不过尽量做到精.可能会不断增删整理,本系列最原始出处是csdn博客,谢谢关注. C#精髓 第四讲 GridView 72般绝技 作者 ...
随机推荐
- RMAN-20201: datafile not found in the recovery catalog
oracle恢复报错如下: Recovery Manager: Release 10.2.0.4.0 - Production on Fri Aug 28 14:31:31 2015 Copyrigh ...
- 人工智能与智能系统2-> 机器人学2 | 时间与运动
<Robotics, Vision and Control>学习到第三章,我才发现这本书是有配套视频的,第二章看的好辛苦,很多地方生硬理解了一下,现在打算把视频再好好看一看,作为补充,也会 ...
- AT2043 [AGC004C] AND Grid
首先可以发现一个很简单的想法,因为最外层是一定不会有 \(\#\) 的,所以可以考虑让第一个网格图将每个连通块的最外层包起来,第二个网格图将就选择这个包内部的所有点即可. 但你发现这个想法是很难实现的 ...
- linux centos6.3 升级svn1.6到svn1.8
linux centos6.3 升级svn1.6 1. 删除svn1.6 #yum remover subverson12.设置svn1.8安装源 vim /etc/yum.repos.d/wandi ...
- 标签显示模式(display)
非洲黑人: 皮肤内黑色素含量高,以吸收阳光中的紫外线,保护皮肤内部结构免遭损害,头发象羊毛一样卷曲,使每根卷发周围都有许多空隙,空隙充满空气,卷发有隔热作用. 欧洲白人: 生活寒带或着是说常年温度较低 ...
- MySQL数据类型的最优选择
MySQL数据类型的最优选择 慎重选择数据类型很重要.为啥哩?可以提高性能.原理如下: ● 存储(内存.磁盘).从而节省I/O(检索相同数据情况下) ● 计算.进而 ...
- Byobu安装与使用
机子为Ubuntu18 Byobu安装 sudo apt-get install byobu Byobu安装后默认禁用,需要启用Byobu,之后每次登陆自动启用Byobu byobu-enable 还 ...
- SpringBoot一览
spring-boot入门 了解SpringBoot 为什么学习SpringBoot java一直被人诟病的一点就是臃肿.麻烦.当我们还在辛苦的搭建项目时,可能Python程序员已经把功能写好了,究其 ...
- Note/Solution - 转置原理 & 多点求值
\[\newcommand{\vct}[1]{\boldsymbol{#1}} \newcommand{\mat}[1]{\begin{bmatrix}#1\end{bmatrix}} \newcom ...
- 微服务从代码到k8s部署应有尽有系列(三、鉴权)
我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...