mysql 关联查询技巧
废话不多说,直接进入正题
#数据准备
班级表class:
CREATE TABLE `class` (
`class_no` int(2) unsigned zerofill NOT NULL AUTO_INCREMENT COMMENT '班级编号',
`class_name` varchar(30) CHARACTER SET utf8 NOT NULL COMMENT '班级名称',
PRIMARY KEY (`class_no`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
insert into class values(1, '培优班');
insert into class values(2, '普通班');
insert into class values(3, '提升班');
学生表student:
CREATE TABLE `student` (
`stu_no` int(2) unsigned zerofill NOT NULL AUTO_INCREMENT COMMENT '学员编号',
`stu_name` varchar(30) CHARACTER SET utf8 NOT NULL COMMENT '学员姓名',
`stu_sex` varchar(3) CHARACTER SET utf8 NOT NULL COMMENT '学员性别',
`stu_age` tinyint(2) unsigned zerofill DEFAULT NULL COMMENT '学员年代',
`grade` double(5,2) unsigned zerofill DEFAULT NULL COMMENT '成绩',
`class_no` int(2) unsigned zerofill DEFAULT NULL COMMENT '所在班级编号',
PRIMARY KEY (`stu_no`),
KEY `class_no` (`class_no`)
) ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=latin1; insert into student values(01, '李白', '男', 18, 60, 01);
insert into student values(02, '杜甫', '男', 20, 76, 01);
insert into student values(03, '张飞', '男', 32, 80, 02);
insert into student values(04, '韩信', '男', 26, 98, 02);
insert into student values(05, '了龙', '男', 27, 56, 02);
insert into student values(06, '大乔', '女', 17, 88, 01);
insert into student values(07, '小乔', '女', 16, 96, 01);
insert into student values(08, '小乔', '女', 16, 90, 01);
insert into student values(09, '关哥', '男', 32, 80, 02);
insert into student values(10, '刘备', '男', 36, 98, null);
1: exists子查询
如果子查询有返回结果则为true,如果没有返回值则为false
select * from student where exists(select * from student where grade = 80)

比如not exists:
select * from student where not exists(select * from student where grade = 80);
以上结果返回空,因为 not exists 返回了 false
select * from student where exists (select * from class where class.class_no = student.class_no);

上面的查询可以看到,我们少了一条数据,第十条的clas_no 是null。。。所以这条数据是flase....而
class.class_no = student.class_no 为true的,就全部返回了
2: [union] 并合查询
需求: 拿到01班级的最高成绩 和 02班级的最低成绩
我们一般会这样
select max(grade) from student where class_no = 01;
select min(grade) from student where class_no = 02;
优化这个查询我们可以这样:
(select concat('1号班级最高成绩:', max(grade)) '成绩' from student where class_no = 01)
union
(select concat('2号班级最低成绩:', min(grade)) '成绩' from student where class_no = 02);

这里再说下union 和union all的区别:
union:
(select class_no, stu_name, stu_age from student where class_no = 1)
union
(select class_no, stu_name, stu_age from student where class_no = 2);

union all:
(select class_no, stu_name, stu_age from student where class_no = 1)
union all
(select class_no, stu_name, stu_age from student where class_no = 2);

通过以上两个查询,我们可以看到:union并合查询它会自动的去重复的记录, 如果不想要去掉重复的记录则可以使用 union all;
我们加个排序:
(select class_no, stu_name, stu_age from student where class_no = 1)
union all
(select class_no, stu_name, stu_age from student where class_no = 2) order by stu_age desc;

连接查询的分类
1: 内连接
2: 外连接
3: 自然连接
1: inner join(内连接)
需求: 查询出学员的学号, 姓名, 所在的班级名称
select stu_no, stu_name, class_name from student join class where `student`.class_no = `class`.class_no;

以上sql等同于:
select stu_no, stu_name, class_name from student join class where `student`.class_no = `class`.class_no;
select stu_no,stu_name,class_name from student,class where student.class_no = class.class_no;
内连接的inner字符可以不用写
2: cross join(交叉连接,迪卡尔集) 没有条件的内连接
例: select * from student cross join class;
例: select * from student inner join class;
例: select * from student cross join class where `student`.class_no = `class`.class_no;
ps: cross join 与 inner join 在使用上没有区分,只是在mysql中把cross join定义成交叉连接而已
就写到这把。。其他的连接方式也简单,资料也很多啦。。。
mysql 关联查询技巧的更多相关文章
- MySQL关联查询总结
MySQL中经常使用关联查询,有机会总结下: 1 left join(左联查询): 返回包括左表中的所有记录和右表中联接字段相等的记录 例:select * from a left join b on ...
- mysql 关联查询 索引不起作用原因记录
业务逻辑如下:查询某篇文章的评论列表,且列出评论人及被评论人的昵称.头像. 先看一下表结构 评论表: 评论表的索引: 用户表: 用户表的索引: 查询语句如下: SELECT t1.comment_id ...
- mysql关联查询和联合查询
一.内联方式 1.传统关联查询 "select * from students,transcript where students.sid=transcript.sid and transc ...
- MySQL☞关联查询
关联查询:所需要的数据来源于多张表,通过表的连接查询(关联查询)来查询多张表中的数据 格式: select 别名1 . */列名 , 别名2 . */列名 from 表名1 别名1 , 表名2 别 ...
- [MySQL]多表关联查询技巧
示例表A: author_id author_name 1 Kimmy 2 Abel 3 Bill 4 Berton 示例表B: book_id author_id start_date end_da ...
- [mysql] 关联查询sql记录
//查询账单关联订单 select o.id as id, o.order_no as orderNo, o.case_no as caseNo, o.send_time as sendTime, o ...
- MySQL 关联查询 内连接
内连接 [INNER| CROSS] JOIN无条件内连接:无条件内连接,又名交叉连接/笛卡尔连接第一张表种的每一项会和另一张表的每一项依次组合#例:mysql> select * ...
- mysql关联查询
mysql数据库的统计------生成统计信息 1.distinct:在一组之中将各个唯一的值找出来,如找出所有的品牌种类 mysql>select distinct brand_kind fr ...
- mysql 关联查询的执行顺序
STRAIGHT JOIN : 能强制按照顺序关联表(应该是)
随机推荐
- HAProxy详细中文用法详解
一.HAProxy简介 (1)HAProxy 是一款提供高可用性.负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费.快速并且可靠的一种解决方案. HAProx ...
- 装mongondb数据库
装mongondb数据库装好以后进入c盘mongondb bin里边 复制地址 将其放入环境变量里边 放之前需要往前边加一个英语的;在 d盘 建一个data文档 里边简历一个db文件夹 cmd命令框输 ...
- 京东购物车的 Java 架构实现及原理!
今天来写一下关于购物车的东西, 这里首先抛出四个问题: 1)用户没登陆用户名和密码,添加商品, 关闭浏览器再打开后 不登录用户名和密码 问:购物车商品还在吗? 2)用户登陆了用户名密码,添加商品,关闭 ...
- 【翻译】Neural Collaborative Filtering--神经协同过滤
[说明] 本文翻译自新加坡国立大学何向南博士 et al.发布在<World Wide Web>(2017)上的一篇论文<Neural Collaborative Filtering ...
- 小奶狗给小喵咪上CSS课程
小奶狗给小喵咪上CSS课程 小奶狗,你好啊? 小喵咪你好~ 听说学习HTML,要学习CSS是吗? 是的,小甜心~ 那么CSS是什么呢? CSS是Cascading Style Sheet英文的缩写,中 ...
- 一个需求认识CSS3 的transform-origin属性
最近遇到一个需求,是以前做PHP的同事问我的问题 下面是他在百度发的问题截图 根据上面的截图,我稍微梳理了一下 问题:现在有个div,旋转45度后,这个div的宽度会动态改变,并且要向右上方偏移 ...
- 配置MapReduce时遇到的问题记录
1.左边栏的Project Explorer里一直不出现DFS Locations. 发现在把hadoop-eclipse-plugin-2.6.0.jar放到eclipse下的pluins文件夹下并 ...
- Xamarin.Android 启动页
打开软件的时候相当慢,会有白屏显示,这样的用户体验效果不好,所以需要增加一个启动页来过渡.步骤如下: 第一步:根据自己需求找到一个png图片,用于启动展示,放在Drawable 文件夹下,我这里命名为 ...
- 全网最详细的Centos7系统里安装Openresty(图文详解)
不多说,直接上干货! 介绍: Nginx 采用一个 master 进程管理多个 worker 进程(master-worker)模式,基本的事件处理都在 woker 中,master 负责一些全局初始 ...
- centos7安装遇到的坑
1.安装中遇到what is the location of the gcc program on your machine 直接输入 no.意思就是跳过gcc的安装了.但是系统虽然安装了vmware ...