数据库-MySQL连表查询及原理
一.DQL
1.多表查询\连表查询
1.1笛卡尔积:
1.1.1什么是笛卡尔积
没有连接条件的表 关系的返回值结果【表之间数据组合的结果】
1.1.2.多表查询会产生笛卡尔积:
假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}
1.1.3.实际运行中
表与表之间要避免笛卡尔积 ------想要解决可以添加连表条件(使用关联条件)
1.1.4注意
如果关联N张表,至少需要是n-1个连接条件
ON 连表条件
1.1.5sql中笛卡尔积语法
方式一:
select 字段 from 表1,表2[,表N];
方式二:
select 字段 from 表1 join 表2 [join 表N];
2.内连接
语法:
方式一:
select 字段 from 表1 inner join 表2 on 连接条件;
方式二:
select 字段 from 表1 join 表2 on 连接条件;
方式三:
select 字段 from 表1, 表2 [where 关联条件];
【不写left和right就是内连接】
3.左连接
如果左表 中不存在右表数据那么右表数据用 null填充
语法:
select 列 from 主表 left join 从表 on 连接条件;
4.右连接
右链接 以右边的表为基准,展示右表所有数据,在左边没有匹配上的数据使用null填充
select 列 from 从表 right join 主表 on 连接条件;
RIGHT JOIN
5.自连接就是内连接
6.子查询:
内层结果是外层的条件
多个字段要用括号括起来
二.DMI
1.新增
语法:
方式一:
insert into A(colum1,colum2,...)values(value1,value2,...)
方式二:
insert into A values(value1,value2,...)
INSERT INTO 表名 (字段名) VALSE (值);
例如:
2.修改
语法:
UPDATE 表名 Set 字段名 = 值 WHERE 条件
注意:
如果省略了where子句,则全表的数据都会被修改。注意:没有FROM
3.删除
语法:
//删除一条数据 DELETE FROM 表名 WHERE 表名 //删除一个表 //不添加条件就是删除表 DELETE FROM 表名 DROP 表名
DELETE 不会充值自增列
MYISAM 重启数据库,不会重置自增列
INNODB 重启数据库,
TRUNCATE 重置自增序列
注意:
如果省略了where子句,则全表的数据都会被删除
三.备份恢复
指令
工具
复制data文件夹
四.函数
1.聚合函数:
count(列名称) // 统计行
max(列名称) // 最大值
min(列名称) // 最小值
sum(列名称) // 求和统计
avg(列名称) // 求平均数
2.cast函数
CAST()函数的参数是一个表达式,它包括用AS关键字分隔的源值和目标数据类型。
语法如下:
cast(值 as 类型)
cast('123' as SIGNED) 将123转换为int类型,返回值为整型类型
select cast(salePrice as decimal)---->数据类型 ----Java中的数据类型
3.convert函数
对于简单类型转换,CONVERT()函数和CAST()函数的功能相同,只是语法不同。CAST()函数一般更容易使用,其功能也更简单。
语法如下:
select convert(expr ,type)
select convert('123',signed)
可以转换的类型是有限制的。这个类型可以是以下值其中的一个:
二进制,同带binary前缀的效果 : BINARY
字符型,可带参数 : CHAR()
日期 : DATE
时间: TIME
日期时间型 : DATETIME
浮点数 : DECIMAL
整数 : SIGNED
无符号整数 : UNSIGNED
4.decimal函数
定义数据类型为DECIMAL的列,
语法:
column decimal(P,D)
在上面的语法中:
P是表示有效数字数的精度。 P范围为1〜65。
D是表示小数点后的位数。 D的范围是0~30。MySQL要求D小于或等于(<=)P。
DECIMAL(P,D)表示列可以存储D位小数的P位数。十进制列的实际范围取决于精度和刻度。
综上,可以将上述小数转换为整数:
select cast('123.4' as decimal(P,D))
5.ifnull函数
语法:
IFNULL(expression_1,expression_2);
注意:
①如果expression_1不为NULL,则IFNULL函数返回expression_1
②否则返回expression_2的结果。
执行流程
FROM -> 决定从哪一个表查询
JOIN -> 决定跟哪一个表关联
ON -> 决定关联表的共同条件
WHERE -> 决定从表中哪一些开始查询(条件过滤,学会善用条件过滤)
GROUP BY -> 决定按照什么分组进行组内查询,一般跟聚集函数联合使用
SELECT -> 决定显示哪一些字段
HAVING -> 在组内条件过滤,一般使用SELECT语句中的聚集函数作为过滤条件
DISTINCT -> 根据select中的字段决定显示哪一些不重复的字段
ORDER BY -> 决定显示的排序规则
LIMIT -> 决定每一页显示多少条件记录
子查询的执行流程:
从最里面(深)的查询语句开始执行,逐级向外执行,直到最后一层,
子查询一般是用在where语句和from语句中,执行流程满足上面的执行流程
数据库设计三范式:
【表设计的依据】三种规范
1.表中的列都是不可拆分,列\字段都已经是最小粒度
2.第二范式(满足第一范式的前提下满足自己):【内键】表中的行是唯一的
3.第三范式(满足一二范式的前提下满足自己):【外键】表中不能出现冗余数据,一张表只描述一个事件
要反三范式,保证性能和规范
阿里规范中:连表数不能超过三张(要保证查询效率)