尚硅谷--MySQL--基础篇(P1~P95)
参考链接:https://www.bilibili.com/video/BV1iq4y1u7vj?p=199&spm_id_from=pageDriver
尚硅谷非常好的视频之一,由于时间原因先学的高级篇,建议结合前面《JavaGuider-数据库篇》进行查漏补缺,整个Mysql完整系统性学下来还是非常有收获的。
1. Mysql基础篇
1.1.基本概念
1.1.1 数据库名词
DBMS:数据库管理系统(管理各个数据库)如:mysql Server,Oracle
DB:数据库
RDBMS:关系型数据库,即二维表格数据
非RDBMS:非关系型数据库,如键值数据库,文档型数据库
1.1.2 ER图与表关联关系
ER图:实体集(库表)、属性(字段)、联系集(库表之间关系)
表关联关系:一对一、一对多、多对多、自我引用
1.1.3 SQL名词
- DDL(data definition language):数据定义语言,操作库表, create, drop, alter
- DML(data manipulation language):数据操作语言, CRUD
- DCL(data control language):数据控制语言。commit ,rollback
- TCL(transaction control language): 单独抽取commit rollback
1.1.4 笛卡尔积
两张表的乘积个数。
(表一旦取了别名就不能再用表原名)
1.1.5 连接查询
-
Mysql不支持满外连接
-
union返回两个结果集并集并去重
-
union all 返回两个结果并集不去重(若明确知道重复数据,则使用union all 可以提高查询效率)
-
natural join
-
-- 目前都是mysql采用SQL99语法: 自动查询两张表中所有字段相同,实现select * from emp join dept where emp.did = dept.did and emp.name = dept.name这种 SELECT * FROM `emp` NATURAL join dept -- 等价于emp.did=dept.did中同名字段 select * from emp join dept using(did)
-
1.2 基本语法
1.2.0 基本语法
-- 算术运算符
select 100 + 17.6, 10 * 5, 100 / 2;
select * from user where id % 2 =0;
-- <=>安全的等于
select * from user where id <=> 1;
-- 不等于
select * from user where id <> 1;
1.2.1 基本函数
-- 数学:三角、进制函数
-- 字符串函数
/*日期函数:惭愧,以前还写了篇SQL高级用法博客,结果在尚硅谷这里也只是基本篇某个篇章,越是无知越自大啊。
https://www.cnblogs.com/meditation5201314/p/15143702.html
*/
-- 流程控制函数 if可以选择2种结果。 case when... else end类似于if else
select id, if(id >= 1, 'id大于等于1', 'id小于1'),
case when id = 1 then 'id等于1'
when id >1 and id <= 2 then 'id大于1小于2'
else '大于2' end 'details'
from emp
-- case ..when..else .. end 结合算术运算使用类似于switch..case
select case id when 1 then id * 100
else id *200 end '新id'
from emp
-- Mysql信息函数
select
VERSION() 'Mysql版本',
CONNECTION_ID() '连接id',
DATABASE() '数据库',
SCHEMA(),
USER() '用户',
CURRENT_USER() '当前用户',
CHARSET('尚硅谷') '字符集',
COLLATION('尚硅谷') '比较规则'
1.2.2 聚集函数
-- 可以单独使用sum, avg,count这些
select sum(id) from emp;
select avg(id) from emp
-- 分组后可以统计组内其他字段
SELECT name, sum(last_qr_user_id) FROM `user` group by name
-- 多个字段分组
-- varchar类型存储int数据,也是可以相加的
SELECT name, last_qr_user_id, sum(last_transfer_time) FROM `user` group by name, last_qr_user_id
-- select中非组函数字段必须申明在group by中
-- with rollup,在分组后取一条不分组、所有数据的条件来做个比较
SELECT name, sum(last_qr_user_id) FROM `user` group by name with ROLLUP
-- Having必须在group后面使用
SELECT name, sum(last_qr_user_id) FROM `user` group by name having max(last_qr_user_id) > 1
-- 总体顺序 SQL执行原理:先多表join弄出一张虚拟表,然后根据条件查询
select ....from ...join on
where ....
group ....
having ....
order by ....
limit ...
1.3 子查询
1.3.1 基本概念
一条SQL查询出来的值查询完后,供另一条SQL主查询使用。能用自连接尽量避免子查询,因为是对未知表先查询,mysql处理器对自连接做了优化。
1.3.2 子查询分类
1. 单行、多行子查询:看内查询返回的结果
1. **相关、不相关子查询**:子查询和主查询是否相关
1.3.3 单行子查询
单行子查询就是只返回一行结果
-- 成对,可以进行多字段子查询
select * from user where (last_transfer_time, last_qr_user_id) in (
select last_transfer_time, last_qr_user_id from user where id in(67, 69)
)
-- 子查询配合having使用
select name, min(last_qr_user_id) from
user group by name having min(last_qr_user_id) < (
select max(last_qr_user_id) from user
)
##单行子查询-针对某个不确定的字段
SELECT
id,
NAME,
(
CASE
name
WHEN ( SELECT name FROM USER WHERE NAME = 'a函数一' ) then '胡宇乔'
ELSE '其他' END ) new_Name
FROM
USER
-- 错误用法!:不能重复嵌套聚合函数
select sum(avg(last_qr_user_id)) from user group by name
1.3.4 多行子查询
多行子查询:返回多个子查询结果
操作符:
1. in: 列表任意一个
1. any: 和单行比较
-- NULL问题:无论是单行还是多行,对子查询的值小心NULL值,因为in 相当于or = ,in (1, null) 等价于 a = 1 or a = null,而=null在MYSQL中查询不到任何数据,只能用is null,记得剔除
##多行子查询-any,all,some。any,some类似找min,all类似找MAX
#any
SELECT
*
FROM
USER
where id > ANY (select id from user where id > 1)
#all
SELECT
*
FROM
USER
where id >= ALL (select id from user where id > 1)
#some
SELECT
*
FROM
USER
where id >= SOME (select id from user where id > 1)
1.3.5 相关子查询(*)
这个还是非常重要,比如查询一张用户-客户表中,所有用户最早添加客户的时间,就需要用到相关子查询
select * from a
where a.add_time = (select min(add_time) from a2 where a.clientid = a2.clientid)
/* 除了group by 和limit 后,其他地方都可以声明子查询
select ..
from ...
where ...
group by ...
having ..
order by ..
limit ...
*/
1.4 数据类型
1.4.1 时间类型
推荐datetime,会随着服务器地区变换而变化,但timestamp不会
1.4.2 文本字符串类型
char, varchar(不要超过5000), text, enum
blob: 存储图片,音频,视频
json
1.5 个人总结
【MySQL上篇:基础篇】
【第1子篇:数据库概述与MySQL安装篇】
p01-p11
学习建议:零基础同学必看,涉及理解和Windows系统下MySQL安装
【第2子篇:SQL之SELECT使用篇】
p12-p48
学习建议:学习SQL的重点,必须重点掌握,建议课后练习多写
【第3子篇:SQL之DDL、DML、DCL使用篇】
p49-p73
学习建议:学习SQL的重点,难度较SELECT低,练习写写就能掌握
【第4子篇:其它数据库对象篇】
p74-p93
学习建议:对于希望早点学完MySQL基础,开始后续内容的同学,这个子篇可以略过。
在工作中,根据公司需要进行学习即可。
【第5子篇:MySQL8新特性篇】
p94-p95
学习建议:对于希望早点学完MySQL基础,开始后续内容的同学,这个子篇可以略过。
在工作中,根据公司需要进行学习即可。