本文实例讲述了mysql连接查询、联合查询、子查询原理与用法。分享给大家供大家参考,具体如下:
本文内容:
- 连接查询
- 联合查询
- 子查询
- from子查询
- where子查询
- exists子查询
首发日期:2018-04-11
连接查询:
- 连接查询就是将多个表联合起来查询,连接查询方式有内连接、外连接、自然连接、交叉连接。连接查询使得可以同时查看多张表中数据。
- 内连接:有条件连接,多个表之间依据指定条件连接,匹配结果是保留符合匹配结果的记录。
- 外连接:与内连接不同的是不管匹配符不符合都保留,根据外连接连接方式来决定保留哪张表,比如保留左表的话,那么左表无法匹配右表时,保留左表数据,然后置右表字段数据为null.
- 自然连接:有条件连接,自动依据“同名字段”连接(多个同名字段就都作为条件)。
- 交叉连接cross join:无条件连接,将每一条记录与另外一个表的每一条记录连接(笛卡尔积),结果是字段数等于原来字段数之和,记录数等于之前各个表记录数之乘积。
-- 实验表结构 create table student( id int, name varchar(15), gender varchar(15), cid int ); create table class( cid int, cname varchar(15) ); drop table student,class; -- 实验表数据: insert into student values(1,"lilei","male",1),(2,"hanmeimei","male",2),(3,"jack","male",1),(4,"alice","female",4); --这里特意创建了一个class中没有的4 insert into class values(1,"linux"),(2,"python"),(3,"java"),(5,"html5");--这里特意创建了一个student中没有的5 select * from student; select * from class;
内连接:
- 从左表中取出每一条记录,去右表中与所有的记录进行匹配,保留匹配成功的记录,并将两份记录拼接。
- 语法:select 字段列表 from 左表 [inner] join 右表 on 左表.字段 = 右表.字段;
- 不使用on条件的时候,结果与交叉连接相同
-- 内连接 -- select * from student inner join class; --结果与交叉连接相同 select * from student join class on student.cid = class.cid; select * from student inner join class on student.cid = class.cid;
外连接:
- 与内连接不同的是主表记录不管匹配符不符合都保留,方式有左外连接、右外连接,左外连接是保留左表,右外连接是保留右表
- 语法:
- 左外连接:select 字段列表 from 左表 left join 右表 on 左表.字段 = 右表.字段;
- 右外连接:select 字段列表 from 左表 right join 右表 on 左表.字段 = 右表.字段;
select * from student left join class on student.cid = class.cid;
自然连接:
- 自动匹配连接条件,系统以字段名字作为匹配模式(同名字段就作为条件,多个同名字段就都作为条件)
- 自然内连接:类似内连接,但不提供连接条件。
- 自然外连接:类似外连接,但不提供连接条件。
- 语法:
- 自然内连接:select 字段列表 from 表名 natural join 表名;
- 自然外连接:select 字段列表 from 表名 natural left\right join 表名;
select * from student natural join class;
交叉连接:
- 将每一条记录与另外一个表的每一条记录连接
- 语法:
- select 字段列表 from 表名 cross join 表名;
- select 字段列表 from 表名 ,表名;
select * from student cross join class; select * from student,class;
补充:
- 在多个表中,为了区分每个表,以及简便使用,可以使用表别名。
select * from student inner join class on student.cid = class.cid;-- 原本结果 select id,name,gender,c.cid,cname from student as s inner join class as c on s.cid = c.cid;-- 使用表别名
- 可以多重连接。
- 外连接可以模拟自然连接,只需要将连接条件on 左表.字段 = 右表.字段变成"using 字段名"即可。
联合查询:
- 联合查询是将多个查询结果在记录上进行拼接。(相当于将其他表的查询记录结果连接到第一个表的后面)【因为是拼接,所以多个查询结果的字段数必须相同】【拼接不在意数据类型,比如第一个表的第一个字段是int,但后面的表中的varchar依然可以拼接到第一列中】
- 语法:select语句 union select语句…;
select name,gender from student union select * from class; -- 因为class就两个字段,所以第一个只选出两个字段
补充:
- union可以有选项,加在union 后面,all选项是不对相同去重,distinct是去重。
- 联合查询一般用来处理同一表中以不同方法显示不同数据。(比如,想将学生各科成绩表中的两科(这里假设为python 跟linux)同时查询出来)
- union和order by同时使用报错时
- 如果你想针对联合查询中的某个查询结果排序,需要将这个select语句用括号括起来。【另外,由于联合查询的拼接机制,需要在order by 后面加上limit子句才行,limit的数量可以是一个很大的值。】
- 如果是针对最终的联合查询结果,就在最后一个select语句中使用order by 【建议给最后一个字段加上括号,再加ordery by,使用情况是有同名字段】
子查询:
- 子查询是嵌套在查询语句中的查询。
- 子查询按照出现的位置可以分为三类:
- from子查询:子查询跟在from之后的;一般用在“先查出二维表,再处理”的情况。
- 比如:
-- 这是一个无意义的例子。仅为举例使用 select cid,cname from (select * from class where cname="python") as c;
- 比如:
- where子查询:子查询跟在where条件中;一般用在“先查询出指定条件再查询”的情况
- 比如:
select * from student where cid=(select cid from class where cname="python");
- 比如:
- exist子查询:子查询在exist语句里面;一般用作“存在才做”的情况
- 比如:
-- 这是一个如果学生没有选择cid=1的课,那么不输出对应课程信息的例子 select * from class where exists(select * from student where cid=1) and cid=1;
- 比如:
- 事实上,有些人认为union之后跟着的也是子查询,不过这里不把这些当作子查询,只把上面几个与“查询”非常紧密相关的当作子查询。
- from子查询:子查询跟在from之后的;一般用在“先查出二维表,再处理”的情况。
补充:
- 事实上,还可以根据结果来分类子查询:
- 标量子查询,子查询得到的结果是一行一列,情况一般发生于where子查询只查询出一行一列的情况。
- 列子查询,子查询得到的结果是一列多行,情况一般发生于where子查询查询出一列多行的情况。
- 行子查询,子查询得到的结果是多列一行(或者多行多列) ,情况一般发生在where子查询查询出多列一行的情况。
- 表子查询,子查询得到的结果是多行多列 ,情况一般发生在from子查询中
- where子查询中有时候还使用一些其他关键字,如any,all,some,但对=来说,=基本可以实现他们的功能了。
更多关于MySQL相关内容感兴趣的读者可查看本站专题:《MySQL查询技巧大全》、《MySQL事务操作技巧汇总》、《MySQL存储过程技巧大全》、《MySQL数据库锁相关技巧汇总》及《MySQL常用函数大汇总》
希望本文所述对大家MySQL数据库计有所帮助。
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
暂无评论...
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
2024年12月29日
2024年12月29日
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]