文章目录

  • 前言
  • 一、单表查询
    • 1. 选择表中的若干列(投影)
    • 2. 选择表中的若干元组(选择)
    • 3.ORDER BY 子句
    • 4.聚集函数
    • 5.GROUP BY 子句
  • 二、连接查询
    • 1.等值连接
    • 2.自身连接
    • 3.左外连接
  • 三、嵌套查询
    • 1.使用IN的嵌套查询
    • 2.带有比较运算符的嵌套查询
    • 3.带有EXISTS的嵌套查询
  • 四、集合查询
    • 1.并运算UNION
    • 2.交运算INTERSECT
    • 3.差运算EXCEPT
  • 总结

前言

   SQL,指的是结构化查询语言,全称为 Structured Query Language。SQL是一种标准的计算机语言,我们可以使用SQL语句完成对数据库的大部分操作,如数据库、表、视图的创建、数据的增删改查等等。本篇,我们将学习如何使用SQL语句进行数据查询。


一、单表查询

1. 选择表中的若干列(投影)

【例1】查询所有学生的sno(学号)和sname(姓名)。

 SELECT sno,sname FROM student;

【例2】查询全体学生的详细记录。

 SELECT * FROM student;                          //方法一SELECT sno,sname,ssex,sage,sdept FROM student; //方法二

【例3】查询所有学生的sno和sdept,并将字段重命名为学号和院系。

 SELECT sno AS '学号',sdept AS '院系' FROM student;

【例4】查询全体学生的姓名及出生年份。

 SELECT sname,strftime('%Y',DATE())-sage AS '出生日期' FROM student;

注意:DATE()为SQLite查询时间函数,%Y代表仅输出年份。

2. 选择表中的若干元组(选择)

【例1】查询选修了课程的学生学号。

 SELECT DISTINCT userid FROM Mark;

DISTINCT关键字:用于取消重复的记录;如果没有指定DISTINCT,则默认为ALL,即保留结果表中取值重复的记录。

【例2】查询计算机系全体学生的名单。

 SELECT * FROM student WHERE sdept = '计算机系';

【例3】查询年龄在17-20之间的学生姓名、系和年龄。

 SELECT sname,sdept,sage FROM student WHERE sage>=17 AND sage<=20;       //方法一SELECT sname,sdept,sage FROM Student WHERE sage BETWEEN 17 AND 20; //方法二

注意:不能写成 sage BETWEEN 23 AND 20,即数字要从小到大。

【例4】查询计算机系、数学系和信息系的学生姓名和性别。

 //方法一SELECT sname,ssex FROM student WHERE sdept IN ('计算机系','信息系','数学系');//方法二SELECT sname,ssex FROM student WHERE sdept='计算机系' OR sdept='信息系' OR sdept='数学系';

【例5】查询所有姓刘的学生的姓名、学号和性别。

 SELECT sname,sno,ssex FROM student WHERE sname LIKE '刘%' ;

【例6】查询姓为“欧阳”且全名为3个汉字的学生姓名。

 SELECT sname FROM student WHERE sname LIKE '欧阳_';


【例7】查询以“DB_”开头,且倒数第2个字符为i的课程的详细情况。

 SELECT * FROM course WHERE cname LIKE 'DB\_%i_' ESCAPE'\';
  • ESCAPE’ \ ’ 表示将 \ 定义为转义字符。
  • 默认情况下,字符串的查询与大小写无关。
  • 要进行大小写相关的查询,则需要在查询条件后面加上:collate Chinese_PRC_CS_AS_WS,如下所示。
 SELECT cname FROM courseWHERE cname LIKE 'DB\_%i__' ESCAPE'\' collate Chinese_PRC_CS_AS_WS;

3.ORDER BY 子句

  • ORDER BY 语句用于根据指定的列对结果集进行排序。

【例1】查询选修了3001号课程的学生的学号和成绩,查询结果按分数的降序排列。

 SELECT userid,score FROM Mark WHERE courseid = '3001' ORDER BY score DESC;

注意:ORDER BY 子句中,降序关键字为DESC,升序关键字为ASC(无关键字默认升序)。

【例2】查询全体学生情况,查询结果按所在系的系号升序排序,同一系中的学生按年龄降序排列。

 SELECT * FROM student ORDER BY sdept,sage DESC;

【例3】TOP语句用于限制输出的记录行数。

 SELECT TOP(3)* FROM student ORDER BY sage DESC; //显示前三行

【例4】忽略前N行然后取M行出来。

 SELECT * FROM student ORDER BY sno desc OFFSET 0 ROWS FETCH NEXT 3 ROWS ONLY;

4.聚集函数

【例1】查询学生总人数。

 SELECT COUNT(*) AS '学生人数' FROM student;

【例2】查询选修了课程的学生人数。

 SELECT COUNT(DISTINCT userid) AS '选课人数' FROM Mark;

【例3】计算3001号课程的学生平均成绩和最高分。

 SELECT AVG(score) AS '平均分',MAX(score) AS '最高分' FROM Mark WHERE courseid = 3001;

5.GROUP BY 子句

  • GROUP BY 语句根据一定的规则将一个数据集划分成若干个小区域,然后针对每个区域进行数据处理,即分组查询。一般是和聚合函数配合使用。

【例1】求各个课程号及相应的选课人数。

 SELECT courseid,COUNT(*) AS '课程人数' FROM Mark GROUP BY courseid;

【例2】某门课程成绩高于80分的学生的学号以及该生高于80分的课程平均成绩。

 SELECT userid,AVG(score) AS '平均成绩' FROM Mark WHERE score>80 GROUP BY userid;

【例3】查询选修了3门及以上课程的学生学号。

 //HAVING 子句在由 GROUP BY 子句创建的分组上设置条件。SELECT userid FROM Mark GROUP BY userid HAVING COUNT(*)>= 3;

重点区分WHEREHAVINGGROUP BY语句的配合使用:

  • WHERE+GROUP BY,先筛选符合条件的数据,再进行分组。
  • HAVING+GROUP BY,先进行分组,再筛选符合条件的数据。

二、连接查询

   若一个查询同时涉及两个以上的表,称为连接查询。连接查询是关系数据库最主要的查询,包含等值连接查询、自身连接查询、外连接查询等。

1.等值连接

【例1】查询每个学生及其选修课程的情况。

 //方法一SELECT student.*,sc.* FROM student,sc WHERE student.sno = sc.sno//方法二SELECT student.*,sc.* FROM student INNER JOIN sc ON student.sno = sc.sno

【例2】查询选修了3002号课程且成绩在90分以上的所有学生的学号和姓名。

 SELECT student.sno,sname FROM student,sc WHERE student.sno = sc.sno AND score > 90 AND cno = 3002;

注:DBMS在执行连接查询语句的时候,通常会先对表中的记录进行选择操作,然后再进行等值连接。

【例3】查询选修了课程号为“C001”的课程且成绩在80分以上的学生的姓名、课程名及成绩。

 SELECT s.sname,c.cname,sc.grade FROM student s, sc,course cWHERE s.sno = sc.sno AND c.cno = sc.cno AND c.cno = 'C001' AND sc.grade >= 80;

注:表名较长时,可使用别名以简化代码。

2.自身连接

【例1】查询每一门课的间接先修课程号。

 SELECT c1.cno,c2.cpno FROM course c1,course c2 WHERE c1.cpno = c2.cno

3.左外连接

【例1】列出所有学生的基本情况和选课情况。如果该生没有选课,相关信息也一并列出。

 SELECT * FROM student s LEFT OUTER JOIN sc ON s.sno = sc.sno;

三、嵌套查询

  • 在SQL语言中,一个SELECT-FROM-WHERE语句,被称为一个查询块。
  • 将一个查询块嵌套在另一个查询块的WHERE或者HAVING短语的条件中的查询,称为嵌套查询。
  • 嵌套查询使用户可以使用多个简单查询构成复杂的查询。

1.使用IN的嵌套查询

【例1】查询与“刘晨”在同一个系学习的学生姓名。

 SELECT sname,sdept FROM student WHERE sdept IN (SELECT sdept FROM student WHERE sname = '刘晨');

【例2】查询选修了课程名为“信息系统”的学生学号和姓名。

 SELECT sno,sname FROM student WHERE sno IN(SELECT sno FROM sc WHERE cno = (SELECT cno FROM course WHERE cname = '信息系统'));

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

【例1】查询每个学生超过他自己选修课程平均成绩的课程号。

 SELECT sno,cno FROM sc s1 WHERE grade >= (SELECT AVG(grade) FROM sc WHERE sno = s1.sno);

3.带有EXISTS的嵌套查询

【例1】查询选修了3001号课程的学生姓名。

 SELECT sname FROM student WHERE EXISTS (SELECT * FROM sc WHERE sno = student.sno AND cno = 3001);

四、集合查询

1.并运算UNION

  • UNION 会对查询结果自动去重
  • UNION ALL则直接将多个查询结果合并

【例1】查询计算机系的学生及年龄不大于19岁的学生。

 SELECT sno,sname FROM student WHERE sdept = '计算机系' UNION SELECT sno,sname FROM student WHERE sage<=19;

2.交运算INTERSECT

【例1】查询计算机系的学生与年龄不大于19岁的学生的交集。

 SELECT * FROM student WHERE sdept = '计算机系' INTERSECT SELECT * FROM student WHERE sage<=19;

3.差运算EXCEPT

【例1】查询计算机系的学生与年龄不大于19岁的学生的差集。

 SELECT * FROM student WHERE sdept = '计算机系' EXCEPT SELECT * FROM student WHERE sage<=19;

总结

   以上就是浅显易懂 SQLite3 笔记(03)— SQL数据查询(超级详细)的所有内容,希望大家阅读后都能有所收获!原创不易,转载请标明出处,若文章出现有误之处,欢迎读者留言指正批评!

浅显易懂 SQLite3 笔记(03)— SQL数据查询(超级详细)相关推荐

  1. 浅显易懂 SQLite3 笔记(07)— 数据库视图简介及操作

    文章目录 前言 一.数据库系统的三级模式 二.视图定义和作用 1.什么是视图? 2.视图的作用? 三.SQL语句操作视图 1.创建视图 2.查询视图 3.更新视图 4.修改视图 5.删除视图 总结 前 ...

  2. 浅显易懂 SQLite3 笔记(01)— SQLite3简介及基本操作

    文章目录 前言 一.SQLite数据库 1.什么是SQLite? 2.为什么要用SQLite? 3.如何使用SQLite? 二.SQLite语言及基本操作 1.SQLite命令 2.SQLite类型 ...

  3. 浅显易懂 SQLite3 笔记(08)— 数据库三大范式

    文章目录 前言 一.函数依赖 1.第一定义 2.第二定义 3.第三定义 二.数据库范式 1.第一范式 2.第二范式 3.第三范式 4.范式关系图 5.范式对查询的影响 总结 前言    本篇,我们将学 ...

  4. MySQL学习记录 (二) ----- SQL数据查询语句(DQL)

    相关文章: <MySQL学习记录 (一) ----- 有关数据库的基本概念和MySQL常用命令> <MySQL学习记录 (二) ----- SQL数据查询语句(DQL)> &l ...

  5. SQL数据查询之——单表查询

    一.SQL数据查询的一般格式 数据查询是数据库的核心操作.SQL提供了SELECT语句进行数据查询,其一般格式为: SELECT [ALL | DISTINCT]<目标列表达式>[,< ...

  6. 《数据库原理》实验六 SQL数据查询实验

    本系列传送门: 实验二 SQL Server SSMS工具创建和管理数据库及数据表 实验三 SQL Server SSMS工具添加数据 实验四 SQL的数据定义语句 实验五 数据库完整性约束的实现与验 ...

  7. Hive SQL数据查询基础

    教材第四章Hive SQL数据查询基础实验 提示:如果感觉sogou.500w.utf8文件太大,执行hive命令太耗时间,可以执行以下命令,截取前1万行数据,生成一个新的数据文件sogou.1w.u ...

  8. 数据分析学习总结笔记03:数据降维经典方法

    数据分析学习总结笔记03:数据降维经典方法 1. 数据降维概述 2. 数据降维的应用 3. 数据降维经典方法 3.1 主成分分析(PCA) 3.1.1 PCA概述 3.1.2 PCA原理 3.1.3 ...

  9. SQL 数据查询(5)—— 集合查询、基于派生表的查询、数据更新、视图

    文章目录 集合查询 基于派生表的查询 数据更新 插入数据 插入元组 插入子查询的结果 修改数据 删除数据 删除一个元组的值 删除多个元组的值 空值的处理 空值的产生 空值的算术运算.比较运算和逻辑运算 ...

最新文章

  1. php编程神器,PHP代码神器 十个PHP代码片段超极好用
  2. banana pi 板上跑树莓派镜像
  3. FATCAT桌面计算器即将出炉!
  4. c++与Delphi中的类型转换
  5. bom event周期_前端知识点总结——BOM
  6. Vue 第九天学习
  7. 你是我一首唱不完的歌
  8. java 使用jasper_使用Jasper Reports以Java创建报告
  9. Leetcode 133.克隆图
  10. python读取excel数据生成word_利用Python将excel数据读取到word表格
  11. 什么是信用评分分析?
  12. 支付交易相关接口文档对接
  13. XML文件里处理大于号小于号方式
  14. FLINK 窗口实现原理
  15. 词根词缀 (一):前缀篇
  16. zip和tgz以及exe的区别
  17. 根据离散点画直线_excel表格怎么画散点图画直线
  18. kubernetes deployment,pod 实践
  19. CentOS7 安装WPS: libGLU.so.1()
  20. 顾客点餐系统(1)-------整体项目目标+用户数据表的操作

热门文章

  1. 童小点思维启蒙机器人试玩:点控编程是亮点 团战更酣
  2. 华为手机 roomba_如何设置Wi-Fi连接的Roomba
  3. Windows IIS 服务器数据的备份与还原
  4. C语言 实现4位奇校验的校验生成和检验
  5. MAT工具学习,incoming reference和outgoing reference,Shallow Heap和Retained Heap
  6. vim插件管理工具Vundle的安装与配置
  7. dumpsys meminfo 详解
  8. 【兰陵王系列】今天给大家讲解下传奇世界开服教程
  9. C语言杨辉三角(用二维数组)
  10. 两数之和 II - 输入有序数组(Java实现)