当前位置: 首页 > news >正文

做什么类型网站可以吸引用户长沙专业的网站建设企业

做什么类型网站可以吸引用户,长沙专业的网站建设企业,做这种灰色的网站犯法,营销成功案例分享及感悟前文我们了解到了数据库设计的范式要求,故生活中很多相互关联的数据被拆分开来,但彼此之间通过某种条件链接,此文联合查询就是通过多表之间的连接关系,来查询我们想要的数据,即 《联合查询》 1. 联合查询简介 1.1 为什…

前文我们了解到了数据库设计的范式要求,故生活中很多相互关联的数据被拆分开来,但彼此之间通过某种条件链接,此文联合查询就是通过多表之间的连接关系,来查询我们想要的数据,即 《联合查询》

1. 联合查询简介

1.1 为什么要使用联合查询

在数据设计时由于范式的要求,数据被拆分到多个表中,那么要查询⼀个条数据的完整信息,就要从多个表中获取数据,如下图所⽰:要获取学⽣的基本信息和班级信息就要从学⽣表和班级表中获取,这时就需要使⽤联合查询,这⾥的联合指的是多个表的组合。

在这里插入图片描述

1.2 多表联合查询时MYSQL内部是如何进行计算的

首先我们创建两个表,用于我们探讨问题

# 创建学生表
create table student (
id bigint,
name varchar(20),
sex char,
class_id bigint
);
insert into student  value (1,'张三','男',1),(2,'李四','女',1),(3,'王五','男',2);#创建班级表
create table class (
id bigint,
name varchar(20)
);
insert into class  value (1,'Java'),(2,'C++'),(3,'Python');
  1. 参与查询的所有表取笛卡尔积,结果集在临时表中
    在这里插入图片描述
  2. 观察哪些记录是有效数据,根据两个表的关联关系过滤掉无效数据在这里插入图片描述

如果联合查询表的个数越多,表中的数据量越大,临时表就会越大,所以建议根据实际情况确定联合查询表的个数

1.3 一个完整的联合查询过程

首先我们创建多个表,用于探讨联合查询过程

#课程表
create table course(
id bigint PRIMARY KEY auto_increment,
name varchar(10)
);
insert into course (name) values ('Java'), ('C++'), ('MySQL'), ('操作系统'), ('计算机⽹络'), ('数据结构');# 班级表
create table class (
id bigint,
name varchar(20)
);
insert into class  value (1,'软件1班'),(2,'软件2班'),(3,'软件3班');#学生表
create table student (
name varchar(20),
sno varchar(10),
age int,
gender boolean,
enroll_date date,
class_id bigint
);
insert into student (name, sno, age, gender, enroll_date, class_id) values
('唐三藏', '100001', 18, 1, '1986-09-01', 1),
('孙悟空', '100002', 18, 1, '1986-09-01', 1),
('猪悟能', '100003', 18, 1, '1986-09-01', 1),
('沙悟净', '100004', 18, 1, '1986-09-01', 1),
('宋江', '200001', 18, 1, '2000-09-01', 2),
('武松', '200002', 18, 1, '2000-09-01', 2),
('李逹', '200003', 18, 1, '2000-09-01', 2),
('不想毕业', '200004', 18, 1, '2000-09-01', 2);#成绩表
create table score (
score double,
student_id varchar(10),
course_id bigint
);
insert into score (score, student_id, course_id) values
(70.5, 1, 1),(98.5, 1, 3),(33, 1, 5),(98, 1, 6),
(60, 2, 1),(59.5, 2, 5),
(33, 3, 1),(68, 3, 3),(99, 3, 5),
(67, 4, 1),(23, 4, 3),(56, 4, 5),(72, 4, 6),
(81, 5, 1),(37, 5, 5),
(56, 6, 2),(43, 6, 4),(79, 6, 6),
(80, 7, 2),(92, 7, 6);

1.3.1 查询学生姓名为孙悟空的详细信息,包括学生个人信息和班级信息

  1. 确定参与查询的表,为学⽣表和班级表
# 在from后同时写所有参与查询的表,并⽤逗号隔开
select * from student , class ;

在这里插入图片描述

  1. 确定连接条件,student表中的class_id与class表中id列的值相等
 #在where⼦句中加⼊连接条件select * from student , class where student.class_id=class.id;

在这里插入图片描述

  1. 加⼊查询条件

我们发现直接查询name时,导致MySQL不清楚到底是student的name还是class的name,此时我们要明确指定

在这里插入图片描述

# 明确指定——》这时可以⽤“表名.列号”的⽅式指定具体的列
select * from student , class where student.class_id=class.id and student.name ='孙悟空';

在这里插入图片描述

  1. 精减查询结果字段
select student.sno,student.name,student.age,class.name 
from student,class 
where student.class_id=class.id and student.name='孙悟空';

在这里插入图片描述

  1. 可以为表名指定别名
select s.sno,s.name,s.age,c.name 
from student s,class c 
where s.class_id=c.id and s.name='孙悟空';

在这里插入图片描述

2. 内连接

2.1 语法

# 1
select 字段 from1 别名1,2 别名2 where 连接条件 and 其他条件;
# 2
select 字段 from1 别名1 [inner] join2 别名2 on 连接条件 where 其他条件;

2.2 示例

  1. 查询"唐三藏"同学的成绩
select s.name, sc.score from student s join score sc on sc.student_id = s.sno where s.name = '唐三藏';

在这里插入图片描述

  1. 查询所有同学的总成绩,及同学的个人信息
# 内连接语法格式 1 
select s.* ,sum(sc.score) from student s,score sc where s.id=sc.student_id group by s.id;# 内连接语法格式 2
select s.* ,sum(sc.score) from student s join score sc on s.id=sc.student_id group by s.id;

在这里插入图片描述

  1. 查询所有同学每⻔课的成绩,及同学的个⼈信息
select s.* , sc.score,c.name from student s , score sc ,course c 
where s.id=sc.student_id and sc.course_id=c.id;

在这里插入图片描述

3. 外连接

  • 外连接分为左外连接右外连接和全外连接三种类型,MySQL不支持全外连接
  • 左外连接返回左表的所有记录和右表中匹配的记录。如果右表中没有匹配的记录,则结果集中对应字段会显⽰为NULL
  • 右外连接与左外连接相反,返回右表的所有记录和左表中匹配的记录。如果左表中没有匹配的记录,则结果集中对应字段会显示为NULL
    (MySQL中无论左外连接还是右外连接,实质都是先左外连接)
  • 全外连接:结合了左外连接和右外连接的特点,返回左右表中的所有记录。如果某一边表中没有匹 配的记录,则结果集中对应字段会显示为NULL

3.1 语法

-- 左外连接,表1完全显⽰
select 字段名 from 表名1 left join 表名2 on 连接条件;
-- 右外连接,表2完全显⽰
select 字段名 from 表名1 right join 表名2 on 连接条件;

3.2 示例

  1. 查询没有参加考试的同学信息
# 左连接以JOIN左边的表为基准,左表显示全部记录,右表中没有匹配的记录NULL填充
select s.id,s.name,s.sno,s.age,sc.* from 
student s left join score sc on s.id=sc.student_id 
where sc.score is null;

在这里插入图片描述

  1. 查询没有学⽣的班级
# 查询没有学生的班级
select c.*,s.id,s.name,s.age from  
student s right join class c  on s.class_id=c.id 
where s.id is null;

在这里插入图片描述

4. 自连接

4.1 应用场景

==自连接是自己与自己取笛卡尔积,可以把行转化成列,在查询的时候可以使⽤where条件对结果进行过滤,或者说实现行与行之间的⽐较,在做表连接时为表起不同的别名。

 # 不为表指定别名select * from score,score;

在这里插入图片描述

# 指定别名
select * from score s1, score s2;

在这里插入图片描述

4.2 示例

  1. 显示所有"MySQL"成绩比"JAVA"成绩高的成绩信息
select s1.* from score s1, score s2, 
course c1,course c2
# 首先自连接中学生id要一样确保是同一个学生
where s1.student_id = s2.student_id 
# MySQL课程
and s1.course_id = c1.id  
# Java 课程
and s2.course_id = c2.id 
# MySQL成绩大于Java成绩
and s1.score > s2.score
# 指定c1是MySQL,c2是Java
and c1.`name` = 'MySQL'
and c2.`name` = 'Java';

在这里插入图片描述

  1. 显⽰所有"MySQL"成绩比"JAVA"成绩⾼的学生信息和班级以及成绩信息
# 显示所有"MySQL"成绩比"JAVA"成绩高的成绩信息
select s1.* ,student.name,class.name from score s1, score s2, 
course c1,course c2 ,student,class
# 首先自连接中学生id要一样确保是同一个学生
where s1.student_id = s2.student_id 
# MySQL课程
and s1.course_id = c1.id  
# Java 课程
and s2.course_id = c2.id 
# MySQL成绩大于Java成绩
and s1.score > s2.score
# 指定c1是MySQL,c2是Java
and c1.`name` = 'MySQL'
and c2.`name` = 'Java'
# 学生的id对应相应的课程
and student.id=s1.student_id
# 学生的id对应相应的班级
and student.class_id=class.id;

在这里插入图片描述

5.子查询

子查询是把⼀个SELECT语句的结果当做别⼀个SELECT语句的条件,也叫嵌套查询

5.1 语法

 select * from table1 where col_name1 {= | IN} (select col_name1  from table2 where col_name2 {= | IN} [(select ...)] ... )

5.2 单行子查询

嵌套的查询中只返回⼀行数据

  • 示例:查询与"不想毕业"同学的同班同学
select * from student where class_id = (select class_id from student 
where name = '不想毕业');

在这里插入图片描述

5.3 多行子查询

嵌套的查询中返回多⾏数据,使⽤[NOT]IN关键字

  • 示例:查询"MySQL"或"Java"课程的成绩信息
 select * from score where course_id in (select id from course where name = 'Java' or name = 'MySQL');

在这里插入图片描述

6.合并查询

在实际应⽤中,为了合并多个select操作返回的结果,可以使⽤集合操作符unionunion all

6.1 创建新表并初始化数据

# 创建⼀个新表并初始化数据create table student1 like student;# 插入测试数据insert into student1 (name, sno, age, gender, enroll_date, class_id) values 
('唐三藏', '100001', 18, 1, '1986-09-01', 1),
('刘备', '300001', 18, 1, '1993-09-01', 3),
('张⻜', '300002', 18, 1, '1993-09-01', 3),
('关⽻', '300003', 18, 1, '1993-09-01', 3);

6.2 Union

该操作符⽤于取得两个结果集的并集。当使⽤该操作符时,会⾃动去掉结果集中的重复⾏。

  • ⽰例:查询student表中id<3的同学和student1表中的所有同学
select * from student where id < 3 union select * from student1;

在这里插入图片描述

6.3 Union all

该操作符⽤于取得两个结果集的并集。当使⽤该操作符时,不会去掉结果集中的重复⾏。

select * from student where id < 3 union all select * from student1;

在这里插入图片描述

7.插入查询

7.1 语法

INSERT INTO table_name [(column [, column ...])] SELECT ...

7.2 示例

  • 将student表中软件1班的学生复制到student1表中
# 插入查询结果
insert into student1 (name, sno, age, gender, enroll_date, class_id)
select s.name, s.sno, s.age, s.gender, s.enroll_date, s.class_id
from student s, class c where s.class_id = c.id and c.name = '软件1班';
# 验证是否查询结果插入成功
select * from student1;

在这里插入图片描述

http://www.sczhlp.com/news/104916/

相关文章:

  • 网站建设推广seo有什么网站可以做微信支付宝支付宝
  • 注册餐饮公司流程和费用怎么给一个网站做seo
  • 做网站什么样的域名好wordpress表白墙模板
  • 闵行网站建设公司西安百度推广网站建设
  • 推荐网站建设公司wordpress 5编辑器使用
  • 搜狗搜索网站提交入口中国中小企业服务网
  • 网站的用户体验主要有那些类型wordpress模板mip
  • 做调研有哪些网站刚做的网站适合做外链吗
  • ps做产品的网站公司起名字推荐
  • 网站备案信息如何注销竞价推广平台
  • 免费制作永久网站chromeseo是什么
  • memcached wordpress 慢 卡搜索引擎优化面对哪些困境
  • 移动网站开发培训卖东西的网站模板免费下载
  • 一个com的网站多少钱品牌vi设计公司企业
  • 校园网站建设检查自评报告网站正在建设中空白模板
  • 网站设计需要的元素wordpress评论框中加文字提示
  • 网站建设合同应注意什么网上购物哪个平台质量好又便宜
  • 邢台移动网站建设企业策划书格式及范文
  • 昆明市建设厅网站什么类型的网站开发比较困难
  • 网站是asp还是phpapp成本
  • 吉林省舒兰市建设银行网站企业网站建设合同书盖章页
  • 房屋设计网站推荐网站引导页下载
  • 淘客商品网站怎么做的北京最大的互联网公司
  • 做网站的目标网站建设具体实施方案
  • 登不上建设银行网站php网站开发软件是什么
  • 做网站含备案费么企业营销型网站建设公司
  • 建设网站需要多少钱济南兴田德润o厉害吗中国万网域名登录
  • 浙江创新网站建设销售淘宝网站怎么做的
  • 网站如何绑定二级域名app代码开发流程图
  • 网站ipv6建设丹灶网站建设公司