MySQL中经常使用关联查询,有机会总结下:

1 left join(左联查询):

返回包括左表中的所有记录和右表中联接字段相等的记录

例:select * from a left join b on a.id=b.id

2 right join(右联查询):

right join(右联接)返回包括右表中的所有记录和左表中联接字段相等的记录

例:select * from a right join b on a.id=b.id

看到这里可能比较还是有点不明白,请看以下示例

假如有两张表,A B

表A记录如下:
aID     aNum
1     a20050111
2     a20050112
3     a20050113
4     a20050114
5     a20050115

表B记录如下:
bID     bName
1     2006032401
2     2006032402
3     2006032403
4     2006032404
8     2006032408

执行select * from A left join B  on A.aID = B.bID

结果如下:
aID     aNum     bID     bName
1     a20050111    1     2006032401
2     a20050112    2     2006032402
3     a20050113    3     2006032403
4     a20050114    4     2006032404
5     a20050115    NULL     NULL

结果:从查询结果可以看出左关联查询是以左表的表为主表进行查询,由于A表中aID为5的在右表中没有对应记录,因此查询结果中最后一行又两个NULL列,同理可以得出右关联的原理。

3 内联查询(联接查询):在where子句中指定条件,将多个表连接起来

select  c.cname,b.bookname from cats c,book b, where c.id=b.catid

看到这里,可能不禁发问,这三者有什么区别?看下面这个例子

有两张数据表,表user(id, name)记录了用户的ID和昵称,表article(id,uid,title, content, time)记录了用户发表的文章标题.内容和时间,写一个SQL语句打印出每个用户的昵称及其发表的文章总数

解决方法1:

select u.name,count(a.id) from user u,article a where u.id=a.uid group by a.uid

解决方法2:

select u.name,count(a.id) from user u left join article a on u.id=a.uid group by a.uid

假如出现这种情况:有一个用户没有发表文章,那么第一个解决方案不会出现这个用户,因此第一种是错误的。

4嵌套查询

在一个select语句的where子句中,包含另一个select子句,也可称为子查询。嵌套查询的原理一般是由里向外。

例:select bookid,bookname from books where bookid in(select bookid from cats );

最近做面试题,碰到几个比较有意思的Mysql操作,总结如下:

a)关系S(s#, sname, sex), C (c#, cname), SC(s#, c#) . 其中S#为学生号,sname为学生姓名,sex为性别,c#为课程号,cname为课程名。

写出查询选修"计算机"课的全体女学生姓名的SQL语句。

select S.s#,S.sname from S,SC where S.s#=SC.s#  and S.sex=1 and SC.c# in (select from C where cname='计算机' )

写出查询没有选修"数学"课的学生姓名的SQL语句。

select * from S where s# not in(select from S,SC where S.s#=SC.s# and SC.c# in ( select c# from C where  cname='数学'))

b)列三张表,请根据要求写出SQL语句

CARD借书卡。 CNO卡号,NAME姓名,CLASS班级

BOOKS图书。 BNO书号,BNAME书名,AUTHOR作者,PRICE单价

BORROW借书记录。 CNO借书卡号,BNO书号,RDATE还书日期

备注:限定每人每种书只能借一本

找出借书超过5本的读者,输出借书卡号,及所借图书册数。(5分)

错误写法: select c.name, count(b.cno) total from card c,borrow b where c.cno=b.cno  and total>5 group by b.cno ;

正确写法:select c.name, count(b.cno) total from card c,borrow b where c.cno=b.cno group by b.cno having total>=5;

由于使用的是group进行分组,而在group by进行分组查询统计后,只能使用having子句来对查询结果进行进一步的过滤。

MySQL关联查询总结的更多相关文章

  1. mysql 关联查询 索引不起作用原因记录

    业务逻辑如下:查询某篇文章的评论列表,且列出评论人及被评论人的昵称.头像. 先看一下表结构 评论表: 评论表的索引: 用户表: 用户表的索引: 查询语句如下: SELECT t1.comment_id ...

  2. mysql关联查询和联合查询

    一.内联方式 1.传统关联查询 "select * from students,transcript where students.sid=transcript.sid and transc ...

  3. MySQL☞关联查询

    关联查询:所需要的数据来源于多张表,通过表的连接查询(关联查询)来查询多张表中的数据 格式: select 别名1 . */列名 , 别名2 . */列名 from 表名1  别名1 , 表名2  别 ...

  4. mysql 关联查询技巧

    废话不多说,直接进入正题 #数据准备 班级表class: CREATE TABLE `class` ( `class_no` ) unsigned zerofill NOT NULL AUTO_INC ...

  5. [mysql] 关联查询sql记录

    //查询账单关联订单 select o.id as id, o.order_no as orderNo, o.case_no as caseNo, o.send_time as sendTime, o ...

  6. MySQL 关联查询 内连接

    内连接    [INNER| CROSS] JOIN无条件内连接:无条件内连接,又名交叉连接/笛卡尔连接第一张表种的每一项会和另一张表的每一项依次组合#例:mysql>  select  *  ...

  7. mysql关联查询

    mysql数据库的统计------生成统计信息 1.distinct:在一组之中将各个唯一的值找出来,如找出所有的品牌种类 mysql>select distinct brand_kind fr ...

  8. mysql 关联查询的执行顺序

    STRAIGHT JOIN : 能强制按照顺序关联表(应该是)

  9. MySQL 关联查询  外连接 { LEFT| RIGHT } JOIN

    左外连接: (以左表为基准)两张表做连接的时候,在连接条件不匹配的时候留下左表中的数据,而右表中的数据以NULL填充例:使用左连接把学生的数据全取出来,该学生没有学院信息的用NULL填充 mysql& ...

随机推荐

  1. oracle_深刻理解数据库的启动和关闭

    Oracle数据库提供了几种不同的数据库启动和关闭方式,本文将详细介绍这些启动和关闭方式之间的区别以及它们各自不同的功能. 一.启动和关闭Oracle数据库 对于大多数Oracle DBA来说,启动和 ...

  2. Linux下一个C基本的编程----写进Blog在那之前

    展望2周的实习吧. 各种酸甜苦辣.由于公司只是广告.毛承保让我去.严重的歧视.想也想开,争夺.结果让它成为.还是把它写自己的学习经验,我有同样的希望和迷茫的同学.少走一点弯路.行.切入正题: 一.參考 ...

  3. ZOJ 3802 Easy 2048 Again 像缩进DP

    链接:problemId=5334">http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5334 题意:一个长度为5 ...

  4. Atitit.异步编程 java .net php python js 对照

    Atitit.异步编程 java .net php python js 的比較 1. 1.异步任务,异步模式,  APM模式,,  EAP模式, TAP 1 1.1.       APM模式: Beg ...

  5. Team City的安装1

    持续集成工具 Team City的安装 前两个月很大一部分精力投入在做部门的持续集成,从概念的了解和工具的选型,再到安装,部署,操作,到最后的真实项目持续集成应用的上线,写了一份手册,包括安装,配置, ...

  6. 高性能双端js模板---simplite

    simplite是一款js实现的模板引擎,它能够完成浏览器端js模版和node服务器端js模板的数据渲染,渲染性能达到引擎的极限. 渲染性能十分突出. 支持浏览器端和node服务器端模板渲染. 它简单 ...

  7. IS2009制作Oracle 静默安装包(一)感谢空白先生特许授权

    原文:IS2009制作Oracle 静默安装包(一)感谢空白先生特许授权 上一篇: MyEclipse中消除frame引起的“the file XXX can not be found.Please ...

  8. 从零开始学习jQuery(剧场版) 你必须知道的javascript

    原文:从零开始学习jQuery(剧场版) 你必须知道的javascript 一.摘要 本文是jQuery系列教程的剧场版, 即和jQuery这条主线无关, 主要介绍大家平时会忽略的一些javascri ...

  9. Spring IOC之基于JAVA的配置

    基础内容:@Bean 和 @Configuration 在Spring中新的支持java配置的核心组件是 @Configuration注解的类和@Bean注解的方法. @Bean注解被用于表明一个方法 ...

  10. bootstrap-paginator 分页插件笔记

    [MVC]bootstrap-paginator 分页插件笔记   bootstrap-paginator基于bootstrap框架,使用起来非常简单.官网:http://harttle.github ...