提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录- 1 条件查询
- distinct
- where
- like
- null
- between and
- limit
- order by
- 2 统计案例
- 入职统计
- 2019年以前入职的老员工
- 2019年以后签约的员工,日期进行格式转换后方便比较
- 2015年到2019年入职的员工
- 年薪统计
- 3 聚合函数 aggregation
- 3.1 count
- 3.2 max / min
- 3.3 sum / avg
- 4 分组 group
- 4.1 group by
- 4.2 having
- 5 总结
- char和varchar有什么区别?
- datetime和timestamp有什么区别?
- 中文乱码
- 注释
- 主键、外键、唯一索引的区别?
- drop、delete和truncate之间的区别?
1 条件查询 distinct
使用distinct关键字,去除重复的记录行
SELECT loc FROM dept; #查询dept表中loc列的数据 SELECt DISTINCT loc FROM dept; #查询dept表中去除相同内容的loc列的数据where
注意:where中不能使用列别名!!
select * from emp select * from emp where 1=1 --类似没条件,所有的数据都符合此条件,输出所有数据 select * from emp where 1=0 --条件不成立,所有的数据都不符合此条件,所有数据都不输出 select * from emp where empno=100 --唯一条件,查询emp表中,部门编号等于100的数据 select * from emp where empno>100 --查询emp表中,部门编号大于100的数据 select * from emp where ename='tony' and deptno=2 --相当于两个条件的&关系 select * from emp where ename='tony' or deptno=1 --相当于两个条件的|关系 select name, sal from emp where sal=1400 or sal=1600 or sal=1800; -- 或 select name, sal from emp where sal in(1400,1600,1800); --查查询emp表中,sal等于1400,1600,1800的数据,并输出符合条件的 name, sal select name, sal from emp where sal not in(1400,1600,1800);--查查询emp表中,sal不等于1400,1600,1800的数据,并输出符合条件的 name, sallike
通配符%代表0到n个字符,通配符下划线_代表1个字符
select * from emp where ename like 'l%' --模糊查询,以l开头的 select * from emp where ename like '%a' --模糊查询,以a结束的 select * from emp where ename like '%a%' --模糊查询,中间包含a的 select * from emp where ename like 'l__' --模糊查询,l后面有两个字符的, _代表一个字符位置null
查询没有奖金的员工信息
SELECt * FROM emp WHERe comm IS NULL;--注意此处不能用=,要用is
查询有奖金的员工信息
SELECt * FROM emp WHERe comm IS NOT NULL;between and
SELECt * FROM emp select * from emp where sal>5000 and sal>10000 --查询工资大于5000且小于10000的员工信息 SELECt * FROM emp WHERe sal<5000 OR sal>10000;--查询工资大于5000或小于10000的员工信息 select * from emp where sal<=3000 and sal>=10000--查询工资大于等于3000且小于等于10000的员工信息 SELECt * FROM emp WHERe sal<=3000 OR sal>=10000;--查询工资大于等于3000或小于等于10000的员工信息 select * from emp where sal between 5000 and 10000--查询工资大于等于5000,小于等于10000的员工信息limit
分数最高的记录:按分数排序后,limit n,返回前n条。Oracle做的很笨,实现繁琐,后期有介绍,而mysql做的很棒,语法简洁高效。在mysql中,通过limit进行分页查询:
select * from emp limit 2 --列出前两条 select * from emp limit 1,2 --从第二条开始,展示2条记录 select * from emp limit 0,3 --从第一条开始,展示3条记录--前三条order by
SELECt * FROM emp order by sal #默认升序 SELECt * FROM emp order by sal desc #降序 SELECt * FROM emp ORDER BY ename DESC #按照字母降序 SELECt * FROM emp ORDER BY hiredate DESC #按照时间的数字降序 SELECt * FROM emp ORDER BY ename DESC; #汉字排序时,会根据utf-8中汉字的编码数字进行排序,需要注意2 统计案例 入职统计 2019年以前入职的老员工
SELECt * FROM emp WHERe hiredate<"2019-1-1"; SELECt * FROM emp WHERe YEAR hiredate<"2019-1-1"; SELECt * FROM emp WHERe DATE_FORMAT(hiredate,'%Y-%m-%d')<'2019-01-01'; SELECt * FROM emp WHERe YEAR(hiredate)<20192019年以后签约的员工,日期进行格式转换后方便比较
SELECt * FROM emp WHERe YEAR(DATE_FORMAT(hiredate,'%Y-%m-%d'))>=2019;2015年到2019年入职的员工
SELECt * FROM emp WHERe STR_TO_DATE(hiredate,'%Y-%m-%d')<='2015-01-01' AND STR_TO_DATE(hiredate,'%Y-%m-%d')<='2019-12-31'年薪统计
公司福利不错13薪,年底双薪,统计员工的年薪=sal13+comm13
SELECt empno,ename,job,sal*13+comm*13 FROM emp; SELECt ename, sal , comm, sal+ifnull(comm,0) from emp;--用0替换掉null SELECt empno,ename,job,sal*13+comm*13 as 年薪 FROM emp;--用as给列起个别名 SELECt empno,ename,job,sal*13+comm*13 年薪 FROM emp; --as也可以省略 SELECt empno,ename,job,sal*13+IFNULL(comm,0)*13 AS 年薪 FROM emp;--计算总的年薪,遇到null值将其定义为0,创建别名年薪输出数据3 聚合函数 aggregation
概述:把一列的所有值聚合起来,然后做数据分析
常见的聚合函数:count() max() min() avg() sum()
select count(sal) from emp; --统计个数,统计个数,基础写法 select count(*) from emp; --效果一样,统计个数,是固定写法,相对低效一些 select count(1) from emp; --效果一样,统计个数,是固定写法,比*要高效 select count(comm) from emp --注意,count统计只统计非null字段3.2 max / min
select max(sal) from emp --求字段的最大值 select max(sal) ,max(comm) from emp;--求最大值 select max(sal) sal,max(comm) comm from emp;--求最大值,了解此俩种写法的区别 select min(sal) min from emp --获取最小值 select min(sal) min,max(sal) max from emp --最小值最大值 SELECt ename,MAX(sal) FROM emp group by ename --分组3.3 sum / avg
select count(*) from emp --总记录数 select sum(sal) from emp --求和 select avg(sal) from emp --平均数4 分组 group
用于对查询的结果进行分组统计
group by表示分组, having 子句类似where过滤返回的结果
4.1 group by每个部门每个岗位的最高薪资和平均薪资,结果中的非聚合列必须出现在分组中,否则业务意义不对,有些sql不会报错,但输出数据是有问题的
什么时候分组? – 查询时出现了混合列
按照什么分组? --按照非聚合列分组
SELECt deptno,MAX(sal),AVG(sal) FROM emp GROUP BY deptno; #按照deptno分组,输出聚合列sal和非聚合列deptno; SELECt job,MAX(sal),AVG(sal) FROM emp GROUP BY job; #按照job分组,输出聚合列sal和非聚合列job; SELECt deptno,job,MAX(sal),AVG(sal) FROM emp GROUP BY deptno,job; #deptno和job都满足的,输出聚合列sal和非聚合列sal; SELECt COUNT(1)FROM emp GROUP BY deptno; --统计每个部门的员工人数 SELECt YEAR(hiredate),COUNT(1) FROM emp GROUP BY YEAR(hiredate); --统计每年入职的人数 SELECt deptno,MAX(sal) FROM emp GROUP BY deptno; --统计每个部门的最高薪水4.2 having
平均工资小于8000的部门 select deptno, AVG(sal) from emp group by deptno #按部门费聚合列分组 having AVG(sal)<8000 #查询条件,类似where,但是group by后的过滤只能配合having
统计每年入职的人数,只要人数>1的记录
SELECt COUNT(1) b ,YEAR(hiredate) a FROM emp GROUP BY a HAVINg b>1;5 总结 char和varchar有什么区别?
char为定长字符串,char(n),n最大为255
varchar为不定长字符串,varchar(n),n最大长度为65535
char(10)和varchar(10)存储abc,那它们有什么差别呢?
char保存10个字符,abc三个,其它会用空格补齐;而varchar只用abc三个位置。
datetime和timestamp有什么区别?数据库字段提供对日期类型的支持,是所有数据类型中最麻烦的一个,慢慢使用就会体会出来。
date 是 年与日
time是 时分秒
datetime年月日时分秒,存储和显示是一样的
timestamp时间戳,存储的不是个日期,而是从1970年1月1日到指定日期的毫秒数
中文乱码如果在dos命令下执行insert插入中文数据,数据又乱码,那现在sqlYog客户端执行下面命令:
set names gbk;
设置客户端字符集和服务器端相同。如果不知道它到底用的什么编码?怎么办呢?很简单,两个都尝试下,哪个最后操作完成,查询数据库不乱码,就用哪个。
那为何会造成乱码呢?
Mysql数据库默认字符集是lantin1,也就是以后网页中遇到的ISO8859-1,它是英文字符集,不支持存放中文。我们创建库时,可以指定字符集:
create database yhdb charset utf8;
但这样很容易造成服务器和客户端编码集不同,如服务器端utf8,客户端ISO8859-1。mysql和客户端工具都有习惯的默认编码设置,好几个地方,要都统一才可以保证不乱码。
我们只要保证创建数据库时用utf8,使用可视化工具一般就基本正确。
注释#行注释内容
– 行注释内容,较常使用
主键、外键、唯一索引的区别?- Primary Key 主键约束,自动创建唯一索引
- Foreign Key 外键约束,外键字段的内容是引用另一表的字段内容,不能瞎写
- Unique Index 唯一索引,唯一值但不是主键
drop删除库或者表,数据和结构定义
delete和truncate只是删除表的数据
delete可以指定where条件,删除满足条件的记录,tuncate删除所有记录
对于自增字段的表,delete不会自增值清零,而truncate是把表记录和定义都删除了,然后重建表的定义,所以自增主键会重头开始计数



