MySQL入门,第八部分,多表查询(一)
一、数据库脚本
#--------------------------------------------------------------------------------
#------------------------------创建数据库及写入数据------------------------------
CREATE DATABASE SCDB;
#--创建学生选课数据库
USE SCDB;
#--创建学生表Student
CREATE TABLE Student
(
Sno CHAR(10) NOT NULL PRIMARY KEY,
Sname CHAR(10) NULL,
Age INT NULL,
Sex CHAR(1),
Place CHAR(10)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
#--查看表Student详细定义
SHOW CREATE TABLE Student;
#--给学生表Student插入数据
INSERT INTO Student(Sno,Sname,Age,Sex,Place)
VALUES('02001','王明',21,'男','广东'),
('02005','黄小英',22,'女','湖北'),
('03035','张小倩',20,'女','江西'),
('03061','李刚',21,'男','湖北'),
('04009','张珊',18,'女','浙江'),
('04027','肖文',19,'男','福建');
#--创建课程表Course
CREATE TABLE Course
(
Cno CHAR(10) NOT NULL PRIMARY KEY,
Cname CHAR(10) NULL,
Credit INT NULL
)ENGINE=INNODB DEFAULT CHARSET=utf8;
#--给课程表Course插入数据
INSERT INTO Course
VALUES('C01','操作系统',3),
('C02','C语言',4),
('C03','数据结构',3),
('C04','数据库原理',2),
('C05','软件工程',2);
#--创建选修表Study
CREATE TABLE Study
(
Sno NCHAR(10) NOT NULL REFERENCES Student(Sno),
Cno NCHAR(10) NOT NULL REFERENCES Course(Cno),
Grade INT NULL,
PRIMARY KEY (Sno,Cno)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
#--给选修表Study插入数据
INSERT INTO Study(Sno,Cno,Grade)
VALUES('02001','C01',86),
('02001','C05',78),
('02005','C01',81),
('02005','C03',66),
('03035','C02',78),
('03035','C04',92),
('03061','C04',52),
('03061','C01',84),
('04009','C02',78),
('04009','C03',82),
('04027','C01',80);
二、连接查询
查询每个学生的每门课的成绩
SELECT student.sno AS 学号, sname AS 学生, cname AS 课程, grade AS 考试成绩
FROM student, study, course
WHERE student.sno = study.sno AND study.cno = course.cno
注意:
有些属性不止在一个表中出现时,前面要加上所在的表
多表关联查询时,一定要检查好查询条件,即where后面的逻辑思维
三、并操作
注意:该操作可以直接使用 OR 关键字实现
union
注意:
1.如果两个结果集的列数相同,即使字段类型不相同,也可以使用此关键字进行连接,但是强烈不推荐这样做,这样并没有任何的实际意义,因为两个结果集的属性并不相同
2.进行union连接后,结果集的属性名称以第一条结果集的属性名称为准
3.进行union连接后,结果集默认是无重复值的,如果不想重复值被覆盖,则需要使用 union all
SELECT sname
FROM student
WHERE place = '广东'
UNION
SELECT sname
FROM student
WHERE place = '湖北'
四、交操作
注意:该操作可以直接使用AND关键字实现
查询籍贯为湖北的男生的信息
SELECT * FROM
(
(
SELECT *
FROM student
WHERE place = '湖北'
)
UNION ALL
(
SELECT *
FROM student
WHERE sex = '男'
)
)
AS temp
GROUP BY sno
HAVING COUNT(*) >= 2
注意:
因为mysql中不存在 交 的关键字,因此需要借助UNION ALL和分组查询实现
五、差操作
查询年龄大于等于20岁的男生的信息
SELECT *
FROM student
WHERE age >= 20 AND sno NOT IN
(
SELECT sno
FROM student
WHERE sex = '女'
)
SELECT *
FROM student
WHERE age >= 20 AND sex <> '女'
注意:
mysql中不存在关于 差 操作的关键字,所以需要利用其它(如本方法)方法实现
MySQL入门,第八部分,多表查询(一)的更多相关文章
- MySQL入门(4)——操作数据表
MySQL入门(4)--操作数据表 创建数据库 CREATE [TEMPORARY] TABLE [IF NOT EXISTS] 数据库名 [(create_definition,...)] [tab ...
- 数据库SQL语言从入门到精通--Part 6--单表查询(快来PICK)
数据库从入门到精通合集(超详细,学习数据库必看) 查询操作是SQL语言中很重要的操作,我们今天就来详细的学习一下. 一.数据查询的语句格式 SELECT [ALL|DISTINCT] <目标列表 ...
- mysql学习(十)多表查询
多表查询时,要给表名起别名,给字段名其别名(当两个表含有重复字段时) select p.name, c.name, pid from products p, cats c;//得到的结果为笛卡尔乘积 ...
- MySql语句常用命令整理---多表查询
首先第一张表还是我们单表查询之前用到t_employee,我们在另外新建一个表t_dept(部门表)建表命令如下: drop table if exists t_dept; CREATE TABLE ...
- MYSQL 外键 on语句 多表查询
外键约束 创建外键 --- 每一个班主任会对应多个学生 , 而每个学生只能对应一个班主任 ----主表 CREATE TABLE ClassCharger( id TINYINT PRIMARY KE ...
- mysql增删改查、连表查询、常用操作
一.建表 1.最简单的建表CREATE TABLE user(id int,name char(20),age int); 2.带主键带注释和默认值创建表CREATE TABLE user(id I ...
- MySQL数据库(4)- 多表查询、可视化工具Navicat的使用、设计模式MVC
一.多表查询 准备工作:创建两张表,部门表(department).员工表(employee),代码和表格如下: # 创建表 create table department( id int, name ...
- 黑马MySQL数据库学习day03 级联 多表查询 连接和子查询 表约束
/* 存在外键的表 删表限制: 1.先删除从表,再删除主表.(不能直接删除主表,主表被从表引用,尽管实际可能还没有记录引用) 建表限制: 1.必须先建主表,再建从表(没有主表,从表无法建立外键关系) ...
- MySQL基础(三)多表查询(各种join连接详解)
Mysql 多表查询详解 一.前言 二.示例 三.注意事项 一.前言 上篇讲到Mysql中关键字执行的顺序,只涉及了一张表:实际应用大部分情况下,查询语句都会涉及到多张表格 : 1.1 多表连接有哪些 ...
- MySQL优化:如何避免回表查询?什么是索引覆盖? (转)
数据库表结构: create table user ( id int primary key, name varchar(20), sex varchar(5), index(name) )engin ...
随机推荐
- vue基础----组件通信($parent,$children)
1.按照dom的父子级关系,在子组件中可以通过$parent 直接调用父组件的方法,也可得到父组件的属性. 2.在父组件中通过$childrens可以得到一个子组件数组,能够在父组件中调用子组件的方法 ...
- treeselect 异步拿到数据后 要经过一个过滤 然后放入options 否则组件会崩溃
事件缘由:由于城市树会反复调用,所以不用api每次调用,改用数据缓存一次读取,各处使用.然后我把调用的数据放入treeselect,发现组件就崩溃了,但是api读取的数据就没问题. 查看不是props ...
- JDBC 查询 模板
JDBC 查询 与增删改不同的是SQL语句的不同,还有查询反回的是结果集 需要定义 利用 next()方法逐层查询数据 使用getXXX方法获取数据 代码相关参数根据个人设置进行修改!!!! pac ...
- rbac权限(2)
models.py from django.db import models class User(models.Model): name=models.CharField(max_length=32 ...
- React Native升级
几个月前创建了一个版本为0.60.4的项目,现要更新到最新版本0.61.4. 具体可查看 https://facebook.github.io/react-native/docs/upgrading# ...
- hashtable初步——一文初探哈希表
在<<STL源码剖析>>中,vector封装了数组的数据结构,list封装了链表的结构,而set和map封装了二叉树的数据结构.那么hashtable,具有怎么的作用呢,其本质 ...
- 浏览器与DNS解析过程
浏览器解析 1.地址栏输入地址后,浏览器检查自身DNS缓存 地址栏输入chrome://net-internals/#dns 查看. 2.浏览器缓存中未找到,那么Chrome会搜索操作系统自身的DNS ...
- 浅析jdbc建立连接方式与背后的java类加载
关于jdbc的连接方式#1Connection conn;Class.forName("com.mysql.jdbc.Driver"); //2conn=DriverManager ...
- FormDataMultiPart获取表单文件的大小
在完成springboard某个功能时遇到个问题,前端表单上传了个文件,服务端接收的是FormDataMultiPart,希望通过FormDataMultiPart拿到上传文件的size. 一开始获取 ...
- 旷视6号员工范浩强:高二开始实习,“兼职”读姚班,25岁在CVPR斩获第四个世界第一...
初来乍到,这个人说话容易让人觉得"狂". "我们将比赛结果提交上去,果不其然,是第一名的成绩."当他说出这句话的时候,表情没有一丝波澜,仿佛一切顺理成章. 他说 ...