目录
一、表连接查询
MYSQL数据库中的三种连接:
- inner join(内连接):只返回两个表中联结字段相等的行(有交集的值)
- left join(左连接):返回包括左表中的所有记录和右表中联结字段相等的记录
- right join(右连接):返回包括右表中的所有记录和左表中联结字段相等的记录
注:oracle数据库支持 outer join(外连接),mysql不支持。
1.1 left join(左连接)
left join(左连接):返回包括左表中的所有记录和右表中联结字段相等的记录。
select * from location A LEFT JOIN store_info B on A.store_name=B.store_name; #左连接
1.2 right join(右连接)
right join(右连接):返回包括右表中的所有记录和左表中联结字段相等的记录。
select * from location A RIGHT JOIN store_info B on A.store_name=B.store_name; #右连接
1.3 inner join(内连接)
inner join(内连接):只返回两个表中联结字段相等的行。
方法一:
select * from location A inner join store_info B on A.store_name=B.store_name;
方法二:
select * from location A, store_info B where A.store_name=B.store_name;
方法三:
select * from location A inner join store_info B using(store_name); #using()是函数,必须保证括号内的字段在两个表中是同名的
示例:
设置location表的别名为A、store_info表的别名为B,查询A表和B表中store_name字段值相等的行,之后对region字段进行分组汇总,并计算组内销售额之和。
select A.region region,sum(B.sales) sales from location A,store_info B where A.store_name=B.store_name group by region;
二、视图
视图:可以被当作是虚拟表或存储查询。
- 视图跟表格的不同是,表格中有实际储存数据记录,而视图是建立在表格之上的一个架构,它本身并不实际储存数据记录。
- 临时表在用户退出或同数据库的连接断开后就自动消失了,而视图不会消失。
- 视图不含有数据,只存储它的定义,它的用途一般可以简化复杂的查询。 比如你要对几个表进行连接查询,而且还要进行统计排序等操作,写SQL语句会很麻烦的,用视图将几个表联结起来,然后对这个视图进行查询操作,就和对一个表查询一样,很方便。
语法:
CREATE VIEW "视图表名" AS "SELECT 语句"; #创建视图表
DROP VIEW "视图表名"; #删除视图表
示例:
视图表就是保存了select语句的查询结果,可以理解为select语句的别名。
原表数据变化后,视图表的结果也会发生变化。
#将两个表的连接查询,创建为视图表
create view v_region_sales as select A.region region,sum(B.sales) sales from location A inner join store_info B on A.store_name=B.store_name group by region;
select * from v_region_sales; #查看视图表的存储结果
drop view v_region_sales; #删除视图表
2.1 视图表与派生表比较
派生表,两个select查询写在一个句子当中,比较复杂冗长。
视图表,简化复杂的查询。只需创建一次,后面可以直接对已创建好的视图表进行操作。
#派生表:C就是子查询中select语句的派生表。
select sum(C.sales) from (select A.region region,sum(B.sales) sales from location A,store_info B where A.store_name=B.store_name group by region) C;
#视图表:只需创建一次,后面可以直接对已创建好的视图表进行操作。
create view v_region_sales as select A.region region,sum(B.sales) sales from location A inner join store_info B on A.store_name=B.store_name group by region;
select sum(sales) from v_region_sales; #对视图表进行操作