左外连接(LEFT JOIN...ON | LEFT OUTER JOIN)
会显示左表的所有行的信息,不管右表中是否有匹配的项,由表中没有匹配的话则显示null。假如连接条件是:left.name = right.name,且左表中有7个name='Tom',右表中有3个name='Tom',则查询结果会有21条记录。
假设有一个user表,字段分别为:user_name, salary, sex, age。(纯属举例,不讨论表的设计)
内连接
我们平时使用的连接就是内连接(隐式) ,如:select a.name from a,b where a.name = b.name;
如果是显式的内连接,使用inner join...on, 如:select a.name inner join b on a.name = b.name;
需要统计的基本上都需要分组
例如:统计男、女的个数分别是多少,就根据性别分组:select count(*),sex from user group by sex;
有分组的情况下才有having子句,having中可以写聚合函数(where中不行)
例如:统计小于24岁的男或者女个数是多少: select count(*),sex from user group by sex having avg(age) < 24;
嵌套查询的核心是寻找中间表
中间表,即最先被查询出来的数据,然后把这些数据当做一个表来处理。
例1:查询所以比女性平均工资高的男性的名字。
select user_name from user where salary > (select avg(salary) from user where sex = 'female') and sex = 'male'
中间表只有一条数据,就是女性的平均工资。
例2:查询工资比所有人的平均工资低且比Lili高的人的姓名和性别。
一般是这样写:
select * from user where salary < (select avg(salary) from user) and salary > (select salary from user where user_name='Lili')
如果有中间表的概念,你会想到:工资比所有人的平均工资低的,是一个集合,可以先查出来作为中间表,如下:
select u.* from user u,(select id from user where salary < (select avg(salary) from user)) lower_avg
where u.id = lower_avg.id and u.salary>(select salary from user where user_name='Lili')
MySQL和Oracle的分页查询
MySQL用的是limit,Oracle用的是ROWNUM。
Oracle:
SELECT * FROM (SELECT query_table_alias.*, ROWNUM RN FROM (SELECT * FROM targer_table) query_table_alias WHERE ROWNUM < 40) WHERE RN > 20
MySQL:
select * from table_name where id > (pageNo - 1)*pageSize limit pageSize;
或者 select * from table_name limit pageNo - 1)*pageSize, pageSize;(数据量小的时候用)
以上只是个人的笔记,仅供参考!