6.3 联表查询
在关系型数据库中,表与表之间是有联系的,所以在实际应用中,经常使用多表查询。多表查询就是同时查询两个或两个以上的表。
在 MySQL 中,多表查询主要有交叉连接、内连接和外连接。
参考资料: http://c.biancheng.net/view/7463.html。
SQL JOINS:七种join(联结)方式。
内连接的语法格式如下:
SELECT <字段名> FROM <表1> INNER JOIN <表2> [ON子句]
内连接使用 INNER JOIN 关键字连接两张表,并使用 ON 子句来设置连接条件。
内连接可以查询两个或两个以上的表。
on子句可以用where子句代替,但不建议这样做。INNER JOIN ... ON
语法是官方的标准写法,而且 WHERE
子句在某些时候会影响查询的性能。
外连接可以分为左连接和右连接。
1 | -- 查询参加了考试的同学(学号,姓名,科目编号,分数) |
FROM后面的是主表,JOIN后面的是参考表。
小结:
左连接以左表为基准,右连接以右表为基准。
操作 | 描述 |
---|---|
Inner join | 如果表中至少有一个匹配,就返回 |
left join | 会从左表返回所有的值,即使右表没有匹配 |
right join | 会从右表返回所有的值,即使左表没有匹配 |
左连接:假设表1为主表,表2为参考表。
如果“表1”的某行在“表2”中没有匹配行,那么在返回结果中,“表2”的字段值均为空值(NULL)。
1 | -- 查询缺考的学生 |
查询:参考考试的同学信息:学号,学生姓名,科目名,分数。
需要三表联接。
1 | SELECT r.`studentno`,s.`studentname`,s.`gradeid`,r.`studentresult`,sub.`subjectname` |
6.4 自联结查询
建立测试表数据:
1 | CREATE TABLE `school`.`category`( `categoryid` INT(3) NOT NULL COMMENT 'id', `pid` INT(3) NOT NULL COMMENT '父id 没有父则为1', `categoryname` VARCHAR(10) NOT NULL COMMENT '种类名字', PRIMARY KEY (`categoryid`) ) ENGINE=INNODB CHARSET=utf8 COLLATE=utf8_general_ci; |
上面的测试表实际上是两张表糅合成一张表。
pid
为1的是最大的分类(父类):
子类的pid
对应父类的categoryid
,确定每个子类属于哪个父类。
整理父类和子类的关系可以得到下图:
下面用mysql
语句来查询父类和子类的关系:
1 | -- 查询父子信息:把一张表拆成两张表 |
1 | -- 联表查询小练习 |
6.5 分页(limit)和排序(order by)
排序:升序asc,降序desc。
1 | SELECT s.`studentno`,s.`studentname`,sb.`subjectname`,r.`studentresult` |
分页limit:
为啥要分页呢?缓解数据库压力。
瀑布流:没有分页,可以一直往下拉。
语法:limit 当前页起始值,页面大小
。
1 | SELECT s.`studentno`,s.`studentname`,sb.`subjectname`,r.`studentresult` |
1 | -- 第一页 |
小练习:
1 | -- 查询 JAVA第一学年 课程成绩前10名并且分数大于80的学生信息(学号,姓名,课程名,分数) |