(15)连接查询概念与左连接语法、练习
2017-08-14 14:56
537 查看
集合set
集合的特性:无序性,唯一性
一张表就是一个集合,一行数据是集合的一个元素
理论上讲,不可能存在完全相同的两个行,但是表中可以有完全相同的行,因为表内部有个rowid(隐藏)
一、笛卡尔积
集合相乘是笛卡尔积,其实就是两个集合的完全组合
Q:设集合A有M个元素,M个元素各不相同
设集合B中,N个元素,N个元素个不相同
AxB得到的积,有M*N个元素,不可能重复
sql中两个表做笛卡尔积:select * from ta,tb;(不用乘号,用逗号)
二、左连接、右连接、内连接语法
①左连接 语法:select 列1,列2,列N from
tableA left join tableB
on tableA 列=tableB[此处表连接成一张大表,完全当成普通的表看]
where group by,having…..照常写
②右连接 语法:select 列1,列2,列N from
tableA right join tableB
on tableA 列=tableB[此处表连接成一张大表,完全当成普通的表看]
where group by,having…..照常写
③内连接 语法:select 列1,列2,列N from
tableA inner join tableB
on tableA 列=tableB[此处表连接成一张大表,完全当成普通的表看]
where group by,having…..照常写
三、左连接、右连接、内连接区别
左连接,以左表为准,去右表找匹配数据,找不到匹配,用NULL补齐,行数>=M(左表行数)
右连接,以右表为准,去左表找匹配数据,找不到匹配,用NULL补齐,行数>=M(右表行数)
内连接,查询左右表都有的数据,不要左右连接中null的那一部分
内连接是左右连接的交集
四、练习
集合的特性:无序性,唯一性
一张表就是一个集合,一行数据是集合的一个元素
理论上讲,不可能存在完全相同的两个行,但是表中可以有完全相同的行,因为表内部有个rowid(隐藏)
一、笛卡尔积
集合相乘是笛卡尔积,其实就是两个集合的完全组合
Q:设集合A有M个元素,M个元素各不相同
设集合B中,N个元素,N个元素个不相同
AxB得到的积,有M*N个元素,不可能重复
sql中两个表做笛卡尔积:select * from ta,tb;(不用乘号,用逗号)
二、左连接、右连接、内连接语法
①左连接 语法:select 列1,列2,列N from
tableA left join tableB
on tableA 列=tableB[此处表连接成一张大表,完全当成普通的表看]
where group by,having…..照常写
②右连接 语法:select 列1,列2,列N from
tableA right join tableB
on tableA 列=tableB[此处表连接成一张大表,完全当成普通的表看]
where group by,having…..照常写
③内连接 语法:select 列1,列2,列N from
tableA inner join tableB
on tableA 列=tableB[此处表连接成一张大表,完全当成普通的表看]
where group by,having…..照常写
三、左连接、右连接、内连接区别
左连接,以左表为准,去右表找匹配数据,找不到匹配,用NULL补齐,行数>=M(左表行数)
右连接,以右表为准,去左表找匹配数据,找不到匹配,用NULL补齐,行数>=M(右表行数)
内连接,查询左右表都有的数据,不要左右连接中null的那一部分
内连接是左右连接的交集
drop table if exists boy; create table boy( name varchar(4), flower varchar(5) )character set utf8; insert into boy values('林书豪','玫瑰'); insert into boy values('刘翔','桃花'); insert into boy values ('周杰伦','茉莉花'); insert into boy values('鹿晗','荷花'); insert into boy values('刘德华','狗尾巴花'); drop table if exists girl; create table girl( name varchar(4), flower varchar(5) )character set utf8; insert into girl values('艾薇儿','玫瑰'); insert into girl values('居里夫人','桃花'); insert into girl values('芙蓉姐','茉莉花'); insert into girl values('凤姐','茉莉花'); insert into girl values('林志玲','荷花');
select boy.*,girl.* from boy left join girl on girl.flower=boy.flower; select girl.*,boy.* from girl right join boy on girl.flower=boy.flower; select girl.*,boy.* from boy inner join girl on girl.flower=boy.flower; 外链接(不支持outer,但可以用union) select boy.*,girl.* from boy left join girl on girl.flower=boy.flower union select boy.*,girl.* from boy right join girl on girl.flower=boy.flower;
四、练习
create table mat ( matchID int, hostTeamID int, guestTeamID int, matchResult varchar(20), matchTime date ); create table Team( teamID int primary key, teamName varchar(10) ); insert into mat values(1,1,2,'1:2','2006-06-02'); insert into mat values(2,2,3,'4:2','2006-06-09'); insert into mat values(3,1,2,'9:2','2006-07-02'); insert into mat values(4,1,3,'1:2','2006-06-12'); insert into mat values(5,1,2,'3:2','2006-06-30'); insert into Team values(1,'拜仁'); insert into Team values(2,'不莱梅'); insert into Team values(3,'梅西'); // select '主队名称',tmp.matchResult,tmp.guestTeamID,teamName as '客队名称' from (select hostTeamID,guestTeamID,matchResult,teamName as '主队名称'from mat left join Team on mat.hostTeamID=Team.teamID where matchTime )as tmp left join Team on tmp.guestTeamID=Team.teamName; 1,先把顺序搞对 select hostTeamID,matchResult,guestTeamID from mat; 2,把主队的名称取到 select hostTeamID,matchResult,guestTeamID,teamName from mat left join Team on mat.hostTeamID=t.teamID; 3,把客队的名称取到(因为两次连接Team,所以都要取别名) select hostTeamID,matchResult,guestTeamID,t1.teamName as hname, t2.teamName as gname from mat left join Team as t1 on mat.hostTeamID=t1.teamID left join Team as t2 on mat.guestTeamID=t2.teamID 4,时间限定,一些列去掉,无论怎么连接,连接后是一张表 select t1.teamName as hname,matchResult,t2.teamName as gname from mat left join Team as t1 on mat.hostTeamID=t1.teamID left join Team as t2 on mat.guestTeamID=t2.teamID where mat.matchTime between '2006-06-01'and '2006-07-01';
//若有多个连接,先连接,再选取对应的列 select goods_id,goods_name,goods.cata_id,cat_name,goods.brand_id,brand_name from goods left join catalog on goods.cata=catalog.cata left brand on brand.brand_id=goods.brand_id;
相关文章推荐
- Oracle 11g 学习四:多表查询、左右连接、SQL1999语法、统计函数及分组查询
- 【Mysql】利用内连接与嵌套查询实现多表查询,主键、外键的基本概念
- Navicat 连接MySQL数据不能新建查询,提示文件名、目录名或卷标语法不正确
- 06-Oracle学习_练习-子查询 和 连接查询
- Hibernate_查询_HQL详解(二)_聚集函数、分组、连接查询、查询时使用参数的HQL语法
- Day58-Oracle02 - 内连接、外连接、子查询(exists用法,关联/非关联子查询)、课堂练习(行列转换)、rownum和rowid
- 多表查询-左右连接-SQL1999:语法-分组查询
- SQL查询之基础(语法和概念)完整版
- RailsCasts中文版,#15 Fun with Find Conditions 使用hash为查询条件以便生成正确语法的SQL查询
- javawebday42(多表查询 内外连接 合并结果 基本习题练习 年度增长比)
- Sql语句中两个比较迷糊的概念:“连接查询” 与 “外键约束”
- MySQL-99语法:外连接与内连接-(左内连接多表和查询)
- RailsCasts中文版,#15 Fun with Find Conditions 使用hash为查询条件以便生成正确语法的SQL查询
- C# , SQL 数据库 -------------- 连接查询和分组查询 ---- (上机练习)
- SQL连接查询总结和练习
- 连接查询及分组查询强化练习
- 十一章 连接,分组查询 上机练习一
- Oracle语法温故(左外连接、右外连接、全外连接、内连接、自连接、联合查询 之间的区别)
- oracle 基本语句练习(四) SQL1999 语法规范 cross join ,等值连接,不等值连接,自连接与外连接
- Oracle86和92语法的连接,子查询,集合的操作