热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SQLserver数据查询

文章目录前言基础语法一、单表查询1.选择表中的若干列2.选择表中的若干元组3.orderby字句4.聚集函数5.groupby子句二、连接查询1.等值与非等值连接查询2.自身连接3

文章目录

  • 前言
  • 基础语法
  • 一、单表查询
    • 1. 选择表中的若干列
    • 2. 选择表中的若干元组
    • 3. order by 字句
    • 4. 聚集函数
    • 5. group by 子句
  • 二、连接查询
    • 1. 等值与非等值连接查询
    • 2. 自身连接
    • 3. 外连接
    • 4. 多表连接
  • 三、 嵌套查询
    • 1.带有in谓词的子查询
    • 2.带有比较运算符的子查询
    • 3. 带有any或all谓词的子查询
    • 4. 带有exists谓词的子查询
  • 四、集合查询
  • 五、基于派生表的查询
  • 总结




前言

本文简单总结下数据查询语句,自己复习看书时候写的

基础语法

单行注释:--

多行注释/* … */

一、单表查询

1. 选择表中的若干列

--查询指定列
select sno, sname
from student;--查询全部列
select *
from student;--查询经过计算的值
select sname, 2014-sage
from student;--设置别名
select sname NAME, sage AGE
from student;

2. 选择表中的若干元组

--消除重复的行(仅仅是不显示,并非删除)
select distinct sno
from sc;--查询满足条件的元组
select sname
from student
where sdept='cs';

这里讲下执行查询的一种可能过程:
对表进行全表扫描,取出一个元组,检查是否满足条件。满足,取出sname列的值,形成新的元组输出。不满足,取下一个元组。

为什么说这是可能过程呢,因为具体的操作可能会根据优化器优化,利用索引或者根据某些规则来作出选择,进行优化。

具体sql如何执行查询操作可以参考下面两篇文章:
SQL查询操作处理流程
一条select的查询的过程

--between
select sname
from student
where sage between 20 and 30
--同样也有not between, 左右可取--确定集合
select name
from student
where sdept in('cs','ma','is');
--in 和 not in可以用来查找属性值属于指定集合的 元组,即本质是选取了几个符合指定的元组--字符匹配
select sname
from student
where sno like '001';select sname
from student
where sno like '陈%';
-- %是通配符(长度可以为0)
-- _是任意单个字符--换码字符
--查询DB_Design课程的课程号
select cno
from course
where cname like 'DB\_Design' escape '\';--空值查询
select sno, cno
from sc
where grade is null;
--注意,不能用=替换--多重条件查询
--用and 或 or, 其实in就是多个or的缩写

3. order by 字句

对查询结果进行排序。ASC升序或DESC降序

select sno, grade
from sc
where sno='3'
order by grade desc;

4. 聚集函数

count, sum, avg, max, min

--查询选修了课程的学生人数
select count(distinct sno)
from sc;--查询1号学生的平均成绩
select avg(grade)
from sc
where cno='1';

聚集函数处理会自动跳过空值
聚集函数只能用在select字句和group by中的having字句

5. group by 子句

--球每个课程号及相应的人数
select cno, count(sno)
from sc
group by cno;--查询选修了三门以上课程的学生学号
select sno
from sc
group by sno
having count(*)>3;

二、连接查询

1. 等值与非等值连接查询

where中的表达式将成为两个表的连接条件

select student.*,sc.*
from student, sc
where student.sno=sc.sno;
--形成新的元组--自然连接,即没有重复的属性列

2. 自身连接

其实就是给相同的表取个别名

select first.cno, second.cpno
from course first, course second
where first.cpno=second.cno;

3. 外连接

意思我觉得有点像是全连接,就是在上述连接中,若没有成功连接上的元组(不满足where里的限定)就会被舍弃,不显示。外连接将会把两个表中的所有元组都显示出来,如果有元组没有满足where限定,还是会被显示出来,而没有被匹配到的另外半边就会用null来填充。
所以又分为左外连接和右外连接,如果是做外连接就会显示左边关系中的所有元组。

select *
from student left out join sc on(student.sno=sc.sno);
--用on来限定
--也可以用using去掉重复结果,from student left out join sc using (sno);

4. 多表连接

就是两个表以上的连接
和两个表没啥区别

三、 嵌套查询

重点
select-from-where被称为一个查询块

1.带有in谓词的子查询

其实思想就是一个分步骤的查询。
查询与xx在同一个系学习的学生
先查询xx所在的系,结果为’CS‘,在查询限定专业等于cs的同学

select sno, sname, sdept
from student
where sdept in(select sdeptfrom studentwhere sname='xx');

值得一提的是,这个查询过程是不唯一的。一种是向外处理,先执行了子查询,在用结果去执行父查询。也可能是一种自身连接。所以实现查询请求可以有多种方法

本例属于不相关子查询,就是查询条件不依赖于父查询。
下面一例就是相关子查询。

2.带有比较运算符的子查询

--找出每个学生超过他自己选修课程的课程号
select sno, cno
from sc x
where grade >= ( /*某个学生的平均成绩*/select avg(grade)from sc ywhere y.sno = x.sno);

这种子查询中与父查询有相关的,就叫相关子查询

3. 带有any或all谓词的子查询

/*查询非计算机系中比计算机系所有学生年龄都小的学生的姓名和年龄*/
select sname, sage
from student
where sage < all (select agefrom studentwhere sdept&#61;&#39;cs&#39;) and sdept <> &#39;cs&#39;;

4. 带有exists谓词的子查询

带有exists的子查询不返回数据&#xff0c;只返回逻辑真假值

/*查询所有选修了1号课程的学生*/
select sname
from student
where exisits( /*判断这个学生是否选修了1号课程*/select * /*这里select无意义&#xff0c;一般都写*号 */from scwhere sno &#61; student.sno and cno&#61;&#39;1&#39;);

下面这个是经典&#xff0c;查询选修了全部课程的学生
这个思路就是&#xff0c;查询 不存在有一门课他没选
not exisits就是查询为空返回true

select sname
from student
where not exisits ( /*不存在&#xff0c;有门课没选的情况*/select *from coursewhere not exisit ( /*不存在&#xff0c;*/select *from scwhere sno&#61;student.snoand cno&#61;course.cno));

我猜测其内部其中一种情况就是&#xff0c;选取了一个学生&#xff0c;现在我们手上拿着这个学生的名字干这样的事。
遍历所有课程的表&#xff0c;拿出一个课程的名字&#xff0c;去看看sc表中有没有这两匹配的情况。查询出来肯定是有的&#xff0c;对于这一个学生和这一门课&#xff0c;not exists返回false然后继续看这一个学生和下一门课&#xff0c;这样下去&#xff0c;如果每一个都找到了&#xff0c;经过not exists就都是false&#xff0c;所以就是空的&#xff0c;再经过最外面的not exisits&#xff0c;因为是空的所以返回true&#xff0c;这个学生就被确保了选了所有课。再接着看下一轮。那如果一个学生和一门课在sc中没有被找到&#xff0c;not exist就会返回true&#xff0c;意识是这个学生确实有一门课没选&#xff0c;所以最外层不存在没有课选的情况就不对了&#xff0c;not exist会因为下一层的true而返回false&#xff0c;这个学生就没被选了。
这不是简单的双重否定表肯定&#xff0c;这个是不能换层单层用exist的&#xff0c;这有点想flag的思想&#xff0c;要保持一个false的状态&#xff0c;最后才能返回true&#xff0c;这样才确保遍历了每一门课。

四、集合查询

并操作union&#xff0c;交操作intersect&#xff0c;差操作except

/*查询选修了了课程1或课程2的学生*/
select sno
from sc
where cno&#61;&#39;1&#39;
union
select sno
from sc
where cno&#61;&#39;2&#39;;

注意&#xff1a;

  1. 进行集合操作的查询结果&#xff0c;列数要相同&#xff0c;数据类型也要相同
  2. union会自动去掉重复元组&#xff0c;要全部显示就用union all

五、基于派生表的查询

其实就是子查询放在from里面&#xff0c;这样查询的表就是新生成的表&#xff0c;又叫做临时派生表

/*上例中&#xff0c;找出每个学生超过自己选修课程的平均成绩的课程号*/
select sno, cno
from sc, (select sno, avg(grade)from scgroup by sno)as Avg_sc(avg_sno, avg_grade)
where sc.sno &#61; Avg_sc.avg_sno and sc.grade >&#61; Avg_sc.avg_grade;



总结

这就是复习巩固数据查询时候把课本内容和自己的理解做了各汇总&#xff0c;数据查询是很基础和关键的&#xff0c;接下来会做一个实验实战&#xff0c;看看有没有需要补充的点。



参考资料&#xff1a;数据库系统概论&#xff08;第5版&#xff09; 王珊 萨师煊 编著

推荐阅读
  • 深入解析 SQL 数据库查询技术
    本文深入探讨了SQL数据库查询技术,重点讲解了单表查询的各种方法。首先,介绍了如何从表中选择特定的列,包括查询指定列、查询所有列以及计算值的查询。此外,还详细解释了如何使用列别名来修改查询结果的列标题,并介绍了更名运算的应用场景和实现方式。通过这些内容,读者可以更好地理解和掌握SQL查询的基本技巧和高级用法。 ... [详细]
  • 在使用 Cacti 进行监控时,发现已运行的转码机未产生流量,导致 Cacti 监控界面显示该转码机处于宕机状态。进一步检查 Cacti 日志,发现数据库中存在 SQL 查询失败的问题,错误代码为 145。此问题可能是由于数据库表损坏或索引失效所致,建议对相关表进行修复操作以恢复监控功能。 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • 在Linux系统中避免安装MySQL的简易指南
    在Linux系统中避免安装MySQL的简易指南 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 本文深入解析了通过JDBC实现ActiveMQ消息持久化的机制。JDBC能够将消息可靠地存储在多种关系型数据库中,如MySQL、SQL Server、Oracle和DB2等。采用JDBC持久化方式时,数据库会自动生成三个关键表:`activemq_msgs`、`activemq_lock`和`activemq_ACKS`,分别用于存储消息数据、锁定信息和确认状态。这种机制不仅提高了消息的可靠性,还增强了系统的可扩展性和容错能力。 ... [详细]
  • 本文详细介绍了在 Oracle 数据库中使用 MyBatis 实现增删改查操作的方法。针对查询操作,文章解释了如何通过创建字段映射来处理数据库字段风格与 Java 对象之间的差异,确保查询结果能够正确映射到持久层对象。此外,还探讨了插入、更新和删除操作的具体实现及其最佳实践,帮助开发者高效地管理和操作 Oracle 数据库中的数据。 ... [详细]
  • 基于试题数据的智能化管理平台采用Java语言进行面向对象编程,旨在构建一个高效的试题信息管理系统。该系统在JDK 6.0和MyEclipse 10.6环境下开发,通过优化试题数据管理和处理流程,提升系统的稳定性和用户体验。平台支持多用户操作,具备强大的数据处理能力和灵活的扩展性,适用于各类教育机构和考试组织。 ... [详细]
  • C# 中 SQLite 报错:在 "\\s\\" 附近出现语法错误,如何解决? ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • Parallels Desktop for Mac 是一款功能强大的虚拟化软件,能够在不重启的情况下实现在同一台电脑上无缝切换和使用 Windows 和 macOS 系统中的各种应用程序。该软件不仅提供了高效稳定的性能,还支持多种高级功能,如拖放文件、共享剪贴板等,极大地提升了用户的生产力和使用体验。 ... [详细]
author-avatar
郭彩凤da
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有