sql 倒数第二个_小白初探SQL(一)

ccb46e38bef8fd14338ee0f6c80e7b0b.png

    SQL(结构化查询语言)是目前使用最广泛的数据库语言,可以同各种数据库建立联系、进行沟通,应用十分的广泛。

d854a118a2fa5cfaec075e82f4af5900.gif

c7d1f3e1a367a772c843f765c5fa95c4.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

1

数据定义功能:能够定义数据库的三级模式结构,即外模式、全局模式和内模式结构。

070fca602cadcf9d63b0233cd66be406.png

2

数据操纵功能:包括对基本表和视图的数据插入、删除和修改,特别是具有很强的数据查询功能。

506228270465b44f9280d399439938dc.png

3

数据控制功能:主要是对用户的访问权限加以控制,以保证系统的安全性。

SQL语言相关功能的动词

1)数据查询:SELECT

2)数据定义:CREATE、DROP、ALTER

3)数据操纵:INSERT、UPDATE、DELETE

4)数据控制:GRANT、REVOKE

语言特点

1.SQL风格统一

2.高度非过程化

3.面向集合的操作方式

4.以同一种语法结构提供两种使用方式

5.语言简洁,易学易用

基本概念

1.概念图:

ab30578ea40293de4b9db7033fecc84b.png

2.基本表:

1)本身独立存在的表。

2)SQL中一个关系就对应一个基本表。

3)一个(或多个)基本表对应一个存储文件。

4)一个表可以带若干索引。

3.存储文件

1)逻辑结构组成了关系数据结构的内模式。

2)物理结构是任意的,对用户透明的。

4.视图

1)从一个或几个基本表导出的表。

2)数据库中只存放视图的定义而不存放视图对应的数据,

3)视图是一个虚表。

4)用户可以在视图上再定义视图。

3783aa0a1acd1bfdb69d2290a7c18397.png

下面以“习题”的方式为大家讲解SQL的数据查询功能——单表查询

“学生-课程”数据库

1.Student表

7f0e738f3eb3a6eaeda4ef4569d28c3c.png

2.Course表

9ec35534852c750356505f699c0ccb6a.png

3.SC表

35699b99309808780bb4c4965b3c396c.png

数据查询

1.语句格式

SELECT[ALL|DISTINCT]<< span="">目标列表达式>[ , << span="">目标列表达式>]…

FROM<< span="">表名或视图名>[>]…

[WHERE>]

[GROUP BY<< span="">列名1>[HAVING<< span="">条件表达式>]]

[ORDER BY << span="">列名2>[ASC|DESC]];

2.知识框架

25be75a7b51f468cafbe3a4e008b2ee6.png

单表查询知识框架

a5f37f139a3bd578778b90cd58b05752.png

单表查询——选择表中的若干列

1.查询指定列

1)例一:查询全体学生的学号与姓名

SELECT  Sno, Sname

FROM Studennt;

2)例二:查询全体学生的姓名、学号、所在系。

SELECT Sname, Sno, Sdept

FROM Student;

2.查询全部列

277e08f90a14d0fa8fca27a0312d7cc1.png

选出所有属性列:

i.在SELECT关键字后面列出所有列名

ii.将

例三:查询全体学生的详细记录。

SELECT Sno, Sname, Ssex, Sage, Sdept

FROM Student;

SELECT *

FROM Student

3.查询经过计算的值

1)

277e08f90a14d0fa8fca27a0312d7cc1.png

1)SELECT子句的可以为:

i.算数表达式

ii.字符串常量

iii.函数

iv.列别名

2)例四:查询全体学生的姓名及出生年份

SELECT Sname, 2016-Sage  /*假定当年的年份为2016年*/

输出结果:

b4f2a11f020678fed99ade0c41a53050.png

3)例五:查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名

SELECT Sname, ‘Year of Birth:’,2016-Sage,

LOWER(Sdept)

   FROM Student;

输出结果:

ddc05fcd17a1bae5cc488efe9708b1bb.png

单表查询——选择表中的若干元组

1.消除取值重复的行

1)如果没有指定DISTINCT关键词,则缺省为ALL

例六:查询选修了课程的学生学号。

SELECT Sno

FROM SC

等价于:

SELECT ALL Sno

FROM SC;

执行结果为:

cbbfa597f8e435875b58978940309a85.png

2)指定DISTINCT关键词,去掉表中重复的行

SELECT DISTINCT Sno

FROM SC;

执行结果:

e94314e4222c32dc52ef335c5fbee106.png

2.查询满足条件的元组

1)常用的查询条件

2813a917beb4b9221dd4bc4a0aced437.png

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

在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

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.16f34aa0845e6da9f9d7e680e112da4c.png

ii.【例24】:查询比计算机系所有学生年龄都小的学生姓名和年龄。

SELECT SNAME,AGE

FROM Student

WHERE  AGE

( SELECT AGE

FROM Student

WHERE DEPT=’计算机’);

3.ORDER BY子句

277e08f90a14d0fa8fca27a0312d7cc1.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

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

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.pngHAVING短语和WHERE子句的区别(作用对象不同)1.WHERE子句作用于基表或视图,从中选择满足条件的元组。2.HAVING短语作用于组,从中选择满足条件的组。 8e4d10adec6db33d05ce61b6d8217784.gif 90a8ada8b0e11fd86363590aa1b0e2ab.png

这一期的文章就介绍到这里,感谢阅读!,欢迎各界大佬后台留言或私信我投稿、说出自己的想法、提出建议与批评!希望能通过这个平台能与大家多多交流,结识更多志同道合的朋友!

324de0555f9192e37518a23eab83afbb.png

dd7ebc839689b1b8dd7eb4d315333251.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值