目录
一:SQL概述
1:定义
SQL(Structured Query Language):结构化查询语言,是关系数据库的标准语言
SQL是一个通用的、功能极强的关系数据库语言
2:特点
1.综合统一
集数据定义语言(DDL),数据操纵语言(DML),数据控制语言(DCL)功能于一体。可以独立完成数据库生命周期中的全部活动。
2.高度非过程化
SQL只要提出“做什么”,无须了解存取路径。
存取路径的选择以及SQL的操作过程由系统自动完成。
3.面向集合的操作方式
4.以同一种语法结构提供多种使用方式
SQL是独立的语言
能够独立地用于联机交互的使用方式
SQL又是嵌入式语言
SQL能够嵌入到高级语言(例如C,C++,Java)程序中,供程序员设计程序时使用
5.语言简洁,易学易用
SQL功能极强,完成核心功能只用了9个动词。
二:范例:创建一个学生-课程数据库
要求:
学生-课程模式 S-T :
学生表:Student(Sno,Sname,Ssex,Sage,Sdept)
课程表:Course(Cno,Cname,Cpno,Ccredit)
学生选课表:SC(Sno,Cno,Grade)
学生表:
学 号 Sno | 姓 名 Sname | 性 别 Ssex | 年 龄 Sage | 所 在 系 Sdept |
200215121 | 阿大 | 男 | 21 | 数学 |
200215122 | 阿二 | 男 | 20 | 数学 |
200215123 | 阿三 | 女 | 19 | 音乐 |
200515125 | 阿四 | 女 | 18 | 音乐 |
课程表:
课程号 Cno | 课程名 Cname | 先行课 Cpno | 学分 Ccredit |
1 2 3 4 5 6 7 | 数据库 数学 信息系统 操作系统 数据结构 数据处理 PASCAL语言 | 5 1 6 7 6 | 4 2 4 3 4 2 4 |
学生选课表:
学 号 Sno | 课程号 Cno | 成绩 Grade |
200215121 200215121 200215121 200215122 200215122 | 1 2 3 2 3 | 92 85 88 90 80 |
三:数据定义
这一小节对应的是数据库中表的创建和增删这几个步骤,比较重要的查(select)和改留在后文
对需要建立的三个表进行定义,我们将需要定义的属性当做表中的列名,方便我们以后在这些表中按照列名插入数值。
SQL的数据定义功能: 模式定义、表定义、视图和索引的定义
1:定义基本表
该步骤的目的是创建一个空的表,它的每一列代表着不同的属性
语法:
CREATE TABLE <表名>
(<列名> <数据类型>[ <列级完整性约束条件> ]
[,<列名> <数据类型>[ <列级完整性约束条件>] ] …
[,<表级完整性约束条件> ] );
对于语法中的名词解释:
表名:即你将要创建的这个表的名字
列名:表中列的名字,一般表现为在表中包含的某一种属性
数据类型:直接用下图来说明:
开始建立“学生”表Student,学号是主码,姓名取值唯一。
点击新建查询,然后就可以编写代码,最后点击执行,此时将建立一个空的学生表
create table student
(Sno CHAR(9) PRIMARY KEY,
Sname CHAR(20) UNIQUE,
Ssex CHAR(2),
Sage INT,
Sdept CHAR(20)
);
注:编写代码时需要注意SQL语言时的编写习惯,其中各列的信息用的是小括号”()”来包括而不是平时常用的大括号”{}”,而且每句最后要用逗号隔开,这点常用Python编写程序的可能会忽略,最后需要用分号‘;’来结尾否则会报错
如图,这是还没有插入数据的空表:
建立课程表:
create table Course
(Cno CHAR(4)PRIMARY KEY,
Cname CHAR(10),
Cpno CHAR(4),
Ccredit SMALLINT
FOREIGN KEY (Cpno) REFERENCES Course(Cno)
/*Cpno是外码,被参照表是Course,被参照列是Cno*/
);
未插入数据时的课程表:
创建学生选课表
create table sc
(Sno CHAR(9),
Cno CHAR(4),
Grade SMALLINT,
PRIMARY KEY(Sno, Cno),
/* 主码由两个属性构成,必须作为表级完整性进行定义*/
FOREIGN KEY(Sno)REFERENCES student(Sno),
/* 表级完整性约束条件,Sno是外码,被参照表是Student */
FOREIGN KEY(Cno)REFERENCES Course(Cno)
/* 表级完整性约束条件,Cno是外码,被参照表是Course*/
);
未插入数据的sc表:
至此为止,三个主要的表格已经创建完毕,接下来要做的就是往这几个表中插入数据和进行增删改查等基本操作。
2:插入数据(增)
INSERT INTO 语句用于向表格中插入新的行。
使用语法:
INSERT INTO 表名VALUES (值,值。。。)
使用实例如图所示:
但是这样太过繁琐,也可以这样编写:
INSERT INTO 表名(列名,列名。。。)VALUES (值,值。。。)
INSERT INTO student (Sno,Sname,Ssex,Sage,Sdept)
VALUES
('200215121','阿大','男',21,'数学'),
('200215122','阿二','男',20,'数学'),
('200215123','阿三','女',19,'音乐'),
('200515125','阿四','女',18,'音乐');
运行结果:
插入课程信息表格:
INSERT INTO Course(Cno,Cname,Cpno,Ccredit)
VALUES
(1,'数据库',5,4),
(2,'数学',null,2),
(3,'信息系统',1,4),
(4,'操作系统',1,4),
(5,'数据结构',7,4),
(6,'数据处理',null,2),
(7,'PASCAL语言',6,4);
填充sc表:
INSERT INTO sc(Sno,Cno,Grade)
VALUES ('200215121',1,92),
('200215121',2,85),
('200215121',3,88),
('200215122',2,90),
('200215122',3,80);
Notes:在进行数据插入过程中遇到的几个问题:
Q1:由于表sc中存在外键,所以当student和course表需要清除数据的时候,需要先将外键删除,之后才可以清除数据,并且清除之后还要重新建立外键,其过程如下所示:
以student表为例:
Step1:查找所有引用了 'student' 表的外键约束。您可以使用以下SQL语句:
SELECT name, object_name(parent_object_id)
FROM sys.foreign_keys
WHERE referenced_object_id = object_id('student');
Step2:对于返回的每个外键约束,使用以下SQL语句删除它:
ALTER TABLE <referencing_table> DROP CONSTRAINT <constraint_name>;
其中,<referencing_table>是引用 'student' 表的表名,<constraint_name>是外键约束的名称。
Step3:现在,您可以截断 'student' 表:
TRUNCATE TABLE student;
Step4:重新创建您删除的外键约束。
ALTER TABLE <referencing_table> ADD CONSTRAINT <constraint_name> FOREIGN KEY (<column_name>) REFERENCES student(<column_name>);
其中,<referencing_table>是引用 'student' 表的表名,<constraint_name>是外键约束的名称,<column_name>是外键列的名称。
请注意,截断表将删除该表中的所有数据,并且无法恢复。在执行此操作之前,请确保您已经备份了所有数据。
至此,对外键的删除和恢复工作算是完成了。
Q2:如果以前在别的库里进行过表的操作,如何确保自己这次建的表是在自己需要的库中:
在左上角有个图标可以选择自己需要操作的库:
Q3:如何在使用INSERT INTO语句时插入空值:
可以使用关键字NULL来表示空值。在INSERT INTO语句中。
Q4:例如sc中存在要引入外键的表还需要再次插入外键的数值吗:
是的,而且输入的列值必须是真实存在的,否则将引发外键约束错误从而报错。
3:数据删除(删)
删除行
语法:DELETE FROM 表名称 WHERE 列名称 = 值;
清除表的数据(保留表,但是数据全部被清除)
语法:TRUNCATE TABLE 表名称;
删除表(什么都不剩)
语法:DROP TABLE 表名称;
4:修改数据(改)
单纯地修改数值使用update
语法:UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
比如要将student表中阿大的年龄改成25,专业改为计算机:
update student set sage=25,Sdept='计算机' where sname='阿大'
修改表的整体属性使用ALTER:
在数据库中,使用ALTER命令可以修改表的结构和属性,包括添加、删除、修改列、约束、索引等。
语法:
ALTER TABLE <表名>
[ ADD <新列名> <数据类型> [ 完整性约束 ] ]
[ DROP <完整性约束名> ]
[ ALTER COLUMN<列名> <数据类型> ];
若要在“student”表中添加一个名为“email”的新列,其数据类型为VARCHAR,长度为255个字符。
ALTER TABLE student ADD email VARCHAR(255);
注意:此时如若想要填入email的值,不可使用insert函数,因为如果在INSERT INTO语句中只指定了某些列的值,而其他列没有指定值,则这些未指定值的列将被设置为默认值或NULL(如果没有指定默认值)。
此时就应该使用update 语句:
update student set email='123@qq.com' where Sname='阿大'
update student set email='456@qq.com' where Sname='阿二'
update student set email='789@qq.com' where Sname='阿三'
update student set email='741@qq.com' where Sname='阿四'
四:数据查询(查)
语法:
SELECT [ALL|DISTINCT] <目标列表达式>
[,<目标列表达式>] …
FROM <表名或视图名>[, <表名或视图名> ] …
[ WHERE <条件表达式> ]
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ];
查询的内容比较多,这里分为四部分来说:
单表查询;连接查询;嵌套查询;集合查询
1:单表查询
(1)选择表中的若干列
语法:
Select 列1,列2,...
From 表名
查看姓名和学号:
select Sno,Sname
from student
(2)查询全部列
语法:
select * from 表名称
(3)查询经过计算的值
SELECT子句的<目标列表达式>可以为:
算术表达式
字符串常量
函数
列别名
实例:使用birth来表示student中学生的出生年
select Sname,2023-Sage as birth
from student;
(4)取消重复的值
以sc中的sno为例
关键词:DISTINCT
select distinct Sno
from sc;