MySQL 总结 (一)
磊磊

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
2
3
4
5
6
7
SELECT NAME
,
sal + bonus
FROM
emp
WHERE
sal + bonus > 3500
  • 问题: 其中有一条数据 A 的 bonus 为 null, 但是他的 sal >3500 了已经。
    我们要求能把 null=0 最好,而且查出来。

    方法 1: 将所有的奖金为 null 的列更新为 0

    1
    2
    update 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
2
3
4
5
6
7
8
SELECT
COUNT( * ),
`name`
FROM
EMP
WHERE
EMP.sal > 3000
-- 如果没有分组 在进行统计时,不要添加格外的列,因为没有任何意义(这里的 name 只会将第一行的 name 显示出来)
1
2
3
4
5
6
7
8
9
SELECT
max( sal ),
`name`
FROM
EMP
WHERE
EMP.sal > 3000
-- 所以这里的 name 不能认为是最高薪资的那一个人,
-- 如果没有分组,那么最高薪资和姓名没有任何关系,薪资是所有薪资的最大值,但是 name 就是结果中的第一行的 name
1
2
3
4
5
SELECT
sum( bonus )
FROM
emp
-- 如果 bonus 是里面有 null 的话会过滤掉。前面说了的。不会参与统计
  • 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
2
SELECT  * from emp INNER JOIN dept on emp.dept_id=dept.id
SELECT * from dept INNER JOIN emp on emp.dept_id=dept.id

以上两种都可以。但是 null 值不会显示出来

可以用左外连接和右外连接:

左外连接。查询左边的所以值

右外连接:查询右边所有的值

显示所有部门对应的员工值

1
2
SELECT  * from dept left JOIN emp on emp.dept_id=dept.id
SELECT * from emp right JOIN dept on emp.dept_id=dept.id

显示所有员工对应的部门值

1
2
SELECT  * from dept right JOIN emp on emp.dept_id=dept.id
SELECT * from emp LEFT JOIN dept 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
&lt; // 记得加分号 less than

好像有一个万能的转义字符


1
<![CDATA『这里输入你要展示的仍何内容』]>

Mybatis


写 sql 片段时 小于号会被识别为 xml 的标签,大于不会,因为大于没开始的标志


大于:>

可以用

1
&gt; // 记得加分号 great than

小于:<

必须用

1
&lt; // 记得加分号 less than

好像有一个万能的转义字符


1
<![CDATA『这里输入你要展示的仍何内容』]>
由 Hexo 驱动 & 主题 Keep
访客数 访问量