-
一条SQL语句查询多个数据库
2020-09-09 10:31:43最近做项目遇到这样的需求,要求一条SQL语句从多个数据库查询出相关联的结果,输出到客户端,怎么解决呢?下面小编给大家介绍下,一起看看吧 -
SQL查询安全性及性能优化
2012-03-07 20:51:39检测SQL查询的效率 语法【对IO和Time对SQL执行进行统计】: SET STATISTICS IO ON SET STATISTICS TIME ON ------------SQL代码--------- SET STATISTICS IO OFF SET STATISTICS TIME OFF 注意:在检测之前... -
sql join中能否使用case when_SQL从0到1:多表查询
2020-11-29 16:11:37本次内容包括:表的加法表的联结联结应用案例case表达式一、表的加法 union表的加法是指将两个表(相同列数、相同数据类型)中的数据汇总在一起。举例:现在有两张表:course、course1course表course1SELECT 课程号,...本次内容包括:
- 表的加法
- 表的联结
- 联结应用案例
- case表达式
一、表的加法 union
表的加法是指将两个表(相同列数、相同数据类型)中的数据汇总在一起。
举例:现在有两张表:course、course1
course表 course1 SELECT 课程号,课程名称 from course union SELECT 课程号,课程名称 from course1
输出结果 使用union时,两张表中重复的行会只记为一行;如果需要保留重复行,可以使用union all
SELECT 课程号,课程名称 from course union all SELECT 课程号,课程名称 from course1
输出结果 二、表的联结 join
(1)交叉联结(笛卡尔积)
指将表1中的每一行与表2中的每行进行合并,因此合并后得到的行数是两张表行数的乘积。
例子:扑克牌13个牌号和4种花色的交叉联结
交叉联结在实际应用中比较少,因为结果行数较多,运算量比较大,实际使用价值也不大
(2)内联结 inner join
内联结用于查找出同时存在于两张表中的数据。
图示 例子:已有表格student1和score1
student1 score1 两张表相同的字段是“学号”,通过这个可以将两个表进行内联结。
select a.学号,a.姓名,b.课程号,b.成绩 from student1 as a inner join score1 as b on a.学号=b.学号 -- 标示出两个表示通过“学号”这个字段连接起来的
(3)左联结 left join
左联结可将from子句左侧的表中的数据全部取出来,与右边进行匹配,若右表无匹配项,则其值为空值Null。
图示 select a.学号,a.姓名,b.课程号,b.成绩 from student1 as a inner join score1 as b on a.学号=b.学号
如果两个表的数据有部分重叠,但是只取出左表独有的部分,可以再加一个子句对SQL进行限定。
图示 select a.学号,a.姓名,b.课程号 from student1 as a left join score1 as b on a.学号=b.学号 where b.学号 is Null
(4)右联结 right join
右联结可将from子句右侧的表中的数据全部取出来,与左边进行匹配,若左表无匹配项,则其值为空值Null。
select a.学号,a.姓名,b.课程号,b.成绩 from student1 as a right join score1 as b on a.学号=b.学号
如果两个表的数据有部分重叠,但是只取出右表独有的部分,可以再加一个子句对SQL进行限定。
select a.学号,a.姓名,b.课程号,b.成绩 from student1 as a right join score1 as b on a.学号=b.学号 WHERE a.学号 is null
(5)全联结 full join
全联结会返回左表和右表中的所有行,如果两个表之间有匹配,则进行合并;否则无匹配部分用空值表示。
需要注意的是,mysql是不支持全联结的,了解这个概念即可。
联结的所有情况用下图进行总结:
三、联结应用案例
问题1:查询所有学生的学号、姓名、选课数、总成绩
select a.学号,a.姓名,count(b.课程号) as 选课数,sum(b.成绩) as 总成绩 from student1 as a left join score1 as b on a.学号=b.学号 group by 学号
问题2:查询平均成绩大于85的所有学生的学号,姓名和平均成绩
SELECT a.学号,a.姓名,avg(b.成绩) as 平均成绩 from student1 as a left join score1 as b on a.学号=b.学号 GROUP BY 学号 having avg(b.成绩)>85
问题3:查询学生的选课情况,信息包括:学号,姓名,课程号,课程名称
此题涉及三个表的联结,用到两个inner join,注意句子的书写格式
select a.学号,a.姓名,b.课程号,c.课程名称 from student as a inner join score as b on a.学号=b.学号 inner join course as c on b.课程号=c.课程号
四、case表达式
作用相当于一个条件判断的函数,用于判断每一行是否满足某一条件;如何满足则继续运行then子句,运行完后结束。如果未满足条件,则继续运行,直至找到满足条件的语句或者最终结束。
当要用到条件判断时,需要用到case表达式。
注:
(1)else 子句可以省略不写, 但为了书写规范,尽量要写。
(2)最后的end不能省略。
(3)case表达式除了可以放在select子句中,还可以放在SQL的任意子句里面
实例1:对成绩表中的学生成绩进行及格或不及格的判断
-- 规范写法:case子句其实是select子句的一部分,因此不能忽略其前面的逗号 SELECT 学号,课程号,成绩, (case when 成绩>=60 then '及格' when 成绩<60 then '不及格' else null end) as 是否及格 from score
实例2:查询出每门课程的及格人数和不及格人数
select 课程号, sum(case when 成绩>=60 then 1 else 0 end) as 及格人数, sum(case when 成绩<60 then 1 else 0 end) as 不及格人数 from score GROUP BY 课程号;
实例3:使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计:各分段人数,课程号和课程名称
select a.课程号,b.课程名称, sum(case when a.成绩 BETWEEN 85 and 100 then 1 else 0 end) as '[100-85]', sum(case when a.成绩<85 and a.成绩>=70 then 1 else 0 end) as '[85-70]', sum(case when a.成绩<70 and a.成绩>=60 then 1 else 0 end) as '[70-60]', sum(case when a.成绩<60 then 1 else 0 end) as '[<60]' from score as a RIGHT JOIN course as b on a.课程号=b.课程号 GROUP BY a.课程号,b.课程名称 -- 当使用多个列来分组时,这几个列的值完全相同时才算作一组 -- 此题需注意在[100-85]这样的字段两端加上单引号,使之成为字符串,否则运行错误
课后练习:
来自SQLZOO网站的JOIN部分。
注:本题只需查出球员名称,因此需要用distinct对重复进球的球员去重
-
MySql基本查询、连接查询、子查询、正则表达查询讲解
2017-08-24 18:38:30having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。 having 子句被限制子已经在SELECT语句中定义的列和聚合... -
深入解析SQL Server 2008(微软SQL Server开发团队必读之作)--随书源代码
2013-02-06 14:13:17处理多个并发用户时,如何在5个隔离级别和2个并发模型中做出选择 作译者 Kalen Delanev自1993年起就是微软SQL Server的MVP,她为全世界的客户提供高级SQL Server培训、她是《SQL Server Magazine》的特约编辑... -
SQL Server 2008实战(SQL Server程序员和DBA不可或缺的权威参考手册)--详细书签版
2013-02-06 11:52:191.8 从多个数据源查询 24 1.8.1 使用内联结 25 1.8.2 使用外联结 26 1.8.3 使用交叉联结 27 1.8.4 在同一查询中多次引用同一个表 27 1.8.5 使用衍生表 28 1.8.6 使用UNION组合结果集 29 1.9 使用... -
深入解析SQL SERVER 2008(附源代码)
2014-10-20 09:50:20处理多个并发用户时,如何在5个隔离级别和2个并发模型中做出选择 作译者 Kalen Delanev自1993年起就是微软SQL Server的MVP,她为全世界的客户提供高级SQL Server培训、她是《SQL Server Magazine》的特约编辑... -
sql查询null时为0_SQL从0到1:多表查询
2021-01-25 13:14:59本次内容包括:表的加法表的联结联结应用案例case表达式一、表的加法 union表的加法是指将两个表(相同列数、相同数据类型)中的数据汇总在一起。举例:现在有两张表:course、course1course表course1SELECT 课程号,...本次内容包括:
- 表的加法
- 表的联结
- 联结应用案例
- case表达式
一、表的加法 union
表的加法是指将两个表(相同列数、相同数据类型)中的数据汇总在一起。
举例:现在有两张表:course、course1
course表 course1 SELECT 课程号,课程名称 from course union SELECT 课程号,课程名称 from course1
输出结果 使用union时,两张表中重复的行会只记为一行;如果需要保留重复行,可以使用union all
SELECT 课程号,课程名称 from course union all SELECT 课程号,课程名称 from course1
输出结果 二、表的联结 join
(1)交叉联结(笛卡尔积)
指将表1中的每一行与表2中的每行进行合并,因此合并后得到的行数是两张表行数的乘积。
例子:扑克牌13个牌号和4种花色的交叉联结
交叉联结在实际应用中比较少,因为结果行数较多,运算量比较大,实际使用价值也不大
(2)内联结 inner join
内联结用于查找出同时存在于两张表中的数据。
图示 例子:已有表格student1和score1
student1 score1 两张表相同的字段是“学号”,通过这个可以将两个表进行内联结。
select a.学号,a.姓名,b.课程号,b.成绩 from student1 as a inner join score1 as b on a.学号=b.学号 -- 标示出两个表示通过“学号”这个字段连接起来的
(3)左联结 left join
左联结可将from子句左侧的表中的数据全部取出来,与右边进行匹配,若右表无匹配项,则其值为空值Null。
图示 select a.学号,a.姓名,b.课程号,b.成绩 from student1 as a inner join score1 as b on a.学号=b.学号
如果两个表的数据有部分重叠,但是只取出左表独有的部分,可以再加一个子句对SQL进行限定。
图示 select a.学号,a.姓名,b.课程号 from student1 as a left join score1 as b on a.学号=b.学号 where b.学号 is Null
(4)右联结 right join
右联结可将from子句右侧的表中的数据全部取出来,与左边进行匹配,若左表无匹配项,则其值为空值Null。
select a.学号,a.姓名,b.课程号,b.成绩 from student1 as a right join score1 as b on a.学号=b.学号
如果两个表的数据有部分重叠,但是只取出右表独有的部分,可以再加一个子句对SQL进行限定。
select a.学号,a.姓名,b.课程号,b.成绩 from student1 as a right join score1 as b on a.学号=b.学号 WHERE a.学号 is null
(5)全联结 full join
全联结会返回左表和右表中的所有行,如果两个表之间有匹配,则进行合并;否则无匹配部分用空值表示。
需要注意的是,mysql是不支持全联结的,了解这个概念即可。
联结的所有情况用下图进行总结:
三、联结应用案例
问题1:查询所有学生的学号、姓名、选课数、总成绩
select a.学号,a.姓名,count(b.课程号) as 选课数,sum(b.成绩) as 总成绩 from student1 as a left join score1 as b on a.学号=b.学号 group by 学号
问题2:查询平均成绩大于85的所有学生的学号,姓名和平均成绩
SELECT a.学号,a.姓名,avg(b.成绩) as 平均成绩 from student1 as a left join score1 as b on a.学号=b.学号 GROUP BY 学号 having avg(b.成绩)>85
问题3:查询学生的选课情况,信息包括:学号,姓名,课程号,课程名称
此题涉及三个表的联结,用到两个inner join,注意句子的书写格式
select a.学号,a.姓名,b.课程号,c.课程名称 from student as a inner join score as b on a.学号=b.学号 inner join course as c on b.课程号=c.课程号
四、case表达式
作用相当于一个条件判断的函数,用于判断每一行是否满足某一条件;如何满足则继续运行then子句,运行完后结束。如果未满足条件,则继续运行,直至找到满足条件的语句或者最终结束。
当要用到条件判断时,需要用到case表达式。
注:
(1)else 子句可以省略不写, 但为了书写规范,尽量要写。
(2)最后的end不能省略。
(3)case表达式除了可以放在select子句中,还可以放在SQL的任意子句里面
实例1:对成绩表中的学生成绩进行及格或不及格的判断
-- 规范写法:case子句其实是select子句的一部分,因此不能忽略其前面的逗号 SELECT 学号,课程号,成绩, (case when 成绩>=60 then '及格' when 成绩<60 then '不及格' else null end) as 是否及格 from score
实例2:查询出每门课程的及格人数和不及格人数
select 课程号, sum(case when 成绩>=60 then 1 else 0 end) as 及格人数, sum(case when 成绩<60 then 1 else 0 end) as 不及格人数 from score GROUP BY 课程号;
实例3:使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计:各分段人数,课程号和课程名称
select a.课程号,b.课程名称, sum(case when a.成绩 BETWEEN 85 and 100 then 1 else 0 end) as '[100-85]', sum(case when a.成绩<85 and a.成绩>=70 then 1 else 0 end) as '[85-70]', sum(case when a.成绩<70 and a.成绩>=60 then 1 else 0 end) as '[70-60]', sum(case when a.成绩<60 then 1 else 0 end) as '[<60]' from score as a RIGHT JOIN course as b on a.课程号=b.课程号 GROUP BY a.课程号,b.课程名称 -- 当使用多个列来分组时,这几个列的值完全相同时才算作一组 -- 此题需注意在[100-85]这样的字段两端加上单引号,使之成为字符串,否则运行错误
课后练习:
来自SQLZOO网站的JOIN部分。
注:本题只需查出球员名称,因此需要用distinct对重复进球的球员去重
-
PHP网站语句如何优化,希望和高手一起探讨下
2019-06-16 05:05:46我的网站是PHP网站,使用的数据库是MySQL 的目前直接用网上的采集插件出现了很多慢查询和扫全表的动作,自己也在对应的表里建立了普通索引,但还是无法得到解决,一直报错在SQL语句里,对于这块本人学习尚浅。... -
Visual Basic开发实战1200例(第2卷)(完整版).(清华出版.孙秀梅.巩建华).part1
2016-06-15 00:31:36第3章 SQL查询与对象的应用 80 3.1 SELECT子句的使用 81 实例037 查询特定列数据 81 实例038 在查询时使用列别名 83 实例039 对列进行计算 85 实例040 使用函数设置条件 87 3.2 查询常量 88 实例041 数值型... -
Visual Basic开发实战1200例(第2卷)(完整版).(清华出版.孙秀梅.巩建华).part2
2016-06-15 00:34:01第3章 SQL查询与对象的应用 80 3.1 SELECT子句的使用 81 实例037 查询特定列数据 81 实例038 在查询时使用列别名 83 实例039 对列进行计算 85 实例040 使用函数设置条件 87 3.2 查询常量 88 实例041 数值型... -
韩顺平oracle学习笔记
2018-07-08 00:16:48可以多个同时授权:grant connect,resource to lady; 注意授权用户级别应该为(dba以上sys/system) 还可以使用PL/SQL工具创建:文件->新建->用户 现在我要把scott用户里面的emp表的权限赋给lady用户但lady只能有对... -
Sql查询 - step 5 : 输出表(Output table)结果发送到外部系统 代码案例:// TODO 等待更新中…... 2、常用特性 累加器 Flink中累加器(Accumulators)是非常的简单,通过一个add操作累加最终的结果,在job执行后...
-
jdbc连接数据库的方式2
2009-08-01 14:31:23完成这些工作的最好的方法是创建一个完成替换操作的helper方法,然后在连接字符串心服用公式表达一个SQL命令时,使用创建的helper方法。与此类似的是,我们可以让helper方法接受一个Date型的值,然后让它输出基于... -
Access 2000数据库系统设计(PDF)---001
2006-02-23 15:31:0421510.2.1 创建传统的单列等值连接 21610.2.2 为查询结果集指定排序次序 21810.2.3 使用表之间的间接关系创建查询 21910.2.4 创建多列等值连接和选择 唯一值 22010.3 使用表中的查找字段 22210.3.1 用查阅向导添加... -
Access 2000数据库系统设计(PDF)---031
2006-02-23 15:31:0421510.2.1 创建传统的单列等值连接 21610.2.2 为查询结果集指定排序次序 21810.2.3 使用表之间的间接关系创建查询 21910.2.4 创建多列等值连接和选择唯一值 22010.3 使用表中的查找字段 22210.3.1 用查阅向导添加... -
Access 2000数据库系统设计(PDF)---016
2006-02-23 15:31:0421510.2.1 创建传统的单列等值连接 21610.2.2 为查询结果集指定排序次序 21810.2.3 使用表之间的间接关系创建查询 21910.2.4 创建多列等值连接和选择唯一值 22010.3 使用表中的查找字段 22210.3.1 用查阅向导添加... -
Access 2000数据库系统设计(PDF)---011
2006-02-23 15:31:0421510.2.1 创建传统的单列等值连接 21610.2.2 为查询结果集指定排序次序 21810.2.3 使用表之间的间接关系创建查询 21910.2.4 创建多列等值连接和选择唯一值 22010.3 使用表中的查找字段 22210.3.1 用查阅向导添加... -
oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串
2017-05-06 20:26:52第三章 Sql查询与函数 一、 SQL概述 SQL(Structured Query Language)结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。同时也是数据库脚本文件的扩展名。 SQL... -
SQLHelper.cs
2009-03-09 10:22:10一种重载方法,用于检索指定存储过程的相应参数(首先查询一次数据库,然后缓存结果以便将来查询)。 缓存和检索参数 通过使用 CacheParameterSet 方法,可以缓存 SqlParameter 对象数组。此方法通过将连接字符串和... -
Oracle Database 11g数据库管理艺术--详细书签版
2012-09-30 01:09:454.6 格式化SQL*Plus的输出以及创建报告的命令 93 4.6.1 BREAK命令 93 4.6.2 COLUMN命令 94 4.6.3 COMPUTE命令 94 4.6.4 REPFOOTER命令 94 4.6.5 REPHEADER命令 94 4.6.6 BTITLE和TTITLE命令 94 4.7 ... -
Oracle9i的init.ora参数中文说明
2008-11-07 20:14:11使用多个 UTL_FILE_DIR 参数即可指定多个目录。请注意所有用户均可读取或写入 UTL_FILE_DIR 参数中指定的所有文件。 值范围: 任何有效的目录路径。 默认值: 无 plsql_v2_compatibility: 说明: 设置 PL/SQL 兼容级... -
arcgis工具
2012-10-22 22:37:31(补充其他工具:Union,把多个图斑联合起来并形成一个新的连接在一起的图斑,原图斑无变化,联合后的图斑不继承原任何图斑的属性;Merge,把多个图斑合并到其中一个图斑上并继承它的属性,原图斑变化;Split用于间断... -
MYSQL中文手册
2013-03-11 21:21:345.1.5. mysqld_multi:管理多个MySQL服务器的程序 5.2. mysqlmanager:MySQL实例管理器 5.2.1. 用MySQL实例管理器启动MySQL服务器 5.2.2. 连接到MySQL实例管理器并创建用户账户 5.2.3. MySQL实例管理器命令行... -
mysql官方中文参考手册
2009-04-11 11:59:185.1.5. mysqld_multi:管理多个MySQL服务器的程序 5.2. mysqlmanager:MySQL实例管理器 5.2.1. 用MySQL实例管理器启动MySQL服务器 5.2.2. 连接到MySQL实例管理器并创建用户账户 5.2.3. MySQL实例管理器命令行选项 ... -
java面试宝典
2013-02-28 16:04:0142、一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制? 12 43、说出一些常用的类,包,接口,请各举5 个。 12 44、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类?是否可以... -
千方百计笔试题大全
2011-11-30 21:58:3342、一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制? 12 43、说出一些常用的类,包,接口,请各举5 个。 12 44、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类?是否可以... -
网上日记本
2013-12-30 21:34:33在一个数据库中存放看很多表,这些表之间有的存在必然的联系,我们可以通过这些表间关系对数据库进行查询和修改。 在这个系统中我们设计了两个数据库表即基本信息库和数据中心库,当用户一开始进入日记本系统时为了... -
java api最新7.0
2013-10-26 17:34:06javax.swing.plaf.multi 提供了组合两个或多个外观的用户界面对象。 javax.swing.plaf.synth Synth 是一个可更换皮肤 (skinnable) 的外观,在其中可委托所有绘制。 javax.swing.table 提供用于处理 javax.swing.... -
疯狂JAVA讲义
2014-10-17 13:35:01学生提问:图11.15和图11.16显示的所有按钮都紧挨在一起,如果希望像FlowLayout、GridLayout等布局管理器指定组件的间距该怎么办? 397 11.4 AWT 常用组件 398 11.4.1 基本组件 398 11.4.2 对话框 400 11.5 事件...
-
linux java 命令安装好找不到
-
程序员必修基础套餐课
-
Mysql数据库面试直通车
-
【布道者】Linux极速入门
-
Dynamic steering beams for efficient force measurement in optical manipulation
-
N皇后问题的深度解析(前提是会递归和dfs)
-
51单片机温控pid仿真程序.zip
-
微服务实战:从架构到发布(二)
-
如何发送HTML表单数据
-
Python启蒙到架构师的核心技术精讲课程
-
项目管理工具与方法
-
MySQL 多实例安装 及配置主从复制实验环境
-
iptables 企业级防火墙配置(四表五链)
-
整车控制器烧写上位机.zip
-
spark大数据分析与实战
-
项目经理成长之路
-
Unity 热更新技术-ILRuntime
-
响应式编程入门与实战(Reactor、WebFlux、R2DBC)
-
Uber为什么从Postgres迁移到MySQL,减少频宽占用、内存占用,提高操作效率
-
LVS + Keepalived 实现 MySQL 负载均衡与高可用