1.子查询: 一个查询语句中嵌套另一个查询
例如:–查询金额超过平均值的订单
select * from orders where amt>(select avg(atm) from orders)
–查询所有名字以D开头的所有用户下的订单
select * from orders where cust_id in (select distinct(cust_id) from customer
where cust_name like ‘D%’);
- 联合查询
1)什么是联合查询:也叫连接查询,将多个表中的
数据进行连接,得到一个查询结果集
2)什么情况下使用联合查询:当从一个表无法查询
到所有想要的数据时,使用联合查询
前提:联合的表之间一定要有逻辑上的关联性
SELECT a.order_id, a.amt,
b.cust_name, b.tel_no
FROM orders a, customer b
WHERE a.cust_id = b.cust_id;
3)笛卡尔积(联合查询的理论依据)
- 什么是笛卡尔积:两个集合的乘积,产生一个
新的集合。表示两个集合所有的可能的组合情况 - 笛卡尔积和关系:笛卡尔积中,去掉没有意义
或不存在的组合,就是关系(规范的二维表)
4)连接查询
- 内连接(INNER Join):没有关联到的数据不显示
示例:查询订单编号、金额、客户名称、客户电话
– 方式一:where进行条件关联
SELECT a.order_id, a.amt,
b.cust_name, b.tel_no
FROM orders a, customer b
WHERE a.cust_id = b.cust_id;
– 方式二:利用Inner join关键字
SELECT a.order_id, a.amt,
b.cust_name, b.tel_no
FROM orders a INNER JOIN customer b
ON a.cust_id = b.cust_id;
- 外连接(OUTER Join):没有关联到的数据也要
显示到结果集
左连接:以左边为基准,右表的数据进行关联
左表数据全部显示,右表中的字段
如果没有关联到,则显示NULL
LEFT JOIN 实现
SELECT a.order_id, a.amt,
b.cust_name, b.tel_no
FROM orders a LEFT JOIN customer b
ON a.cust_id = b.cust_id;
右连接:以右边为基准,左表的数据进行关联
右表数据全部显示,左表中的字段
如果没有关联到,则显示NULL
right JOIN 实现
SELECT a.order_id, a.amt,
b.cust_name, b.tel_no
FROM orders a right JOIN customer b
ON a.cust_id = b.cust_id
注意:内连接的特点是没有关联到的数据不显示
外连接分为左连接和右连接,左连接指以左表作为基准,右表进行关联,
左表数据全部显示,右表中的字段如果没有关联到则显示为NULL;
右连接指以右表作为基准,左表进行关联,右表数据全部显示,左表中的字段如 果没有关 联到则显示为NULL