1、排序
SELECT * FROM t_test WHERE 筛选条件 ORDER BY 排序字段 排序方式;
SELECT 字段1,字段2 as 别名 FROM t_test WHERE 筛选条件 ORDER BY 别名;
。需要注意的是,别名只能在ORDER BY
中使用,在WHERE
条件中使用会报错
ORDER BY
进行排序WHERE
声明在FROM
之后,ORDER BY
之前SELECT * FROM t_test WHERE 筛选条件 ORDER BY 字段A ASC,字段B DESC;
2、分页
SELECT 字段1,字段2 FROM t_test WHERE 筛选条件 LIMIT 偏移量,条目数;
LIMIT 0,n
等价于LIMIT n
,所以直接写LIMIT n
也是可以的SELECT 字段1,字段2 FROM t_test WHERE 筛选条件 LIMIT (PageNum - 1) * PageSize,PageSize;
WHERE 筛选条件 ORDER BY 排序字段 LIMIT 偏移量,条目数;
LIMIT 条目数 OFFSET 偏移量
LIMIT
只在MySQL等部分数据库中生效,SQL Server、DB2和Oracle中不生效1、对数据进行分表并使用多表查询的原因
2、笛卡尔积错误
现象
假设将公司的人员信息和部门信息拆成2各表,分别是t_employee和t_dept
人员和部门通过dept_id进行关联,人员表有m条数据,部门表有n条数据
当我们查询人员名称和部门名称时
假设执行的SQL为SELECT employee_name,dept_name FROM t_employee,t_dept;
那么最后查询出来的数据一共有m*n条,这显然是不对的
这种现象就称为笛卡尔积错误
SQL92中笛卡尔积也叫交叉连接
,英文名为CROSS JOIN
出现笛卡尔积错误的原因:缺少了多表的连接条件
3、多表查询的正确方式:在WHERE后加入连接条件
使用连接条件后,上方的查询SQL就可以改为
SELECT employee_name,dept_name
FROM t_employee,t_dept
WHERE t_employee.dept_id = t_dept.dept_id;
4、如果查询语句中出现了多张表中都存在的字段,必须指明从哪张表中查询该字段
从SQL优化的角度来说,在执行多表查询时,建议每一个字段都声明从哪张表中查出
例如,我们在这里多查一个部门id
SELECT t_employee.employee_name,t_dept.dept_name,t_dept.dept_id
FROM t_employee,t_dept
WHERE t_employee.dept_id = t_dept.dept_id;
5、表的别名
可以在SELECT和WHERE中使用表的别名
一旦在SELECT或WHERE中使用表的别名,那字段前面就不能再使用原表名,必须都使用别名
SELECT emp.employee_name,dept.dept_name,dept.dept_id
FROM t_employee emp,t_dept dept
WHERE emp.dept_id = dept.dept_id;
6、如果有n个表实现多表查询,则需要至少n-1
个连接条件
假设新增一个位置表t_location,它和部门表通过location_id
进行关联
那么如果要多查一个部门所在的城市名称,上面的SQL就可以改为
SELECT emp.employee_name,dept.dept_name,dept.dept_id,location.location_id,location.location_name
FROM t_employee emp,t_dept dept,t_location location
WHERE emp.dept_id = dept.dept_id
AND dept.location_id = location.location_id;
7、多表查询的分类
SELECT emp.employee_id,emp.employee_name,mgr.employee_id,mgr.employee_name
FROM t_employee emp,t_employee mgr
WHERE emp.manager_id = mgr.employee_id;
8、SQL99语法实现内连接与外连接
INNER JOIN...ON
SELECT e.last_name,d.depart_name
FROM t_employee e INNER JOIN t_department d
ON e.department_id = d.department_id;
这里的INNER
可以省略,如果是三张以上的表,那就继续拼接JOIN...ON
SELECT e.last_name,d.depart_name,c.city_name
FROM t_employee e JOIN t_department d
ON e.department_id = d.department_id
JOIN t_city c
ON d.location_id = c.location_id;
左外连接实现如下
SELECT e.last_name,d.depart_name
FROM t_employee e LEFT OUTER JOIN t_department d
ON e.department_id = d.department_id;
左外连接实现如下,左外连接和右外连接中的OUTER
可以省略
SELECT e.last_name,d.depart_name
FROM t_employee e RIGHT OUTER JOIN t_department d
ON e.department_id = d.department_id;
满外连接实现如下,注意MySQL不支持FULL OUTER JOIN
SELECT e.last_name,d.depart_name
FROM t_employee e FULL OUTER JOIN t_department d
ON e.department_id = d.department_id;
9、UNION的使用
利用UNION
关键字,可以将多个SELECT语句的结果集组合成单个结果集
这些SELECT语句所查询的列数和数据类型必须相同,并且相互对应
SELECT column... FROM tableA
UNION [ALL]
SELECT column... FROM tableB;
10、七种SQL JOIN的实现
之前说的MySQL不支持FULL OUTER JOIN
,满外连接就可以通过使用UNION ALL
关键字
将左上与中右进行组合得到,或者将右上和中左组合得到
11、自然连接和Using连接
上面的等值连接SQL
SELECT e.last_name,d.depart_name
FROM t_employee e INNER JOIN t_department d
ON e.department_id = d.department_id;
可以替换成
SELECT e.last_name,d.depart_name
FROM t_employee e NATURAL JOIN t_department d;
自然连接NATURAL JOIN
是一定会自动查询两张表中所有相同的字段,但很多时候我们仅需要一个相同字段作为连接条件即可,使用起来不够灵活
同名字段
进行等值连接,只能配合 JOIN 一起使用上面的等值连接SQL
SELECT e.last_name,d.depart_name
FROM t_employee e,t_department d
WHERE e.department_id = d.department_id;
可以替换成
SELECT e.last_name,d.depart_name
FROM t_employee e JOIN t_department d
Using (department_id);
如有错误,欢迎指正!!!