MYSQL:
1、多表查询
2:外连接:
3:交叉连接:
student_info
s_id s_name
1
2
3
4
5
1,2,3
marks 成绩表:
s_id c_id mark
1
2
3
4
1
2
class 科目表
c_id c_name
1
2
3
1)等值连接:
select s_id,s_name,age,area,c_name,marks
from student_info,marks,class
where student_info.s_id=marks.s_id
2)如果重复的字段较多,那么我们给使用的表起个别名:
select c_name,avg(marks) as "jjj"
from class,marks
where class.c_id=marks.c_id;
group by c_name;
3)sql语句中中:
内连接:
select 字段列表 from 表1 innerjoin 表2
on 表1.字段1=表2.字段1
eg:
外连接:
左连接:
右连接:
全连接:在mysql中部支持全连接
4)交叉连接:
5)自连接:
inner join
person
p_id
1 tom
2
3
4
职工
tom
lily
damat 领导
per 职工表
p_id
1 tom
2
3
4
cap 经理表
p_id
1 tom
2
3
4
select per.p_name,"领导",cap.p_name
from person per,person cap
where per.s_id=cap.p_id;
6)sql语句中的常量:
7)成绩大于60的学生姓名:
select s_name from student_info,marks
where student_info.s_id=marks.s_id marks>60;
mysql中的内连接,外连接
mysql中的内连接,外连接实例详解
内连接: 只连接匹配的行
左外连接: 包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行
右外连接: 包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行
全外连接: 包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。
交叉连接
举个例子吧。
表A
id
1
2
3
表B
id
1
2
3
包容性:A表包容B表,左连接左表是全的.(left join 或 left outer join )
SQL语句如下:
SELECT A.name, B.address
FROM A
LEFT JOIN B ON A.id = B.A_id
查询结果为:
name
张
李
王
包容性:B表包容A表,右连接右表是全的.(right join 或 right outer join )
SQL语句如下:
SELECT A.name, B.address
FROM A
RIGHT JOIN B ON A.id = B.A_id
查询结果为:
name
张
王
NULL
排他性:A,B表中至少有1个匹配时,才返回行。两表的交集
SQL语句如下:
select A.name,B.address from A
inner join B
on A.id = B.A_id
查询结果为:
name
张
王
inner join
SELECT A.name, B.address
FROM A, B
WHERE A.id = B.A_id
注释:全外连接返回参与连接的两个数据集合中的全部数据,无论它们是否具有与之相匹配的行。在功能上,它等价于
对这两个数据集合分别进行左外连接和右外连接,然后再使用消去重复行的并操作将上述两个结果集合并为一个结果集
。(full join 或 full outer join )
SQL语句如下:
select * from A
full join B
查询结果为:
id
1
2
3
1
2
3
1
2
3
注释:返回3*3=9条记录,即笛卡尔积
SQL语句如下:
SELECT * FROM A
CROSS JOIN B
查询结果为:
id
1
2
3
1
2
3
1
2
3
CROSS JOIN等价于:
select * from A,B
注意:
1. on A.id = B.id 等同于 using(id)//这里字段名要相同
2. 当 MySQL 在从一个表中检索信息时,你可以提示它选择了哪一个索引。
如果 EXPLAIN 显示 MySQL 使用了可能的索引列表中错误的索引,这个特性将是很有用的。
通过指定 USE INDEX (key_list),你可以告诉 MySQL 使用可能的索引中最合适的一个索引在表中查找记录行。
可选的二选一句法 IGNORE INDEX (key_list) 可被用于告诉 MySQL 不使用特定的索引。
效率问题:
1.inner join比left join快
注:inner join
所以一般要用一般的连接就可以了.
2.连接字段建索引