1.1 目标
理解多表查询
理解子查询
能够创建视图
能够删除视图
能够查看创建视图的SQL语句
能够理解事务的作用
能够操作事务
理解索引的作用
能够创建索引
能够删除索引
知道常用的函数
了解预处理语句的作用
能够使用预处理语句
了解存储过程的作用
能够创建存储过程
能够调用存储过程
1.2 多表查询分类
将多个表的数据横向的联合起来。
1、 内连接
2、 外连接 左外连接 右外连接
3、 交叉连接
4、 自然连接1.2.1 内连接【inner join】
1
2
3语法一:select 列名 from 表1 inner join 表2 on 表1.公共字段=表2.公共字段
语法二:select 列名 from 表1,表2 where 表1.公共字段=表2.公共字段例题
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36方法一:
mysql> select stuname,stusex,writtenexam,labexam from stuinfo inner join stumarks on stuinfo.stuno=stumarks.stuno;
+----------+--------+-------------+---------+
| stuname | stusex | writtenexam | labexam |
+----------+--------+-------------+---------+
| 李斯文 | 女 | 80 | 58 |
| 李文才 | 男 | 50 | 90 |
| 欧阳俊雄 | 男 | 65 | 50 |
| 张秋丽 | 男 | 77 | 82 |
| 争青小子 | 男 | 56 | 48 |
+----------+--------+-------------+---------+
方法二:
mysql> select stuinfo.stuno,stuname,stusex,writtenexam,labexam from stuinfo,stumarks where stuinfo.stuno=stumarks.stuno;
+--------+----------+--------+-------------+---------+
| stuno | stuname | stusex | writtenexam | labexam |
+--------+----------+--------+-------------+---------+
| s25303 | 李斯文 | 女 | 80 | 58 |
| s25302 | 李文才 | 男 | 50 | 90 |
| s25304 | 欧阳俊雄 | 男 | 65 | 50 |
| s25301 | 张秋丽 | 男 | 77 | 82 |
| s25318 | 争青小子 | 男 | 56 | 48 |
+--------+----------+--------+-------------+---------+
可以给表取别名
mysql> select i.stuno,stuname,stusex,writtenexam,labexam from stuinfo i,stumarks s where i.stuno=s.stuno;
+--------+----------+--------+-------------+---------+
| stuno | stuname | stusex | writtenexam | labexam |
+--------+----------+--------+-------------+---------+
| s25303 | 李斯文 | 女 | 80 | 58 |
| s25302 | 李文才 | 男 | 50 | 90 |
| s25304 | 欧阳俊雄 | 男 | 65 | 50 |
| s25301 | 张秋丽 | 男 | 77 | 82 |
| s25318 | 争青小子 | 男 | 56 | 48 |
+--------+----------+--------+-------------+---------+
5 rows in set (0.00 sec)脚下留下:显示公共字段需要指定表名
1 | 思考: |
1 | 多学一招:三个表的内连接如何实现? |
1.2.2 左外连接【left join】
以左边的表为标准,如果右边的表没有对应的记录,用NULL填充。
1 | 语法:select 列名 from 表1 left join 表2 on 表1.公共字段=表2.公共字段 |
例题
1 | mysql> select stuname,writtenexam,labexam from stuinfo left join stumarks on stuinfo.stuno=stumarks.stuno; |
1 | 思考: |
1.2.3 右外连接【right join】
以右边的表为标准,如果左边的表没有对应的记录,用NULL填充。
1 | 语法:select 列名 from 表1 right join 表2 on 表1.公共字段=表2.公共字段 |
例题
1 | mysql> select stuname,writtenexam,labexam from stuinfo right join stumarks on stuinfo.stuno=stumarks.stuno; |
1 | 思考: |
1.2.4 交叉连接【cross join】
插入测试数据
1 | mysql> create table t1( |
1、如果没有连接表达式返回的是笛卡尔积
1 | mysql> select * from t1 cross join t2; # 返回笛卡尔积 |
2、如果有连接表达式等价于内连接
1 | mysql> select * from t1 cross join t2 where t1.id=t2.id; |
1.2.5 自然连接【natural】
1 | 自动的判断连接条件,它是过同名字段来判断的 |
自然连接又分为:
- 自然内连接 natural join
. 自然左外连接 natural left join
. 自然右外连接 natural right join
例题:
1 | # 自然内连接 |
自然连接结论:
表连接通过同名的字段来连接的
如果没有同名的字段返回笛卡尔积
会对结果进行整理,整理的规则如下
a) 连接字段保留一个
b) 连接字段放在最前面
c) 左外连接左边在前,右外连接右表在前
1.2.6 using()
用来指定连接字段。
using()也会对连接字段进行整理,整理方式和自然连接是一样的。
1 | mysql> select * from stuinfo inner join stumarks using(stuno); # using指定字段 |