一、SQL55 分页查询
分页查询employees表,每5行一页,返回第2页的数据
SELECT *
FROM employees
LIMIT 5 OFFSET 5
limit子句用于限制查询结果返回的数量,常用于分页查询
二、SQL57 exists
(1) 使用含有关键字exists查找未分配具体部门的员工的所有信息。
SELECT *
FROM A
WHERE EXISTS
(SELECT 1
FROM B
WHERE B.id = A.id);
# EXISTS子句返回一个布尔值
# EXISTS只在乎子查询中是否有记录,与具体的结果集无关
EXISTS执行顺序:
1、首先执行一次外部查询,并缓存结果集,如 SELECT * FROM A
2、遍历外部查询结果集的每一行记录R,代入子查询中作为条件进行查询,如 SELECT 1 FROM B WHERE B.id = A.id
3、如果子查询有返回结果,则EXISTS子句返回TRUE,这一行R可作为外部查询的结果行,否则不能作为结果
https://zhuanlan.zhihu.com/p/351922940
(2) IN
IN常用于where表达式中,其作用是查询某个范围内的数据。
select *
from A
where field in (value1,value2,value3,…)
(3)什么时候用EXISTS,什么时候用IN?
在主表和从表都对关联的列建立索引的前提下:
当主表比从表大时,IN查询的效率较高;
当从表比主表大时,EXISTS查询的效率较高;
原因如下:
in是先执行子查询,得到一个结果集,将结果集代入外层谓词条件执行主查询,子查询只需要执行一次
exists是先从主查询中取得一条数据,再代入到子查询中,执行一次子查询,判断子查询是否能返回结果,主查询有多少条数据,子查询就要执行多少次
具体代码如下:
SELECT *
FROM employees e
WHERE NOT EXISTS
(
SELECT 1
FROM dept_emp d
WHERE e.emp_no=d.emp_no
)
三. SQL45 修改表名
将titles_test表名修改为titles_2017。
RENAME TABLE titles_test to titles_2017;
ALTER TABLE titles_test
RENAME TO titles_2017;
ALTER TABLE titles_test
RENAME titles_2017;
4. SQL46 添加外键
alter table 表名
add constraint 外键约束名
foreign key(列名) references 引用外键表
ALTER TABLE audit
ADD CONSTRAINT FOREIGN KEY(emp_no)
REFERENCES employees_test(id);
5.SQL32连接字符
将employees表的所有员工的last_name和first_name拼接起来作为Name,中间以一个空格区分
SELECT CONCAT(last_name,' ',first_name) as NAME
FROM employees;
(1) CONCAT(s1,s2,s3)
连接一个或者多个字符串
(2) CONCAT_WS(separator,str1,str2,…)
第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间
(3)group_concat()分组拼接函数
group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'])
select id,group_concat(name) from aa group by id;
|1 | 10,20,20|
|2 | 20 |
|3 | 200,500|