语言分类:
DQL(数据查询) DML(数据操作) DDL(数据定义) TLC(事务控制) DCL(数据控制)
不建议 select *
注意: '_'表示第几个 一个_表示第几个 可以进行转义
order by
sal asc,name asc 第一个 asc起主导,如果第一个相同,再执行第二个asc
单行处理函数 一个输入 一个输出
多行处理函数 多个输入 一个输出
常用方法:
Lower()转换小写
upper()转换大写
substr(被截取的字符串,起始下标(起始为1),截取的长度)
concat(str,str)进行拼接
length()取长度
trim()去空格
str_to_date()将字符串转换成日期
date_format()格式化日期
format()设置千分位
round(数字,0)四舍五入 字面量 0为整数 -1个数 1小数一位
rand()生成随机数
Ifnull可以将null转换成一个具体值
substr(被截取的字符串,起始下标(起始为1),截取的长度)
首字母大写
注意:null只要参与运算,就是null 可以使用Ifnull(值,0)
不修改数据库,只是显示上调
count 计数
sum 求和
avg 平均值
max 最大值
min 最小值
注意:自动忽略 null 值 默认一表一组
分组函数使用注意:
如果有group by 只能查询 分组的字段 或者分组函数
典型题:
执行顺序:from, where, group by,select,order by
联合分组:一部门 不同工作 最高
#####优化策略 分组 where .. group by 和 group by having 第一个只能使用表字段,第二个可以使用分组(多行数据)函数
执行顺序
注意:只能出现 所有字段的最前方 ,多个字段则联合去重
内连接
等值连接
非等值连接
自连接
外连接
左连接
右连接
全连接
笛卡尔现象(无条件查询多表) 避免 应该加条件,起别名
例如:
select a.no,b.tel from stu a,tea b where a.no=b.no
sql92 和 sql99的区别
sql92:
select a.no,b.tel from stu a,tea b where a.no=b.no
sql99:
select a.no,b.tel from stu a join tea b on a.no=b.no
sql99的优点:表连接是独立的,连接之后,有筛选,写where
条件不是一个等值关系
技巧:一张表看成2张表
..left (outer) join .. on..
例如:
select a.no,b.no from stu a left (outer可省略) join tea b on a.no=b.no
有主次关系 哪个方向就全部查询(null也包括)主表
demo:多外连接
连接方式: a连接b,a连接c
from a..
join
..b
on
..
left join
..c
on
99sql多连接例子:
要的数据里面 嵌套的查询
技巧:from 后面select语句当一张表
注意:select子查询后面的数据只能是1条 否则报错
拼接(减少避免 笛卡儿积)
or , in ,union
用于 或者 条件语句
union的优点: 10*10*10 1000 可以 100+100 200 减少匹配
union的注意事项:
两个结果集的 列 必须相同
语法: limit startIndex,length
startIndex是启示下标(从0开始),length是长度
注意:limit 在 order by 之后执行!
demo练习:
传入 pageNo(第几页) pageSize(每页条数)
公式 :limit(pageNo-1)*pageSize ,pageSize
not in 在使用的时候必须排除()里面的null值
快速备份复制表 create table 表民 as select * from 被复制表 (数据也会复制)
4大约束 主键约束 primary key ,唯一约束 unique,
外键约束 foreign key ,非空约束 not null
表级多个条件约束 不在列
unique(id,age);
列级约束 在列 单个约束
age int(11) unique;
not null 只有列级约束
not null和unique联合使用 直接默认是 主键
主键约束 单一主键 , 复合主键(表级约束)
外键约束 遵循三范式 确保数据有效性,完整性
mysql innerdb 引擎 事务记录日志 默认自动提交
DML语句操作
事务开启 start truncation 提交 commit 回滚 rollback
只能回滚到上一次提交的commit
原子 一致 隔离 持久
读未提交 读已提交 可重复读 串行化
索引 b-tree 左小右大
实现原理
1 数据量庞大
2 经常在where 条件后面的 字段
3 很少的DML语句
创建 create index 索引名 on 表(字段)
删除 drop index 索引名 on 表
查看是否使用索引 explain 后面跟查询语句
1 减少模糊查询 %开头
2 减少使用or 使用union or必须两边都要有索引才可以 union没有要求
3 使用复合索引 没有使用左边那个索引导致失效
index(left,right)
4 where 后面的 索引列字段参加了运算 失效
where sal+1 =8000
5 索引列使用了函数 失效
普通索引 (一个字段添加使用)
多列索引(复合索引,多个字段使用)
主键索引
唯一索引(在有unquine 约束的字段使用
越唯一越高效,唯一加索引作用不大
视图可以简化sql,利于维护 创建之后可以进行多表的crud ,创建视图必须后面跟DDL语句 视图的增删改查会影响到原表数据
创建视图 create view 视图名 as DDL语句
删除 drop view 视图名
增删改查crud 影响原表数据
视图开发的作用
1 创建用户
2 授权
3 回收权限
4 导入导出
导入 mysqldump 表>地址
导入 source 地址(sql脚本)
1 必须有主键,列不可再分
2 一范式基础之上,非主键完全依赖主键 不可部分依赖
3 二范式基础之上,非主键直接依赖主键 不可传递依赖
多对多 3张表 中间表 2外键
一对多 2张表 多的表 加外键
一对一 外键唯一!!
一对一(数据多) 拆分表 加外键加唯一约束!!! 解决 或者 拆分表 同主键策略
三范式只是理论 为了满足业务 冗余换取执行速度 会降低sql编写难度,有时候适当也是迫不得已.
评论