一、多表查询
1.连接查询:
连接查询是将两个或两个以上的表按照某个条件连接起来,从中选取需要的数据;
t_book表: t_bookType表:
如:
SELECT * from t_book,t_booktype;
返回结果将两个表的所有组合结果返回
1、内连接查询:
内连接查询是一种最常用的连接查询。内连接查询可以查询两个或者两个以上的表;
SELECT * from t_book b,t_booktype t where t.id=b.id;
或
SELECT * from t_book,t_booktype where t_book.id=t_booktype.id;
查询结果:
也可这么写来查询需要的字段:
select bookName,author,bookTypeName from t_book,t_booktype where t_book.id=t_booktype.id;
注意:如果查询的字段(如id)中两个表都有时这种写法会出错(或报ambiguous错误),因为无法得知id是哪个表的字段,所以平时多表查询时要写别名
修改为:
select tb.bookName,tb.author,tby.id from t_book tb,t_booktype tby where tb.id=tby.id;
2、外连接查询
外连接可以查出某一张表的所有信息;
SELECT 属性名列表
FROM 表名 1
LEFT|RIGHT JOIN 表名 2
ON 表名 1.属性名 1=表名 2.属性名 2;
可以查询出“表名 1”的所有记录,而“表名 2”中,只能查询出匹配的记录;如:
select * from t_book tb left JOIN t_booktype tby on tb.bookTypeId=tby.id;
查询结果:
右连接查询:
可以查询出“表名 2”的所有记录,而“表名 1”中,只能查询出匹配的记录;如:
select * from t_book tb right JOIN t_booktype tby on tb.bookTypeId=tby.id;
查询结果:
即where后面有多个条件and连接查询
2.子查询
1 、带 In 关键字的子查询
一个查询语句的条件可能落在另一个 SELECT 语句的查询结果中。
2 、带比较运算符的子查询
子查询可以使用比较运算符。
3 、带 (not)Exists 关键字的子查询
假如子查询查询到记录,则进行外层查询,否则,不执行外层查询;not exists表示内层没有内容时才查询外层
如:
SELECT * from t_book where EXISTS(select * from t_booktype);
表示t_booktype中返回的有内容时才执行外层t_book的查询
4 、带 Any 关键字的子查询
ANY 关键字表示满足其中任一条件;如:
SELECT * FROM t_book WHERE price>= ANY (SELECT price FROM t_pricelevel);
表示筛选价格大于任意t_pricelevel表中选出的价格的结果,即比最小的大的价格就满足条件
5 、带 All 关键字的子查询
ALL 关键字表示满足所有条件;如:
SELECT * FROM t_book WHERE price>= ALL (SELECT price FROM t_pricelevel);
表示筛选价格大于所有t_pricelevel表中选出的价格的结果,即比最大的价格大的才满足条件
3.合并查询
UNION
使用 UNION 关键字是,数据库系统会将所有的查询结果合并到一起,然后去除掉相同的记录;
UNION ALL
使用 UNION ALL,不会去除掉系统的记录;