SQL(结构化查询语言)是目前使用最广泛的数据库语言,可以同各种数据库建立联系、进行沟通,应用十分的广泛。
![d854a118a2fa5cfaec075e82f4af5900.gif](https://i-blog.csdnimg.cn/blog_migrate/e493383148d50a81dcf82689991e46ba.gif)
◆
![c7d1f3e1a367a772c843f765c5fa95c4.png](https://i-blog.csdnimg.cn/blog_migrate/f66b4fe2fc884ca82b8424b6547a6acc.png)
结构化查询语言(Structured Query Language)简称SQL,是结构
化查询语言,是关系数据库的标准语言。是一个通用的、功能极强的关系数据库语言
SQL用于存取数据以及查询、更新和管理关系数据库系统。是一种特殊目的的编程语言,是一种查询和程序设计语言。
结构化查询语言是高级的非过程数据库化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统, 可以使用相同的结构化查询语言作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这使它具有极大的灵活性和强大的功能。
SQL的产生于发展
在1970年代初,由IBM公司San Jose,California研究实验室的埃德加·科德发表将数据组成表格的应用原则(Codd's Relational Algebra)。
1974年, D.D.Chamberlin和R.F. Boyce对Codd's Relational Algebra在研制关系数据库管理系统System R中,研制出一套规范语言-SEQUEL(Structured English QUEry Language),并在1976年11月的IBM Journal of R&D上公布新版本的SQL(叫SEQUEL/2)。
1980年改名为SQL。
1979年ORACLE公司首先提供商用的SQL。
1986年10月,美国ANSI采用SQL作为关系数据库管理系统的标准语言(ANSI X3. 135-1986),后为国际标准化组织(ISO)采纳为国际标准。
1989年,美国ANSI采纳在ANSI X3.135-1989报告中定义的关系数据库管理系统的SQL标准语言,称为ANSI SQL 89,该标准替代ANSI X3.135-1986版本。
(想要了解更多有关SQL语言发展与渊源请点击SQL的发展史)
SQl的功能:
(SQL具有数据查询、数据定义、数据操纵和数据控制四
种功能)
![70db9670bb96100294464d41bb7069ed.png](https://i-blog.csdnimg.cn/blog_migrate/b76fd71ff309b242cf3109fce8808b8d.png)
1
数据定义功能:能够定义数据库的三级模式结构,即外模式、全局模式和内模式结构。
![070fca602cadcf9d63b0233cd66be406.png](https://i-blog.csdnimg.cn/blog_migrate/ea92598af1af1072917ae2dee5b69e48.png)
2
数据操纵功能:包括对基本表和视图的数据插入、删除和修改,特别是具有很强的数据查询功能。
![506228270465b44f9280d399439938dc.png](https://i-blog.csdnimg.cn/blog_migrate/f9d66727d749dcbbb4c23636f984e05d.png)
3
数据控制功能:主要是对用户的访问权限加以控制,以保证系统的安全性。
SQL语言相关功能的动词
1)数据查询:SELECT
2)数据定义:CREATE、DROP、ALTER
3)数据操纵:INSERT、UPDATE、DELETE
4)数据控制:GRANT、REVOKE
语言特点
1.SQL风格统一
2.高度非过程化
3.面向集合的操作方式
4.以同一种语法结构提供两种使用方式
5.语言简洁,易学易用
基本概念
1.概念图:
2.基本表:
1)本身独立存在的表。
2)SQL中一个关系就对应一个基本表。
3)一个(或多个)基本表对应一个存储文件。
4)一个表可以带若干索引。
3.存储文件
1)逻辑结构组成了关系数据结构的内模式。
2)物理结构是任意的,对用户透明的。
4.视图
1)从一个或几个基本表导出的表。
2)数据库中只存放视图的定义而不存放视图对应的数据,
3)视图是一个虚表。
4)用户可以在视图上再定义视图。
![3783aa0a1acd1bfdb69d2290a7c18397.png](https://i-blog.csdnimg.cn/blog_migrate/94df0134fc35b586bf82293212ab9295.png)
下面以“习题”的方式为大家讲解SQL的数据查询功能——单表查询
“学生-课程”数据库
1.Student表
2.Course表
3.SC表
数据查询
1.语句格式
SELECT[ALL|DISTINCT]<< span="">目标列表达式>[ , << span="">目标列表达式>]…
FROM<< span="">表名或视图名>[>]…
[WHERE>]
[GROUP BY<< span="">列名1>[HAVING<< span="">条件表达式>]]
[ORDER BY << span="">列名2>[ASC|DESC]];
2.知识框架
单表查询知识框架
单表查询——选择表中的若干列
1.查询指定列
1)例一:查询全体学生的学号与姓名
SELECT Sno, Sname
FROM Studennt;
2)例二:查询全体学生的姓名、学号、所在系。
SELECT Sname, Sno, Sdept
FROM Student;
2.查询全部列
![277e08f90a14d0fa8fca27a0312d7cc1.png](https://i-blog.csdnimg.cn/blog_migrate/ba622f99d3a5e06d6cb9f703e11ee1c8.png)
选出所有属性列:
i.在SELECT关键字后面列出所有列名
ii.将
例三:查询全体学生的详细记录。
SELECT Sno, Sname, Ssex, Sage, Sdept
FROM Student;
或
SELECT *
FROM Student
3.查询经过计算的值
1)
![277e08f90a14d0fa8fca27a0312d7cc1.png](https://i-blog.csdnimg.cn/blog_migrate/ba622f99d3a5e06d6cb9f703e11ee1c8.png)
1)SELECT子句的可以为:
i.算数表达式
ii.字符串常量
iii.函数
iv.列别名
2)例四:查询全体学生的姓名及出生年份
SELECT Sname, 2016-Sage /*假定当年的年份为2016年*/
输出结果:
3)例五:查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名
SELECT Sname, ‘Year of Birth:’,2016-Sage,
LOWER(Sdept)
FROM Student;
输出结果:
单表查询——选择表中的若干元组
1.消除取值重复的行
1)如果没有指定DISTINCT关键词,则缺省为ALL
例六:查询选修了课程的学生学号。
SELECT Sno
FROM SC
等价于:
SELECT ALL Sno
FROM SC;
执行结果为:
2)指定DISTINCT关键词,去掉表中重复的行
SELECT DISTINCT Sno
FROM SC;
执行结果:
2.查询满足条件的元组
1)常用的查询条件
2)比较大小
(谓词:>,=,<=,!=,<>,!>,!上述运算符)
i.例7:查询计算机科学系全体学生的名单
SELECT Sname
FROM Student
WHERE Sage = ‘CS’:
ii.例8:查询所有年龄在20岁以下的学生姓名及其年龄
SELECT Sname, Sage
FROM Student
WHERE Sage<20;< span="">
iii.例9:查询考试成绩有不及格的学生的学号
SELECT DISTINCT Sno
FROM SC
WHERE Grade<60;< span="">
3)确定范围
(谓词:BETWEEN…AND…;NOT BETWEEN…AND…)
i.例10:查询年龄在20~23(包括20岁和23岁)之间的学生的姓名、系别和年龄。
SELECT Sname , Sdept, Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;
ii.例11:查询年龄不在20~23岁之间的学生姓名、系别和年龄。
SELECT Sname, Sdept, Sage
FROM Student
WHERE Sage NOT BETWEEN 20 AND 23;
4)确定集合
(谓词:IN<< span="">值表>、NOT IN >)
i.例12:查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。
SELECT Sname, Ssex
FROM Student
WHERE Sdept IN (‘IS’.’MA’,’CS’);
ii.例13:查询既不是信息系(IS)、数学系(MA),也不是计算机科学系的学生的姓名和性别。
SELECT Sname, Ssex
FROM Student
WHERE Sdept NOT IN(‘IS’,’MA’,’CS’);
5)字符匹配
(谓词:[NOT] LIKE ‘<< span="">匹配串>’ [ESCAPE ‘<< span="">换码字符>’])
i.匹配串为固定字符串
【例14】:查询学号为200215121的学生的详细情况。
SELECT *
FROM Student
WHERE Sno LIKE ‘200215121’;
等价于:
SELECT *
FROM Student
WHERE Sno =’200215121’
ii.匹配串为含通配符的字符串
【例15】:查询所有姓刘学生的姓名,学号和性别。
SELECT Sname, Sno, Ssex
FROM Student
WHERE Sname LIKE ‘刘%’
【例16】:查询姓“欧阳”且全名为三个汉字的学生的姓名。
SELECT Sname
FROME Student
WHERE Sname LIKE ‘欧阳_’;
【例17】:查询名字中第二个字为“阳”字的学生的姓名和学号。
SELECT Sname, Sno
FROME Student
WHERE Sname LIKE’__阳%’;
【例18】:查询所有不姓刘的学生姓名
SELECT Sname,
FROM Student
WHERE Sname NOT LIKE ‘刘%’;
6)模式匹配
![277e08f90a14d0fa8fca27a0312d7cc1.png](https://i-blog.csdnimg.cn/blog_migrate/ba622f99d3a5e06d6cb9f703e11ee1c8.png)
在LIKE操作符的模式中
1.用%(有时候用*)匹配任意子串
2.用__(有时候用?)匹配任意一个字符
3.在模式中为了使用特殊字符%和__等,允许用\将他们转义成普通字符。
4.如:LIKE’__ __\%’ ESCAPE‘\’(ESCAPE‘\’表示“\”为转换字码)
5.在ACCESS中查找通配符用 [] 。
ii.使用转码字符将通配符转义为普通字符
【例19】查询DB_Design课程的课程号和学分。
SELECT Cno, Ccredit
FROM Course
WHERE Cname LIKE ‘DB\_Design’ESCAPE’\’
【例20】查询以‘DB_’开头,且倒数第三个字符为i的课程的详细情况。
SELECT *
FROME Course
WHERE Cname LIKE ‘DB\_%i_ _’ESCAPE’\’
7)涉及空值的查询
(谓词:IS NULL或IS NOT NULL “IS”不能用“=”代替)
i.【例21】某些学生选修课程后没有参加考试,所以有选课记录,但是没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。
SELECT Sno, Con
FROM SC
WHERE Grade IS NULL.
ii.【例22】查询所有有成绩的学生学号和课程号
SELECT Sno, Cno
FROM SC
WHERE Grade IS NOT NULL
8)多重条件查询
![277e08f90a14d0fa8fca27a0312d7cc1.png](https://i-blog.csdnimg.cn/blog_migrate/ba622f99d3a5e06d6cb9f703e11ee1c8.png)
i.逻辑运算符:AND 和OR 来联结多个查询条件
1.AND的优先级高于OR
2.可以用括号改变优先级
ii.可用来实现多种其他谓语
1.[NOT] IN
2.NOT] BETWEEN…AND…
iii.【例23】查询计算机系年龄在20岁下的学生和姓名。
SELECT Sname
FROM Student
WHERE Sdept=‘CS’AND Sage<20;< span="">
iv.改写【例12】
【例12】:查询信息系(IS),数学系(MA)和计算机科学系(CS)学生的姓名和性别。
SELECT Sname, Ssex
FROM Student
WHERE Sdept IN(‘IS’,’MA’,’CS’)
可改写为:
SELECT Sname,Ssex
FROME Student
WHERE Sdept=’IS’OR Sdept=’MA’OR Sdept =’CS’
9)ANY,ALL的使用
i.
ii.【例24】:查询比计算机系所有学生年龄都小的学生姓名和年龄。
SELECT SNAME,AGE
FROM Student
WHERE AGE
( SELECT AGE
FROM Student
WHERE DEPT=’计算机’);
3.ORDER BY子句
![277e08f90a14d0fa8fca27a0312d7cc1.png](https://i-blog.csdnimg.cn/blog_migrate/ba622f99d3a5e06d6cb9f703e11ee1c8.png)
1)ORDER BY子句
可以按一个或多个属性列排序
1.升序:ASC:
2.降序:DESC;缺省值为升序
2)当排序列含空值时
1.ASC:排序列为空值的元组最后显示
2.DESC:排序列为空值的元组最先显示。
3)【例25】:查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列
SELECT Sno, Grade
FROM SC
WHERE Cno=’3’
ORDER BY Grade DESC
4)【例26】:查询全体学生请情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。
SELECT *
FROM Student
ORDER BY Sdept, Sage DESC
4.聚集函数
![277e08f90a14d0fa8fca27a0312d7cc1.png](https://i-blog.csdnimg.cn/blog_migrate/ba622f99d3a5e06d6cb9f703e11ee1c8.png)
1.计数:
COUNT ([DISTINCT|ALL]*)
COUNT ([DISTINCT|ALL]<< span="">列名>)
2.计算总和
SUM ([DISTINCT|ALL]<< span="">列名>)
3.计算平均值
AVG ([DISTINCT|ALL]<< span="">列名>)
4.计算最大最小值
MAX ([DISTINCT|ALL]>)
MIN([DISTINCT|ALL]<< span="">列名>)
1)【例27】:查询学生总人数
SELECT COUNT(*)
FROM Student;
【例28】:查询选修了课程的学生人数
SELECT COUNT(DISTINCT Sno)
FROM SC;
【例29】:计算1号课程的学生平均成绩
SELECT AVG(Grade)
FROM SC
WHERE Cno=’1’;
【例30】查询选修了1号课程的学生最高分数。
SELECT MAX(Grade)
FROM SC
WHERE Cno=’1’;
【例31】查询学号为200215012的学生选修课的总学分数。
SELECT SUM(Ccredit)
FROM SC, Course
WHERE Sno=’200215012’AND SC.Cno=Course.Cno;
5.GROUP BY 子句
![277e08f90a14d0fa8fca27a0312d7cc1.png](https://i-blog.csdnimg.cn/blog_migrate/ba622f99d3a5e06d6cb9f703e11ee1c8.png)
GROUP BY子句分组:细化聚集函数的作用对象
1.未对查询结果分组,聚集函数将作用于整个查询结果
2.对查询结果分组后,聚集函数将分别作用于每个组
3.作用对象是查询的中间结果表
4.按指定的一列或多列分组,值相等的为一组。
1)【例32】:求各个课程号及相应的选课人数
SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Con;
【例33】:查询选修了3门以上课程的学生学号。
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*)>3
![b8e5280c486774e2a3c47eb1101a2f53.png](https://i-blog.csdnimg.cn/blog_migrate/c64bcb246db1ac486df3fb358dc216fe.png)
![8e4d10adec6db33d05ce61b6d8217784.gif](https://i-blog.csdnimg.cn/blog_migrate/d3cb7e93b1e82637626dd896cfc04375.gif)
![90a8ada8b0e11fd86363590aa1b0e2ab.png](https://i-blog.csdnimg.cn/blog_migrate/63b34f1712877bcba1e21bacd036c96e.png)
这一期的文章就介绍到这里,感谢阅读!,欢迎各界大佬后台留言或私信我投稿、说出自己的想法、提出建议与批评!希望能通过这个平台能与大家多多交流,结识更多志同道合的朋友!
![324de0555f9192e37518a23eab83afbb.png](https://i-blog.csdnimg.cn/blog_migrate/c776766d58754a08bb6d62ecae7503b5.png)