sql学习笔记
关于DISTINCT
DISTINCT可以去除重复的内容,但是,如果查询的数据是多个列,那么只有在这多个列的数据都相同的时候才可以消除。如果一个列重复,另一个列不重复,那么这一行也不会被消除。
四则运算可以作为SELECT参数
给计算结果设计别名
SELECT empno,ename,sal*12 income FROM emp;
这里打印出来的结果中sal*12那一列的列名就是income。
常量如果是字符串要使用单引号而不是双引号,如果是数字不用加引号,如果是日期,就要按照日期格式编写。
两列内容的连接使用||
select empno||ename from emp;
这里的使用方法很像java里面的“+”:
例如:
select '雇员编号:'|| empno ||',姓名:'|| ename ||',收入:'|| income from student;
BETWEEN 最小值 AND 最大值;
这里一定要注意是闭区间!!!
空判断 IS NULL和IS NOT NULL
IN和NOT IN
BETWEEN AND 给了一个大的可选范围,IN也用来规定一个范围,不过用起来更灵活。
例如:
SELECT * FROM emp WHERE empno=1 OR empno=2 OR empno=3;
这句代码使用IN来做就是:
SELECT * FROM emp WHERE empno IN (1,2,3);
指定值查找使用IN会比较方便
关于NOT IN和NULL的问题
使用NOT IN进行范围判断的时候,如果范围里面包括NULL,那么就不会有任何结果。
例如:
SELECT * FROM emp WHERE empno NOT IN(1,2,3,NULL);
之所以使用WHERE,就是要抓取有用信息,没有限制,显示所有行,对于大型数据库根本没有意义。
使用NOT IN的目的是为了查询部分数据行,但是如果有了NULL(某些数据永远不可能为NULL),就成了查询全部了。
为什么sql里面NOT IN后面的子查询如果有记录为NULL的,主查询就查不到记录???原因很简单:
SELECT * FROM dbo.TableA AS a
WHERE a.id NOT IN ( 2, NULL )
等同于:
SELECT * FROM Table_A AS a
WHERE a.id <> 2
AND a.ID <> NULL
于NULL值不能参与比较运算符,导致条件不成立,查询不出来数据。
LIKE
“_”:匹配任意以为字符;
“%”:匹配任意的零位,多位字符。
注意:
LIKE 可以应用在各种数据类型上,不一定是字符串;
LIKE 如果不设置关键字,那么表示查询全部信息,就像LIKE ‘%%’。虽然这样可以查询全部数据,但是与不使用WHERE子句相比,不使用WHERE子句的效率更高。
ORDER BY
排序方式有两种ASC(默认)和DESC。
COUNT(),MAX(),MIN(),SUM(),AVG()
count是统计个数,里面可以跟上distinct字段。
max和min也可以用于日期类型的数据。
注意:
COUNT(*),COUNT(字段),COUNT(DISTINCT 字段)的区别?
- COUNT(*):明确的返回表中的数据个数,是最准确的;
- COUNT(字段):不统计为null的数据个数,如果某一列的数据不可能为null,那么结果与COUNT(*)相同;
- COUNT(DISTINCT 字段):统计消除掉重复数据后的数据个数。
GROUP BY
SELECT job,COUNT(empno),AVG(sal)
FROM emp
GROUP BY job;
SELECT DEPTNO,COUNT(empno),MAX(SAL),MIN(SAL)
FROM EMP
GROUP BY DEPTNO;
- 没有编写group by子句的时候(全表作为一组),那么select子句之中只允许出现统计函数,不允许出现其他字段。
例如:
select count(empno),ename from emp;
这里查询结果里面第一列已经显示了empno的数目了,这肯定只有一行,所以第二列不可能列出很多行ename的数据了,因为这不符合数据库的表达形式。 - 在使用group by子句分组的时候,select子句之中只允许出现分组字段与统计函数,其他字段不允许出现。
正确代码:
select job,count(empno) from emp group by job;
错误代码:
select job,count(empno),ename from group by job;
- 统计函数允许嵌套查询,但是嵌套后的统计查询中,select子句中不允许再出现任何的字段,包括分组字段,只能够使用嵌套的统计函数。
正确代码:
SELECT deptno,AVG(sal)
FROM emp
GROUP BY deptno;
错误代码:
SELECT deptno,MAX(AVG(sal))
FROM emp
GROUP BY deptno;
这里已经有了嵌套的统计函数,就不能再有deptno了。
修改:
SELECT MAX(AVG(sal))
FROM emp
GROUP BY deptno;
多表查询
示例:
查询出每个部门的名称、人数、平均工资:
分析:
1.确定要使用的表:
(1)dept:部门名称
(2)emp:统计出人数,平均工资
2.确定已知的关联字段:
雇员与部门:emp.deptno=dept.deptno
第一步:查询每个雇员的编号,部门名称,工资
SELECT e.empno,d.dnama,e.sal
FROM emp e,dept d
WHERE e.deptno=d.deptno;
第二步:通过以上的查询可以发现dname字段上出现了重复查询,有重复数据才可以分组。另外我们的查询明确要求是根据部门名称分组,现在对查询结果分组。(上面查询出来的结果可以看作是一张临时数据表)
SELECT e.empno,d.dnama,e.sal
FROM emp e,dept d
WHERE e.deptno=d.deptno
GROUP BY d.name;
第三步:部门一共有三个,但是我们现在只出现了三个,加入外连接控制
SELECT e.empno,d.dnama,e.sal
FROM emp e,dept d
WHERE e.deptno(+)=d.deptno
GROUP BY d.name;