
MySQL 相关
desc 表名
describe– 描述
descend– 下降
descibe 是查看表的结构,例:
1 describe tablename;desc 是 describe 的简写,例:
1 desc tablename;
另外 desc 在排序中的意义是降续排列(和 describe 的简写不是同一个),例:
1 | select * from table order by id desc ; |
关于 where
1 update stu set score=22 [where id=1]如果不加 where 那么修改的是全局的
1 delete from stu [where id =1]如果不加 where 那么删除的是全部的 所以要注意
select 中的 distinct
–distinct adj. 清晰的;清楚的;明白的;明显的;截然不同的;有区别的;不同种类的;确定无疑的;确实的;确切的;
1 | select distinct gender from emp |
Null 和仍和数据运算结果都是 null, 以及有关 null 的运算
1 | SELECT NAME |
问题: 其中有一条数据 A 的 bonus 为 null, 但是他的 sal >3500 了已经。
我们要求能把 null=0 最好,而且查出来。方法 1: 将所有的奖金为 null 的列更新为 0
1
2update emp set bonus =0 where bonus is null;
update emp set bonus =0 where bonus is not null;
SELECT * from emp WHERE dept is not null
SELECT * from emp WHERE not (dept is null)
1
方法 2: 在查询时将 null 值 看做 0 来处理(这种方式不会对表中的数据产生仍和影响)
ifnull(列名,值) 函数:判断指定的列是否包含 null, 若果有 null 就用第二个值 替换。
ifnull(bonus,0)
1
2
3
4
5
6
7 SELECT NAME
,
IFNULL(bonus,0) + sal
FROM
emp
WHERE
IFNULL(bonus,0) + sal > 3500
取别名的问题
模糊查询 LIKE
like 操作符 用在 WHERE 子句中搜索列中的指定模式。
可以和 % _ 使用。
其中 % 代表0 个或者多个任意字符,_代表一个任意字符。
多行函数查询
– 多行函数也叫聚合函数,也叫聚集函数
多行函数会默认过滤 null 值 , 即不统计 null 值
count(列名 | *): | 是或的意思
count(列名): 表示统计当前列有多少个值
count(*): 以行为单位,统计查询结果中有多少行记录
max(列名):
min(列名):
sum(列名): 统计这一列中所有值的和 (会过滤 null 值) 参考上面的
avg(列名): 会过滤 null 值(所有值的和 / 不是 null 值的个数)
- 在统计时,不要加格外的列,因为没有任何意义
1 | SELECT |
1 | SELECT |
1 | SELECT |
- avg 是剔除了为 null 的 count 的那条记录的平均值,那一行不算在内
分组查询
group by
select count(*) from emp;
– 如果没有分组,
升序和降序
DESC 是 descend 降序意思
ASC 是 ascend 升序的意思 默认是 ASC
分页查询
limit
删除的区别
delete,drop,truncate 都有删除表的作用,区别在于:
- delete 和 truncate 仅仅删除表数据,所以会保存字段名,drop 连表数据和表结构一起删除,打个比方,delete 是单杀,truncate 是团灭,drop 是把电脑摔了。
- delete 是 DML 语句,操作完以后如果没有不想提交事务还可以回滚,truncate 和 drop 是 DDL 语句,操作完马上生效,不能回滚,打个比方,delete 是发微信说分手,后悔还可以撤回,truncate 和 drop 是直接扇耳光说滚,不能反悔。
- 执行的速度上,drop>truncate>delete,打个比方,drop 是神舟火箭,truncate 是和谐号动车,delete 是自行车。
varchar 和 char
区别一,定长和变长
char 表示定长,长度固定,varch ar 表示变长,即长度可变。char 如果插入的长度小于定义长度时,则用空格填充;varchar 小于定义长度时,还是按实际长度存储,插入多长就存多长。
因为其长度固定,char 的存取速度还是要比 varchar 要快得多,方便程序的存储与查找;但是 char 也为此付出的是空间的代价,因为其长度固定,所以会占据多余的空间,可谓是以空间换取时间效率。varchar 则刚好相反,以时间换空间。
区别之二,存储的容量不同
对 char 来说,最多能存放的字符个数 255,和 编码无关。
而 varchar 呢,最多能存放 65532 个字符。varchar 的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是 65,532 字节。
区别之三,空格
char 在存储的时候会将右侧空格进行剔除,保留左侧空格。
varchar 在存储的时候保留所有空格,不进行任何删除
varchar 和 char 在查询的时候都只会根据 where 条件中的左侧空格进行判断,右侧末尾的空格会忽略
自增
auto_increment
可以用 show create table emp
设置完主键自增后,表中会维护一个 AUTO_INCREMENT 的值,这个值从1开始。如果插入的那一列没有给主键赋值。那就是从 AUTO_INCREMENT 获取值。用完后自加 1.
所以查看具体的最下面有一个 auto_increment= 多少;
注意:
auto_increment 会安照 最大 的去自增。
主键约束
唯一,非空。一般和 auto_increment 一起用
非空约束
非空,但是可以重复
唯一约束 –unique
不能重复,可以为 null
连接查询
1 | SELECT * from emp,dept |
以上有笛卡尔积。
消除笛卡尔积 用inner join 内连接. 把逗号,改成 inner join where 改成 on
1 | SELECT * from emp INNER JOIN dept on emp.dept_id=dept.id |
以上两种都可以。但是 null 值不会显示出来
可以用左外连接和右外连接:
左外连接。查询左边的所以值
右外连接:查询右边所有的值
显示所有部门对应的员工值
1 | SELECT * from dept left JOIN emp on emp.dept_id=dept.id |
显示所有员工对应的部门值
1 | SELECT * from dept right JOIN emp on emp.dept_id=dept.id |
这样不能查询所以的对应的 null 值
而且 mysql 没有全外连接查询。
可以通过 union 模拟这种查询
where 比 having 先执行
having 和 where 区别:
- where 放在 from 之后,group by 之前
- where 不能使用多行函数(聚集函数), 列别名也不能用在 where 中
- where 是在分组之前之前。先过滤一些记录,再基于剩余的记录进行返祖。
- 要先分组再过滤,基于剩下的记录进行分组,就用 having
where 和 having 的区别:
where 和 having 都是对于表记录中的记录进行过滤筛选
where 用于在分组之前对记录进行过滤筛选,而 having 是对分组之后的记录进行过滤筛选
where 子句中不能使用多行函数(聚集函数), 和列别名。但是可以用表别名
select name as 姓名,sal as 薪资 from emp e;
– 其中上面的’姓名’,’薪资’都是列别名,而 e 是表别名
having 子句中可以使用多行函数(聚集函数), 列别名,表别名
插入数据时,数值类型的数据可以用单引号括起来这样也会识别成数值,一般来说。没人这么闲。不过导出的 sql 一般会自带 ‘
Mybatis
写 sql 片段时 小于号会被识别为 xml 的标签,大于不会,因为大于没开始的标志
大于:>
可以用
1 > // 记得加分号 great than
小于:<
必须用
1 < // 记得加分号 less than
好像有一个万能的转义字符
1 | <![CDATA『这里输入你要展示的仍何内容』]> |
Mybatis
写 sql 片段时 小于号会被识别为 xml 的标签,大于不会,因为大于没开始的标志
大于:>
可以用
1 > // 记得加分号 great than
小于:<
必须用
1 < // 记得加分号 less than
好像有一个万能的转义字符
1 | <![CDATA『这里输入你要展示的仍何内容』]> |