1 SELECT操作多表数据
关于连接的问题,在《SQL必知必会》学习笔记中已经讲到过,但是没有掌握完全,所以再学一下。
1.1 JOIN连接
首先我们先来看一下最简单的连接。Products表和Vendors表的连接
示例1
Products表数据如下
Vendors表数据如下
将这两张表通过以下语句连接
USE test
SELECT prod_name,Products.vend_id,vend_name
FROM Products,Vendors
WHERE Products.vend_id=Vendors.vend_id;
--连接条件为两张表的vend_id相同
连接结果如下
当用户所需数据不在一个表中,而在多个表中,就需要使用多表连接,将多个表中的数据组合到一起,使数据更直观地体现出来。在上述语句中,通过JOIN我们可以从结果中很明确地知道产品及其供应商。
1.1.2 内连接
内连接是一种比较常用的数据连接查询方式,上述语句就是内连接。下面将给出另一种内连接的语法。两者的查询结果是一样的。
--内连接INNER JOIN
USE test
SELECT prod_name,Products.vend_id,vend_name
FROM Products INNER JOIN Vendors--和上面语句差异之处
ON Products.vend_id=Vendors.vend_id;
注:使用INNER JOIN时,关键字INNER可省略,但是连接条件必须用ON连接,不能用FROM了。
内连接分为等值连接,非等值连接和自然连接三种。
1.1.2.1 等值连接
连接条件用等号相连,查询结果中列出被连接表中的所有列,包括重复列。为了更加形象地体现“列出重复列”这个特点,接下来还是用Products和Vendors表来举例。逻辑是:一种产品可以对应多个供应商,一个供应商可以生产多种产品。
示例2
Products表数据如下
Vendors表数据如下
然后执行等值连接的代码
SELECT * FROM Vendors,Products
WHERE Vendors.vend_id=Products.vend_id;
结果如图所示
可以看到,在结果中vend_id列重复。
注:等值连接要满足2个条件,连接条件用=号,查询结果中包含被连接表中所有列,包含重复列。
1.1.2.2 非等值连接
连接条件中使用除等号以外的比较运算符来比较连接列的列值。例如使用>,<,>=,<=,<>等,也可以使用范围运算符BETWEEN。下面用stu表和class表来示范非等值连接
示例3
新建stu表并插入数据,stu表用来表示学生和该学生的年级总成绩
CREATE TABLE stu(
sto VARCHAR(8) NOT NULL,
stname VARCHAR(20)