链表查询

JOIN

例子:

(1)创建school数据库

CREATE DATABASE IF NOT EXISTS `school`;
-- 创建一个school数据库
USE `school`;-- 创建学生表
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`(`studentno` INT(4) NOT NULL COMMENT '学号',`loginpwd` VARCHAR(20) DEFAULT NULL,`studentname` VARCHAR(20) DEFAULT NULL COMMENT '学生姓名',`sex` TINYINT(1) DEFAULT NULL COMMENT '性别,0或1',`gradeid` INT(11) DEFAULT NULL COMMENT '年级编号',`phone` VARCHAR(50) NOT NULL COMMENT '联系电话,允许为空',`address` VARCHAR(255) NOT NULL COMMENT '地址,允许为空',`borndate` DATETIME DEFAULT NULL COMMENT '出生时间',`email` VARCHAR (50) NOT NULL COMMENT '邮箱账号允许为空',`identitycard` VARCHAR(18) DEFAULT NULL COMMENT '身份证号',PRIMARY KEY (`studentno`),UNIQUE KEY `identitycard`(`identitycard`),KEY `email` (`email`)
)ENGINE=MYISAM DEFAULT CHARSET=utf8;-- 创建年级表
DROP TABLE IF EXISTS `grade`;
CREATE TABLE `grade`(`gradeid` INT(11) NOT NULL AUTO_INCREMENT COMMENT '年级编号',`gradename` VARCHAR(50) NOT NULL COMMENT '年级名称',PRIMARY KEY (`gradeid`)
) ENGINE=INNODB AUTO_INCREMENT = 6 DEFAULT CHARSET = utf8;-- 创建科目表
DROP TABLE IF EXISTS `subject`;
CREATE TABLE `subject`(`subjectno`INT(11) NOT NULL AUTO_INCREMENT COMMENT '课程编号',`subjectname` VARCHAR(50) DEFAULT NULL COMMENT '课程名称',`classhour` INT(4) DEFAULT NULL COMMENT '学时',`gradeid` INT(4) DEFAULT NULL COMMENT '年级编号',PRIMARY KEY (`subjectno`)
)ENGINE = INNODB AUTO_INCREMENT = 19 DEFAULT CHARSET = utf8;-- 创建成绩表
DROP TABLE IF EXISTS `result`;
CREATE TABLE `result`(`studentno` INT(4) NOT NULL COMMENT '学号',`subjectno` INT(4) NOT NULL COMMENT '课程编号',`examdate` DATETIME NOT NULL COMMENT '考试日期',`studentresult` INT (4) NOT NULL COMMENT '考试成绩',KEY `subjectno` (`subjectno`)
)ENGINE = INNODB DEFAULT CHARSET = utf8;

输出结果:

student

result

(2)查询参加了考试的同学(学号,姓名,科目编号,分数)

-- ======= 联表查询 join ==============
-- 查询参加了考试的同学(学号,姓名,科目编号,分数)
SELECT * FROM student
SELECT * FROM result

思路:
1、分析需求,分析查询的字段来自哪些表,(连接查询)
2、确定使用哪种连接查询?--------------------------- 7种

  • 确定交叉点(这两个表中哪个数据是相同的)

  • 判断的条件:学生表中的 studentNo = 成绩表 studentNo

  • join(判断条件) on(连接的表) 连接查询

  •  where 等值查询

  • as是可以省略的,使用ON和where都是一样的

INNER JOIN(内连接)

-- INNER JOIN
SELECT s.studentno,studentname,subjectno,studentresult
FROM student AS s
INNER JOIN result AS r
WHERE s.studentno = r.studentno

输出结果:

RIGHT JOIN(右连接)

-- RIGHT JOIN
SELECT s.studentno,studentname,subjectno,studentresult
FROM student AS s
RIGHT JOIN result AS r
ON s.studentno = r.studentno

输出结果:

left JOIN(左链接)

-- left JOIN
SELECT s.studentno,studentname,subjectno,studentresult
FROM student AS s
LEFT JOIN result AS r
ON s.studentno = r.studentno

输出结果:

(3)查询缺考的同学

-- 查询缺考的同学
SELECT s.studentno,studentname,subjectno,studentresult
FROM student AS s
LEFT JOIN result AS r
ON s.studentno = r.studentno
WHERE studentresult IS NULL

思考题(查询了参加考试的同学信息:学号,学生姓名,科目名,分数)

  1. 分析需求,分析查询的字段来自哪些表,student、result、subject(连接查询)
  2. 确定使用哪种连接查询? 7种
  3. 确定交叉点(这两个表中哪个数据是相同的)
  4. 判断的条件:学生表中的 studentNo = 成绩表 studentNo
  5. s.后面不能加`` 其他的都可以加``
-- s.后面不能加`` 其他的都可以加``SELECT s.studentno,`studentname`,`subjectname`,`studentresult`
FROM `student` AS s
RIGHT JOIN `result` AS r
ON r.studentno = s.studentno
INNER JOIN `subject` AS sub
ON r.subjectno = sub.subjectno

输出结果:

操作 描述
Inner join 如果表中至少有一个匹配,就返回行
left join 会从左表中返回所有的值,即使右表中没有匹配
right join 会从右表中返回所有的值,即使左表中没有匹配

总结:

  • 我要查询哪些数据 select....
  • 从那几个表中查 FROM (表 XXX) join (连接表) ON (交叉条件)
  • 假设存在一种多张表查询,慢慢来,先查询两张表然后再慢慢增加
  • FROM a left join b 这个就是把a表全部包括,再去找b中的东西,没有就是null(左连接)
  • FROM a right join b 这个就是把b表全部包括,再去找a中的东西,没有就是null(右连接)

自连接及链表查询

自连接

自己的表和自己的表连接,核心:一张表拆为两张一样的表即可

例子:

父类 

        先看pid,去找相同的pid(pid = 1),然后去列出对应的categoryid

categoryid categoryName
2 信息安全
3 软件开发
5 美术设计

子类 

pid categoryid categoryName
3 4 数据库
2 8 办公信息
3 6 web开发
5 7 ps技术

操作:查询父类对应的子类关系

        子类的pid去对应父类的categoryid

父类 子类
软件开发 数据库
信息安全 办公系统
软件开发 web开发
美术设计 ps技术
-- ==================自连接=======
CREATE TABLE `category`(
`categoryid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主题id',
`pid` INT(10) NOT NULL COMMENT '父id',
`categoryname` VARCHAR(50) NOT NULL COMMENT '主题名字',
PRIMARY KEY (`categoryid`)
)ENGINE=INNODB AUTO_INCREMENT=9 DEFAULT CHARSET = utf8;INSERT INTO `category` (`categoryid`, `pid`, `categoryname`)
VALUES ('2','1','信息技术'),
('3','1','软件开发'),
('5','1','美术设计'),
('4','3','数据库'),
('8','2','办公信息'),
('6','3','web开发'),
('7','5','ps技术');-- 查询父子信息:把一张表看成为两个一摸一样的表
SELECT a.`categoryname` AS '父栏目',b.`categoryname` AS '子栏目'
FROM `category` AS a,`category` AS b
WHERE a.`categoryid` = b.`pid`-- 查询学员所属的年级(学号,学生的姓名,年级名称)
SELECT studentno,studentname,`gradename`
FROM student AS s
INNER JOIN `grade` AS g
ON s.`gradeid` = g.`gradeid`-- 查询科目所属的年级(科目名称,年级名称)
SELECT `subjectname`,`gradename`
FROM `subject` AS sub
INNER JOIN `grade` AS g
ON sub.`gradeid` = g.`gradeid`-- 查询了参加 数据库结构-1 考试的同学信息:学号,学生姓名,科目名,分数
SELECT s.`studentno`,`studentname`,`subjectname`,`studentresult`
FROM `student` AS s
INNER JOIN `result` AS r
ON s.`studentno`=r.`studentno`
INNER JOIN `subject` AS sub
ON sub.`subjectno` = r.`subjectno`
WHERE `subjectname` = '数据结构-1'

SELECT语法

SELECT [ALL | DISTINCT]
{* | table.* | [table.field1[AS aliasl][, table.field2[AS alias2]][,.....]]}
FROM table_name [AS table_alias][LEFT | RIGHT | ineer JOIN table_name2] -- 联合查询[WHERE ....] -- 指定结果需满足的条件[GROUP by.....] -- 指定结果按照哪几个字段来分组[HAVING] -- 过滤分组的记录必须满足的次要条件[ORDER by.....] -- 指定查询记录按一次或多个条件排序[LIMIT {[OFFSET,]ROW_COUNT | row_countoffset OFFSET}]-- 指定查询的记录从哪条到哪条

注意:

  1. [ ]括号代表可选的
  2. {}括号代表必选的

联表查询JoinON详解(自连接)相关推荐

  1. MySQL联表查询【详解】

    文章目录 MySQL连接查询及原理 1.本文内容 2.准备数据 3.笛卡尔积 sql中笛卡尔积语法 4.内连接 示例1:有连接条件 示例2:无连接条件 示例3:组合条件进行查询 总结 5.外连接 左连 ...

  2. MySQL约束条件和多表查询方式详解

    一.约束 什么是约束? 简述:除了数据类型以外的约束的 为什么使用约束? 简述:为了保证数据的合法性 完整性: 二.约束分类: not null 跟整型时使用其作用是限制插入数据不能为空 create ...

  3. mysql单个查询_MySQL单表查询实例详解

    1.准备数据 以下操作将在该表中进行 create table student ( id int unsigned primary key auto_increment, name char(12) ...

  4. hibernate(七) hibernate中查询方式详解

    序言 之前对hibernate中的查询总是搞混淆,不明白里面具体有哪些东西.就是因为缺少总结.在看这篇文章之前,你应该知道的是数据库的一些查询操作,多表查询等,如果不明白,可以先去看一下 MySQL数 ...

  5. mycat的主从关系 垂直分库 水平分表 以及mycat分片联表查询的配置详解(mysql5.7系列)

    主从关系 准备三台不同ip的虚拟机 (第一批)主从关系的配置 主192.168.47.131 配置/etc/my.cnf,在[mysqld]下配置 log-error=/var/log/mysqld. ...

  6. SQL语句详解(四)——SQL联表查询

    今天我们继续给大家介绍MySQL相关知识,本文主要内容是SQL联表查询. 一.SQL联表查询简介 在前文SQL语句详解(三)--SQL子查询中,我们给大家介绍了SQL子查询的相关知识和使用示例.实际上 ...

  7. MysqlSQL语句2☞联表查询、自连接、分页和排序、子查询、常用函数、聚合函数、MD5加密

    联表查询 where等值查询 on 连接查询 1.内连接 SELECT `grade`,s.id,`name` FROM student [AS] s INNER JOIN result [AS] r ...

  8. 069:ORM查询条件详解-isnull和regex

    ORM查询条件详解-isnull和regex: isnull: 根据值是否为空进行查找.示例代码如下: articles = Article.objects.filter(create_time__i ...

  9. python动态生成数据库表_Python-Flask:动态创建表的示例详解

    今天小编从项目的实际出发,由于项目某一个表的数据达到好几十万条,此时数据的增删查改会很慢:为了增加提高访问的速度,我们引入动态创建表. 代码如下: from app_factory import ap ...

最新文章

  1. JavaScript的预编译及执行顺序
  2. python中求二维数组元素之和_乘以二维数组元素和和
  3. 【百度地图API】如何调整结果面板的样式?如何获取指定页码的结果?
  4. 分布式事务,EventBus 解决方案:CAP【中文文档】
  5. 大数据时代最值得关注的15大技术趋势
  6. 信息学奥赛一本通(1128:图像模糊处理)
  7. graph slam tutorial :从推导到应用2
  8. node.js学习笔记之写文件
  9. LeetCode-返回倒数第 k 个节点
  10. VisualStudio神级插件Resharper的基本配置和使用技巧大全+Resharper性能优化
  11. python机器学习库sklearn——DBSCAN密度聚类
  12. mongodb导入bson文件_分布式文档存储数据库之MongoDB备份与恢复
  13. JDK 14 性能提升,但 JDK 8 仍是最强王者!
  14. 操作系统概念第三章部分作业题答案
  15. 深入理解设计模式-设计模式分类与关系
  16. 极域电子教室卸载、忘记密码解决方案
  17. 阿铭Linux_网站维护学习笔记20190408
  18. 远程拨号换IP的方法
  19. 熊啸锋:在线生成个人网站,如何建立个人网站教程
  20. web移动开发总结(二)

热门文章

  1. Pycharm那些隐藏的实用小技巧
  2. hdu 4472 dp
  3. MyEclipse使用教程盘点
  4. Android Studio实现志愿者系统
  5. 2012年春节祝福短信集锦
  6. word 中插入高亮代码及转带标签的 PDF
  7. 不想上班的时候,你就想想这5个字
  8. Ubuntu息屏无法唤醒解决办法
  9. linux远程连接redis的步骤
  10. iCloud 照片windows 快速备份释放空间的方案