3.19 SQL语句
-
where后面只能跟列
语法:
select 列名称 from 表名称 where 列 运算符 值;
SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号
这是正确的: SELECT * FROM Persons WHERE Year>1965 这是错误的: SELECT * FROM Persons WHERE Year>'1965'
2.and 和 or 只能在where 的子句中出现,可以把多个条件结合起来
3.in 的作用是允许我们在 where 子句中规定多个值(当条件值不知一个是就需要用到 in )
4.group by的几个疑点
举例 A表:
id | num |
---|---|
a | 1 |
b | 2 |
c | 3 |
a | 4 |
b | 3 |
疑点1: group by 和 distinct 的区别
答案: distinct会导致全盘扫描,读取所有记录 而group by只需要读取分组的数量的记录,一般来说 group by 的效率 要比 distinct高 。
疑点2:select id ,num from A group by id, num和不加group by为什么结果是一样的
答案:因为 group by 将 id 和 num 分到了一组,除非 id 和 num 的组合完全是一样的才算是一组,从数据显而易见, 没有一组是一样的。
疑点3:select id , num from A group by id;为什么会报错
答案:因为原本和 一个 id 匹配的 num 有多个(比如 a 就有 1 和 4 两个 num),因为 num 没有使用聚合函数,所以 现在 group by 后的 id 没有重复的 无法匹配多个 num 。
今天主要学的是 99 语法 和 92 语法的区别,笔记主要写99语法的
-
笛卡尔积 cross join
99:select 数据 from 数据源1 cross join 数据源2;
92:select 数据 from 数据源1,数据源2;
-
自然连接 natural join 会自动做同名字段/主外键关系字段的等值连接
99:select * from emp e natural join dept d;
92: select * from emp e , dept d where e.deptno = d.deptno;
注意:1.在99语法中的自然连接中相同的字段在结果中会自动只显示一次,92语法中需要加上字段的表来源
2.在自然连接中 同名字段不能写限定词
-
指定同名字段的等值连接 join … using(同名字段)
select * from emp e join dept d using(deptno);
和 自然连接 一样 join…using 帮你自动做等值连接,省略了连接条件的编写
-
指定连接条件的等值连接或非等值连接 join … on
select * from emp e join salgrade s on e.sal between s.losal and s.hisal;
这种方法 功能 最强大
-
多表连接举例
select *
from emp e
join dept d
on e.deptno = d.depno
join salgrade s
on s.sal between s.losal and s.hisal
where e.deptno = 30;
-
以上 natural join ,join using , join on 都是属于内连接 inner join 其中inner被省略了
-
若有一些数据不满足连接条件,但是也想显示,可以使用外连接
外连接将表分为主表和副表,主表中的数据就算不满足连接条件也会全部显示
92语法:在主表对面的表后加上(+)
99语法:左连接为left join 右连接为 right join ,在from 的后面,主表在左边就叫左连接,在右边就叫右连接
举例:select * from epm e1 left join emp e2 on e1.mgr = e2.empno;
其中e1为主表
-
全连接 full join
full join 只存在于99语法中,full join 中 两边都是主表
select * from emp e1 full join emp e2 on e1.mgr = e2.empno;