Offer

尚硅谷--MySQL--基础篇(P1~P95)

尚硅谷--MySQL--基础篇(P1~P95)

参考链接:https://www.bilibili.com/video/BV1iq4y1u7vj?p=199&spm_id_from=pageDriver

尚硅谷非常好的视频之一,由于时间原因先学的高级篇,建议结合前面《JavaGuider-数据库篇》进行查漏补缺,整个Mysql完整系统性学下来还是非常有收获的。

csdn csdn csdn csdn csdn


🔥1. Mysql基础篇

1.1.基本概念
1.1.1 数据库名词

​ DBMS:数据库管理系统(管理各个数据库)如:mysql Server,Oracle

​ DB:数据库

​ RDBMS:关系型数据库,即二维表格数据

​ 非RDBMS:非关系型数据库,如键值数据库,文档型数据库

1.1.2 ER图与表关联关系

​ ER图:实体集(库表)、属性(字段)、联系集(库表之间关系)

​ 表关联关系:一对一、一对多、多对多、自我引用

1.1.3 SQL名词
  1. DDL(data definition language):数据定义语言,操作库表, create, drop, alter
  2. DML(data manipulation language):数据操作语言, CRUD
  3. DCL(data control language):数据控制语言。commit ,rollback
  4. TCL(transaction control language): 单独抽取commit rollback
1.1.4 笛卡尔积

​ 两张表的乘积个数。

(表一旦取了别名就不能再用表原名)

1.1.5 连接查询
  1. Mysql不支持满外连接

  2. union返回两个结果集并集并去重

  3. union all 返回两个结果并集不去重(若明确知道重复数据,则使用union all 可以提高查询效率)

  4. natural join

    1. -- 目前都是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 个人总结

image-20220731120202523

【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基础,开始后续内容的同学,这个子篇可以略过。
在工作中,根据公司需要进行学习即可。

posted @ 2022-07-31 12:04  Empirefree  阅读(297)  评论(0编辑  收藏  举报