1.连接查询/多表查询
假设有二张表t1和t2:
t1的字段(id,name,age)
t2的字段(id,class,score)
(1)查询出学生的姓名,年龄和分数
mysql> SELECT name,age,score
FROM t1 INNER JOIN t2 ON t1.id = t2.id;
INNER JOIN 可以省略写成JOIN
注意:这就是内连接,返回的行都是二个表相匹配的数据
(2)mysql> SELECT t1.id,name,age,score
FROM t1 LEFT JOIN t2 ON t1.id = t2.id;
注意:这是左连接,除了返回二个表相匹配的数据,还会返回左表多余的数据,与右表不匹配以null显示
(3)mysql> SELECT t1.id,name,age,score
FROM t1 RIGHT JOIN t2 ON t1.id = t2.id;
注意:这是右连接,除了返回二个表相匹配的数据,还会返回右表多余的数据,与左表不匹配以null显示
注意:mysql中只有内连接、左连接和右连接,没有全连接
内连接返回二个表关联字段共同都有的数据
左连接除了返回内连接的数据,还返回左表多余的数据,左连接只要记住左表为大
右连接除了返回内连接的数据,还返回右表多余的数据,右连接只要记住右表为大
(4)假设是三表连接,内连接如下写法,其它连接相似
SELECT * FROM t1 JOIN t2 ON t1.id= t2.id JOIN t3 ON t2.id = t3.id;
上面的写法等于下面这种写法:
==SELECT * FROM t1,t2,t3
WHERE t1.id = t2.id AND t2.id =t3.id;
王豆豆更喜欢下面这种写法,更简单,更快。
接下的多表查询都将使用这种方法。
现在有三张表,表结构如下:
班级(class)表(学号(id),姓名(name),班级(class),年龄(age))
课程(course)表(课程名(cname),课程号(cno))
分数(score)表(学号(xuehao),课程号(scno),分数(score))
(5)查询出学员的姓名,班级,课程名以及相应课程的分数,并以分数进行降序排列
SELECT c.name,c.class,co.cname,s.score
FROM class c,course co,score s
WHERE c.id = s.xuehao AND co.cno = s.scno
ORDER BY score desc;
(6)查询出学员姓名以张开头的学员姓名,课程,分数
SELECT c.name,c.class,co.cname,s.score
FROM class c,course co,score s
WHERE c.id = s.xuehao AND co.cno = s.scno AND c.name like ‘张%’;
(7)查询学员分数大于70的学员姓名,班级,课程
SELECT c.name,class,cname
FROM class c,course co, score s
WHERE c.id = s.xuehao AND co.cno=s.scno AND s.score > ‘70’;
(8)查询学员班级为T1001的学员课程号
SELECT s.scno
FROM class c,score s
WHERE c.id = s.xuehao AND c.class = ‘T1001’;
(9)查询学员姓名包含王的学员分数,并以降序的方式排列
SELECT s.score
FROM class c,score s
WHERE c.id = s.xuehao AND c.name LIKE ‘%王%’
ORDER BY score DESC;
(10)查询年龄不在25到27之间的学员姓名,课程编号,分数
解题步骤:
1.查询出年龄不在25到27之间学员信息
SELECT * FROM class WHERE age NOT BETWEEN 25 AND 27;
2.查询出学员的姓名,课程编号,分数
SELECT name,scno,score FROM class c,score s
WHERE c.xuehao = s.xuehao;
3.合并
SELECT name,scno,score FROM class c,score s
WHERE c.xuehao = s.xuehao AND (age NOT BETWEEN 25 AND 27);
2.子查询
一个查询语句包含其他的查询语句,则叫子查询
子查询有几种结果:
子查询返回一列语句:也就是一列一个数据,这是使用情况最多的
返回一行语句:查询结果返回一行数据,有可能是一行完整的数据
返回多行语句:查询结果返回一组数据
格式:
SELECT [ALL|DISTINCT] {|table1.|{table1.field1} [as alias1]|{table2.field2} [as alias2],….}
FROM table1 [别名],table2,{
SELECT [ALL|DISTINCT] {|table1.|{table1.field1} [as alias1]|{table2.field2} [as alias2],….}
FROM table1 [别名],table2,….
[WHERE 某列名称 = 某值]
[ORDER BY …]
}别名,….
[WHERE (条件s){
SELECT [ALL|DISTINCT] {|table1.|{table1.field1} [as alias1]|{table2.field2} [as alias2],….}
FROM table1 [别名],table2,….
[WHERE 某列名称 = 某值]
[ORDER BY …]
}]
[ORDER BY …]
(1)查询出分数大于tester测试基础的分数的学员姓名和分数
解题步骤:
1.查询tester测试基础的分数
SELECT score
FROM score s,course c
WHERE s.scno = c.cno AND c.cname =’测试基础’ AND s.name = ‘tester’;
2.查询出分数大于1题查询结果的学员姓名和分数
SELECT name,score
FROM score
WHERE score > (SELECT score
FROM score s,course c
WHERE s.scno = c.cno AND c.cname =’测试基础’ AND s.name = ‘tester’);
(2)查询出分数小于测试基础最低分数的学员姓名和课程,分数
解题步骤:
1.查询出测试基础的分数(查询结果为一组数据)
SELECT score
FROM score s,course c
WHERE s.scno = c.cno AND c.cname =’测试基础’;
2.查询出分数小于最低分数的学员姓名和课程,分数
SELECT s.name,c.cname,s.score
FROM score s,course c
WHERE s.scno = c.cno AND score