链表查询

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. java最长同值路径_687.最长同路径值
  2. php web开发应用教程,PHP-Web 应用程序开发:使用模板_PHP
  3. swoole的process模块创建和使用子进程
  4. java硬件编程_关于JAVA并发编程你需要知道的——硬件篇
  5. 鼠标在某个控件上按下,然后离开后弹起,如何捕获这个鼠标弹起事件
  6. 浏览器同源策略,及跨域解决方案
  7. 学习笔记:自己编译安装OpenCV+测试opencv安装是否成功
  8. 区块链如何推动人力资源和薪酬管理体系变革?
  9. PCB Layout的10个细节
  10. Linux图形终端与字符终端
  11. 【题解】HNOI-2015落忆枫音
  12. 计算机指法基础知识,电脑打字基础知识及打字指法
  13. Blender程序化地形制作
  14. 怎么恢复计算机文件查看方式,win7电脑打开方式怎么还原?win7电脑还原打开方式的方法...
  15. Matlab 动画及Gif生成
  16. 线上展厅3d化宣传效果怎样 广州商迪
  17. 美元汇率Pascal题解
  18. 【附源码】计算机毕业设计java众筹平台设计与实现
  19. 基于RGB颜色空间的算法
  20. 8种适用于不同机器学习问题的常用数据集

热门文章

  1. java.lang.IllegalArgumentException: Two sibling aggregations cannot have the same name:
  2. 湖南工商大学计算机与信息学院,赵文军(湖南工商大学计信学院信管教研室副主任。)_百度百科...
  3. Android技术功底不够,面试十家九家难,面霸究竟是怎样炼成的?
  4. idea调试常用的快捷键
  5. 任务栏的小喇叭不见了怎么办?
  6. 课程总结一:计算机基础
  7. Tomcat调优教程
  8. 分数线计算机怎么打,分数线怎么打
  9. 找不到女朋友,以下这些你可以参考。
  10. matlab选主频还是线程,从频率的角度来谈谈CPU该怎么选才对?