DQL(数据查询query语句)
查询结果处理
select 结果 from order by limit group by
查询的结果是一个虚拟的表格
*代表所有
支持算数运算(细节查询课件)
distinct 去重(所有列都相同叫重)
-
函数
(使用时 一般要先加字段 末尾最后加表名 from)
单行函数 :原来多少行处理后还是多少行
字符处理函数
汉字在utf-8占三个字节
as 别名
char_length字符
concat 字段连接
upper 转大写 lower转小写
substring 截取字符串 从1开始
instr 返回字符串第一次出现的索引,找不到返回0
trim 去掉前后的空格 或者字串 from
分组函数(也叫统计函数):把多行数据处理后变完一行数据
lpad rpad左填充 右填充
replace 替换
now():返回当前的日期和时间
curdate():返回当前的日期
curtime():返回当前的时间
year(date),month(),day(),hour(),minute(),second()只要日期时间的个别部分 只要年,月......
str_to_date(日期,格式)字符串转日期
date_format(日期,格式)日期转字符串
datediff(big,small)返回两个日期的相差天数
逻辑处理函数
case when条件 then 结果1 else 结果2 end;可以有多个when
ifnull( , )
if(条件,结果1,结果2)
分组函数
用作统计需求
sum avg 处理数值类型
max min count()处理任何类型
都可以忽略null值
count(*)用于统计行数
2.条件查询
where 条件 and/or 条件
in()相当于or
not
查询空值要用 is null
between and 之间(包含边界 )
like 模糊查询(有弊端 后期有替代 了解即可)
通配符 % 任意多个字符包含0个字符 , _ 任意多个字符
不为空 是 not null
3.分组查询
group by
order by 排序 desc降序
limit(n,m)从n+1开始显示 一共显示m个
查询条件 case when在里面
条件 升降序 分组 在from table_name 后面
查询 后 就是 字段
union(通过union连接两个查询语句,会把重复的记录删掉)
union all(效率高于union)
排序 order by(besc)
先查询字段(查字段中可能有选择语句) 然后是from table 条件语句 排序 限制等等
group by 多用于统计
查什么 by 后面就加什么 经常和count组合
子查询 from(查询的表)
having 分组后的数据 过滤
where 分组前的数据 筛选过滤
多表设计_关联查询
为什么需要多表关联???
答:一张表不能满足需求 不能将所有的信息都存储在一张表内 所以需要多张表
数据冗余拆分
把表与表关联起来即可
外键(foreign key)!
references 参考
1.数据库设计范式
第一范式 确保列的原子性(不可再拆分 整体)
第二范式 有主键(完全函数依赖 为了找到其他的字段)
第三范式 消除函数传递(消除冗余) 使用外键 进行关联
修改表结构
alter table table_name add column 字段名 数据类型(和关联的表要一致)
外键约束
外键有弱关联约束(没有约束)
外键有强关联关系(有约束)
在建表中可直接添加约束
constraint 约束名 foreign key(主表的id) references table_name (id)
约束名命名规则
外键_外表 _ 主表 _ 字段名
FK_ForeigntTable_PrimaryTable_on_ForeignColumn
添加约束后 要遵守规则约束
删除主表要保证从表没人使用
2.多表查询
防止笛卡尔积现象
如何避免:添加有效的连接条件
内连接:inner join(没有关系不影响)
左外连接left join
右外连接
right join
多表查询 on和where的区别.
on是先对表进行筛选再生成关联表,where是先生成关联表再对关联表进行筛选
on先执行,where后执行。外连接时,on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。而where条件是在临时表生成好后,再对临时表进行过滤的条件。
3.子查询
返回一个值
查询 最高 人 的信息
这里给出两个信息 第一是最高 第二是信息
所以需要子查询 两条查询语句
select 只能出现标量子查询
from 表子查询
where 标量子查询 列子查询
1 是一列
2 是标量
3 表
图解 SQL 的执行顺序
![](https://i-blog.csdnimg.cn/blog_migrate/d99566057afbc9c0b494b99051e34cbf.png)
1:先执行from 和 join 确定表之间的连接关系
2:where对数据进行初步筛选
3:group by 进行分组
4: having函数
5: distinct 去重
6: order by 排序
where和join连接表有什么区别?????????????????
在WHERE子句中不可以使用函数
8版本 子查询 in 和limit不能同用