MySQL中的多表查询
1、连接查询
a、交叉连接:(cross join)
返回多表的记录的笛卡尔积。(第一张表:5 第二章表:7,返回5*7=35)
select * from CUSTOMER,ORDERS;
select c.ID,c.NAME,o.ORDER_NUMBER,o.price from CUSTOMER c,ORDERS o;
b、内连接(inner join)
隐式内连接:select * from CUSTOMERc,ORDERS o where c.ID=o.CUSTOMER_id;
显式内连接:
select * from CUSTOMER c inner join ORDERS o on c.Id=o.CUSTOMER_id;
c、外连接(outer join)
查看所有客户信息,同时有订单的显示订单的详细信息。
左外:返回满足连接条件的记录,同时返回左表中剩余的其他记录。
select * from CUSTOMER c left outer join ORDERS o onc.ID=o.CUSTOMER_ID;
查看所有订单信息,同时返回下单的客户信息
右外:返回满足连接条件的记录,同时返回右表中剩余的其他记录。
select * from CUSTOMER c right outer join ORDERS o onc.ID=o.CUSTOMER_ID;
2、子查询
又称之为嵌套查询。查询中有查询。
执行顺序:先执行子查询(内查询),再执行外查询。
子查询:必须放在小括号之内。
查询陈冠希的所有订单信息。
形式一:多条查询语句
select ID fromCUSTOMER where NAME='陈冠希';
select * fromORDERS where CUSTOMER_ID=1;
形式二:subselect(子查询)
select * fromORDERS where CUSTOMER_ID=(select ID from CUSTOMER where NAME='陈冠希');
查询订单价格大于100的有哪些客户
select * fromCUSTOMER where ID in (select CUSTOMER_ID from ORDERS where PRICE>100);
3、MySQL常用的函数
SUM():求和
COUNT():计数
AVG():求平均
MAX():求最大
MIN():求最小
统计一个班级共有多少学生?
select count(*)from STUDENT;
统计数学成绩大于90的学生有多少个?
select count(*)from STUDENT where MATH>=90;
统计总分大于250的人数有多少?where可以使用表达式
select count(*)from STUDENT where (ENGLISH+CHINESE+MATH)>250;
统计一个班级数学总成绩?
select sum(MATH)from STUDENT;
统计一个班级语文、英语、数学各科的总成绩
selectsum(CHINESE),sum(ENGLISH),sum(MATH) from STUDENT;
统计一个班级语文、英语、数学的成绩总和
selectsum(ENGLISH+CHINESE+MATH) from STUDENT;
统计一个班级语文成绩平均分
selectsum(CHINESE)/count(*) from STUDENT;
selectavg(CHINESE) from STUDENT; #如果字段为null,不参与平均的计算。
4、分组(报表)查询:group by
对订单表中商品归类后,显示每一类商品的总价
select PRODUCT,sum(PRICE) from PRODUCTSgroup by PRODUCT;
查询购买了几类商品,并且每类总价大于100的商品
select PRODUCT,sum(PRICE) from PRODUCTSgroup by PRODUCT having sum(PRICE)>100;