【针对SQL 2008 R2的一点个人小结】

本文只是自己对数据库学习的一个小总结

  • 前言
    • SQL的语法有一些固定规则在里边
    • 首先,简单介绍一下SQL语言
      • SQL语言的组成:
      • SQL包括了所有对数据库的操作,主要是由6个部分组成:
    • 数据定义语言(Data Definition Language, DDL)
    • 数据操纵语言(Data Manipulation Language,DML)
    • ==_数据查询语言_(Data Query Language,DQL)==(重点来了)
    • 数据控制语言(Data Control Language, DCL)

前言

这学期我们专业有一门《数据库原理与应用》的课程,刚开始学习的时候非常困难,主要是因为在SQL学习过程中,没有理清数学逻辑与数据库语法之间的关系。今天想稍微在这里总结一下自己关于Sql的学习情况,我只简单介绍SQL代码的实现,如有错误,恭请指正。

SQL的语法有一些固定规则在里边

SQL语言也像Java,Python这些编程语言一样,有着自己的一套语法体系。
刚开始学习数据库的时候,老师什么也不要求,只是一直让我们不停的新建database,新建table,然后删掉,再建。
一开始的时候我觉得很枯燥,但是现在才发现,原来“基础条件决定上层建筑”这话是一点也不假。
首先,在学习SQL之前,我建议有自学想法的同学先记住一个原则,就是“以不变,应万变”,一定记住,在SQL中,不论是数据更新,还是查询,还是其它任何操作,最先考虑的东西,一定是“要实现什么”,其次是“怎样实现”,最后才是“条件是什么”。

首先,简单介绍一下SQL语言

SQL语言的组成:

1.一个SQL数据库是表(Table)的集合,它由一个或多个SQL模式定义。
2.一个SQL表由行集构成,一行是列的序列(集合),每列与行对应一个数据项。
SQL数据库
SQL数据库
3.一个表或者是一个基本表或者是一个视图。基本表是实际存储在数据库的表,而视图是由若干基本表或其他视图构成的表的定义。
4.一个基本表可以跨一个或多个存储文件,一个存储文件也可存放一个或多个基本表。每个存储文件与外部存储上一个物理文件对应。
5.用户可以用SQL语句对视图和基本表进行查询等操作。在用户角度来看,视图和基本表是一样的,没有区别,都是关系(表格)。
6.SQL用户可以是应用程序,也可以是终端用户。SQL语句可嵌入在宿主语言的程序中使用,宿主语言有FORTRAN,COBOL,PASCAL,PL/I,C和Ada语言等。SQL用户也能作为独立的用户接口,供交互环境下的终端用户使用。

SQL包括了所有对数据库的操作,主要是由6个部分组成:

1.数据定义:又称为“DDL语言”,定义数据库的逻辑结构,包括定义数据库、基本表、视图和索引4部分。
2.数据操纵:又称为“DML语言”,包括插入、删除和更新三种操作。
3.数据查询:又称为“DQL语言”,包括数据查询操作。
4.数据控制:又称为“DCL语言”,对用户访问数据的控制有基本表和视图的授权及回收。
5.事务控制:又称为“TCL语言”,包括事务的提交与回滚。
6.嵌入式SQL语言的使用规定:规定SQL语句在宿主语言的程序中使用的规则。
接下来,我只围绕前四个部分简单展开。

首先我将前边提到的不停新建的数据库和基本表贴在下边方便之后的讲解:

create database student #新建数据库student
go  #go表示系统自动运行go之前的代码,在SQL中,系统不会像python那样点一下运行就自动逐句运行,必须手动
use student #调用数据库student
go

create table student #新建基本表student
(
	sno char(10) primary key,
	sname char(10) not null,
	ssex char(2) check(ssex in ('男','女')),
	sage int check(sage between 0 and 100),
	sdept nvarchar(10)
)

create table course #新建基本表course
(
	cno char(2) primary key,
	cname char(10) not null,
	cpno char(2),
	ccredit int check(ccredit>0),
	teacher varchar(10) 
)

create table sc #新建基本表sc,sc表部分参照表student和表course
(
	sno char(10),
	cno char(2),
	grade int check(grade between 0 and 100),
	primary key(sno,cno),
	constraint fk_sc_sno foreign key(sno) references student(sno),
	constraint fk_sc_cno foreign key(cno) references course(cno)
)

数据定义语言(Data Definition Language, DDL)

包括三个内容:

create(新建)
例如
新建一个数据库 student:

create database student

新建一个表 course:

create table course

drop(删除)
例如
删除数据库 student:

drop database student

删除表 course:

drop table course

alter(修改)
例如
修改基本表 course:

alter table course

修改列 cname:

alter column cname

数据操纵语言(Data Manipulation Language,DML)

也包括三个部分:

insert(插入数据)
例如
将数据 (‘2020103025’,‘小明’,‘男’,19,‘is’)插入表 student 中:
insert into student(insert都是将数据插入表中,所以此处是将数据插入表student)

insert into student
value '2020103025','小明','男',19,'is'

update(更新数据)
例如
将学号为’2020103022’的学生的年龄改为20:
(年龄为int型,故不用加引号)

update student
set sage = 20
where sno = '2020103022'

delete(删除数据)
例如
删除学号为’2020204011’的学生的信息:

delete
from student
where sno = '2020204011'

数据查询语言(Data Query Language,DQL)(重点来了)

这一部分是我个人认为整个《数据库基本原理与应用》学习过程中最有意思也最难的一部分
【针对SQL 2008 R2的一点个人小结】_第1张图片首先,来点开胃菜:

查询“王老师”所授课程的课程号:

select cno 
from course
where teacher like '王%'

在这里,我终于用到了之前提到的“万变不离其宗”之法,即:
1.要实现什么
2.怎么实现
3.条件是什么
具体到DQL中就是:
1.查什么
2.从哪查
3.条件是什么

接下来,来点稍微难一点点的:

查询张小明同学所学课程的课程号:

要解决这个问题,首先要知道要查的东西在哪个表里,然后是条件在哪个表里。
课程号当然是在course表中,条件是学生叫张小明,在student表中。
因此,我们要么用表连接,要么用嵌套查询:
1)表连接:

select cno
from student,course,sc
where student.sno = sc.sno and course.cno = sc.cno and 
sname = '张小明' #由于表student和course没有共同属性,因此需要引用sc表将两表串联起来

2)嵌套:

select cno
from course
where cno in 
			(
			select cno #外层条件是什么,内层查的就是什么
			from sc
			where sno in
						(
						select sno
						from student
						where sname = '张小明'
						)
			)

有的同学肯定会说:
【针对SQL 2008 R2的一点个人小结】_第2张图片

那么接下来,我们来点有难度的(当时困扰了我许久):

查询数据库课成绩最好的三位学生的学号和姓名(观众姥爷们可以自己先想想怎么写):
【针对SQL 2008 R2的一点个人小结】_第3张图片

【针对SQL 2008 R2的一点个人小结】_第4张图片代码如下:

select sc.sno,sname
from sc,student,course
where sno in
            (
            select sno
            from sc
            where grade in
                         (
                         select top 3 grade  #top函数用于挑选出目标列所有元素中的最大值
                         from sc
                         where cname in
                                      (
                                      select cname
                                      from course
                                      where cname = '数据库'
                                      )
                          )
             )

在这里我使用了一个函数和嵌套,大家可以试着想想如果不用嵌套和top函数该怎么写,当然我是想都不敢想的哈,毕竟我是菜鸡一枚
【针对SQL 2008 R2的一点个人小结】_第5张图片接下来是最后一个:
统计每门课程的修读人数(超过10人才统计)。要求输出课程号和修读人数,查询结果按人数降序排列,若人数相同,按课程号升序排列:
(也请大家先想想该如何实现)
【针对SQL 2008 R2的一点个人小结】_第6张图片【针对SQL 2008 R2的一点个人小结】_第7张图片代码实现:

select cno,COUNT(sno)
from sc
group by cno
having count(sno) > 10
order by COUNT(sno) desc,cno asc #这里表示先按照sno降序排列,如果遇到比较列相同的元组则按照cno升序排列

个人认为实际生产环境中的数据查询实现真的不算简单,因为它需要你对SQL有一个比较深刻的理解,同时还需要你的逻辑非常清晰。但是数据查询真的很有趣。

数据控制语言(Data Control Language, DCL)

grant(授予用户权限)
例如
将查询course表和修改课程号权限授予用户u1:

grant selectupdate(cno)
on course
to u1

把对sc表的update权限授予用户u3并允许其将该权限授予其他用户:

grant update
on sc
to u3
with grant option #允许被授予权限的用户进行再授权

revoke(收回用户权限)
例如
将用户u7插入学号的权限收回:

revoke insert(sno)
on student
from u7

将用户u9对sc表修改成绩的权限收回:

revoke update(grade)
on sc
from u9

以上就是我的全部内容了,虽然感觉很乱,但是也算对自己所学知识的一次复习了,希望读者朋友们能够在看了这篇文章之后有所收获。
【针对SQL 2008 R2的一点个人小结】_第8张图片

你可能感兴趣的:(sql,数据库,database)