绪论
- 数据库中应避免笛卡尔积的存在。
- 选择、投影、并、差、笛卡尔积、交、连接、除。
- 关系模型的三类完整性约束
- 实体完整性
- 参照完整性
- 用户定义的完整性
一、数据库
数据库操作
CREATE DATABASE SCHOOL;
ALTER DATABASE SCHOOL;
DROP DATABASE SCHOOL;
二、数据表
2.0 SQL语句
创建student数据表
CREATE TABLE student
(
Sno varchar(255) NOT NULL PRIMARY KEY,
Sname varchar(255),
Sex varchar(255),
Sage int,
Sdept varchar(255)
--primary key(Sno,Sname)
--foreign key(Sno) references Student(Sno)
--foreign key(Con) references
)
对表的操作
ALTER TABLE student;
DROP TABLE student;
INSERT INTO student(Sno,Sname,Sex,Sage,Sdept) VALUES ('4799','张三','女',28,'美术')
UPDATE student SET Sname = '李四' WHERE Sname = '张三'
DELETE FROM student WHERE Sname = '张三'
表中增加AllGrades列
ALTER TABLE sc ADD AllGrades NVARCHAR(MAX);
表中删除AllGrades列
ALTER TABLE student
DROP COLUMN AllGrades;
修改字段类型
ALTER TABLE student
ALTER COLUMN Sage varvhar(255);
2.1 SQL 约束
- NOT NULL 约束强制列不接受 NULL 值。
- UNIQUE 约束唯一标识数据库表中的每条记录。
- UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。
- PRIMARY KEY 拥有自动定义的 UNIQUE 约束。
- 每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。
2.2 ALTER
ALTER TABLE 语句用于在已有的表中添加、修改或删除列。
添加列
ALTER TABLE student
ADD ALLGrades varchar(255)
修改列类型
ALTER TABLE student
ALTER COLUMN ALLGrades int
删除列
ALTER TABLE student
DROP COLUMN ALLGrades
2.3 AUTO INCREMENT
Auto-increment 会在新记录插入表中时生成一个唯一的数字。
我们通常希望在每次插入新记录时,自动地创建主键字段的值,无需专门设置 P_Id 值。
我们可以在表中创建一个 auto-increment 字段。
sql
CREATE TABLE student1
(
P_Id int PRIMARY KEY IDENTITY,
Sno varchar(255) NOT NULL,
Sname varchar(255),
Sex varchar(255),
Sage int,
Sdept varchar(255)
)
2.4 UNIQUE
当表已被创建时,如需在列名创建 UNIQUE 约束
sql
ALTER TABLE student
ADD UNIQUE/PRIMARY KEY (Sno)
如需命名 UNIQUE 约束,并定义多个列的 UNIQUE 约束
sql
ALTER TABLE student
ADD CONSTRAINT uc_SME UNIQUE/PRIMARY KEY (Sno,Sname)
如需撤销UNIQUE约束
sql
ALTER TABLE student
DROP CONSTRAINT uc_SME
PRIMARY KEY 约束唯一标识数据库表中的每条记录。
主键必须包含唯一的值。
主键列不能包含 NULL 值。
每个表都应该有一个主键,并且每个表只能有一个主键。
2.5 FOREIGN
一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY。
FOREIGN KEY 约束用于预防破坏表之间连接的动作。
FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
sql
Sno int FOREIGN KEY REFERENCES student(Sno)
如果需要命名 FOREIGN KEY 约束,以及为多个列定义 FOREIGN KEY 约束。
scss
CONSTRAINT fk_PerOrders FOREIGN KEY (Sno)
REFERENCES student(Sno)
如果在 "Orders" 表已存在的情况下为 "Id_P" 列创建 FOREIGN KEY 约束
sql
ALTER TABLE sc
ADD FOREIGN KEY (Sno)
REFERENCES student(Sno)
如果需要命名 FOREIGN KEY 约束,以及为多个列定义 FOREIGN KEY 约束
sql
ALTER TABLE sc
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (Sno)
REFERENCES student(Sno)
如需撤销 FOREIGN KEY 约束
sql
ALTER TABLE sc
DROP CONSTRAINT fk_PerOrders
2.6 CHECK
约束用于限制列中的值的范围。
如果对单个列定义 CHECK 约束,那么该列只允许特定的值。
如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。
CHECK 约束规定 Sage 列必须只包含大于 0 的整数
Sage int NOT NULL CHECK (Sage>0)
如果需要命名 CHECK 约束,以及为多个列定义 CHECK 约束
CONSTRAINT S_Sage_Sdept CHECK (Sage>0 AND Sdept='美术')
如果在表已存在的情况下为 Sage 列创建 CHECK 约束
sql
ALTER TABLE student
ADD CHECK (Sage>0)
如果需要命名 CHECK 约束,以及为多个列定义 CHECK 约束
sql
ALTER TABLE student
ADD CONSTRAINT S_Sage_Sdept CHECK (Sage>0 AND Sdept='美术')
如需撤销 CHECK 约束
sql
ALTER TABLE student
DROP CONSTRAINT S_Sage_Sdept
2.7 DEFAULT
约束用于向列中插入默认值。
如果没有规定其他的值,那么会将默认值添加到所有的新记录。
在 student 表创建时为 Sdept 列创建 DEFAULT 约束:
Sdept varchar(255) DEFAULT '美术'
使用类似 GETDATE() 这样的函数,DEFAULT 约束也可以用于插入系统值:
OrderDate date DEFAULT GETDATE()
如果在表已存在的情况下为 Sdept 列创建 DEFAULT 约束
sql
ALTER TABLE student
ADD CONSTRAINT DF_student_Sdept DEFAULT '美术' FOR Sdept;
撤销 DEFAULT 约束
sql
ALTER TABLE student
DROP CONSTRAINT DF_student_Sdept;
三、SELECT
查询数据库账号和密码
SELECT name,password_hash FROM sys.sql_logins;
聚合查询:
sql
SELECT COUNT(*) AS studentNum
FROM student
WHERE Sage>20;
分组聚合查询:
sql
SELECT Sex,Sdept,COUNT(*)
FROM student
GROUP BY Sex,Sdept;
嵌套查询:
sql
SELECT Sname,Sage
FROM student
WHERE Sex='女'
AND Sage >= (SELECT AVG(Sage)
FROM student
WHERE Sex='男');
3.1 SELECT TOP
从表中选取头几条的记录。
SELECT TOP 2 Sno FROM student
从表中选取整数%的记录。
SELECT TOP 75 PERCENT Sno FROM student
3.2 DISTINCT
返回唯一不同的值
vbnet
SELECT DISTINCT S.Sno,S.Sname,S.Sdept,sc.Cno,sc.Grade
FROM student AS S,sc
WHERE S.Sno=sc.Sno
3.3 ORDER BY;ASC,DESC
ORDER BY 语句用于根据指定的列对结果集进行排序。ASC;升序 DESC;降序
sql
SELECT DISTINCT S.Sno,S.Sname,S.Sdept,sc.Cno,sc.Grade
FROM student AS S,sc
WHERE S.Sno=sc.Sno
ORDER BY Sno Asc,Grade DESC
3.4 GROUP BY
GROUP BY <列名>[HAVING<条件表达式>]
GROUP BY:按列名的值进行分组,该属性列值相等的元组为一组;
HAVING:如果GROUP BY 子句中带HAVING短语,则只有满足条件的组才会被输出;
当使用GROUP BY时,SELECT子句中的列必须是GROUP BY中的列,或者是聚合函数的结果.
这个查询会先将 sc.Sno 为 NULL 的记录排在后面,然后再按照 sc.Sno 升序排序。
sql
SELECT Sno
FROM SC
WHERE Grade>=75
GROUP BY Sno
HAVING COUNT(*)>3;
sql
SELECT Sno,Grade
FROM SC
WHERE Cno='1'
ORDER BY Grade DESC;
sql
SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Cno
HAVING COUNT(*)>3;
当使用GROUP BY时,SELECT子句中的列必须是GROUP BY中的列,或者是聚合函数的结果.
vbnet
SELECT s.Sname,s.Sno,s.Sage,sc.Cno,sc.Grade
FROM student AS s
FULL OUTER JOIN SC AS sc
ON s.Sno=sc.Sno
GROUP BY s.Sname,s.Sno,s.Sage,sc.Cno,sc.Grade
ORDER BY sc.Grade DESC,sc.Sno ASC;
这个查询会先将 sc.Sno 为 NULL 的记录排在后面,然后再按照 sc.Sno 升序排序。
sql
SELECT s.Sname,s.Sno,s.Sage,sc.Cno,sc.Grade
FROM student AS s
FULL OUTER JOIN SC AS sc
ON s.Sno=sc.Sno
ORDER BY sc.Grade DESC,
CASE WHEN sc.Sno IS NULL THEN 1 ELSE 0 END,
sc.Sno ASC;
3.5 LIKE
避免使用 LIKE 以通配符开头的查询,以通配符开头的 LIKE 查询会使索引失效。
%
SELECT * FROM student
WHERE Sname LIKE'%张%'
sql
SELECT * FROM student
WHERE Sname LIKE'__大力'
3.6 BETWEEN
范围之内
SELECT * FROM student
WHERE Sno
NOT BETWEEN '4597' AND '4598'
范围之外
SELECT * FROM student
WHERE Sno
NOT BETWEEN '4597' AND '4598'
3.7 JOIN
INNER JOIN ;(内连接)在表中存在至少一个匹配时,返回行。
vbnet
SELECT S.Sname,S.Sno,sc.Cno,sc.Grade
FROM student AS S
INNER JOIN sc
ON S.Sno=sc.Sno
FULL OUTER JOIN;(全连接)会从左表和右表那里返回所有的行。
sql
SELECT S.Sname,S.Sno,sc.Cno,sc.Grade
FROM student AS S
FULL OUTER JOIN sc
ON S.Sno=sc.Sno
LEFT JOIN;从左表那里返回所有的行,即使在右表没有匹配的行。
vbnet
SELECT S.Sname,S.Sno,sc.Cno,sc.Grade
FROM student AS S
LEFT JOIN sc
ON S.Sno=sc.Sno
RIGHT JOIN;从右表那里返回所有的行,即使在左表没有匹配的行。
vbnet
SELECT S.Sname,S.Sno,sc.Cno,sc.Grade
FROM student AS S
RIGHT JOIN sc
ON S.Sno=sc.Sno
JOIN后面加条件,ON、WHERE、ORDER BY、GROUP BY
sql
CREATE VIEW VW
WITH SCHEMABINDING
AS
SELECT TOP 75 PERCENT S.Sname,S.Sno,sc.Cno,sc.Grade
FROM dbo.student AS S
LEFT JOIN dbo.sc
ON S.Sno=sc.Sno
WHERE Sname LIKE'_%大力'
ORDER BY Grade DESC
GO
SELECT * FROM VW
3.8 UNION
用于合并两个或多个 SELECT 语句的结果集。
UNION内部的SELECT语句必须拥有相同数量的列。
列也必须拥有相似的数据类型,每条 SELECT 语句中的列的顺序必须相同。
不允许重复
sql
SELECT Sno,Sname FROM student
UNION
SELECT Grade FROM sc
允许重复
sql
SELECT Sno,Sname FROM student
UNION ALL
SELECT Grade FROM sc
3.9 SELECT INTO
从一个表中选取数据,然后把数据插入另一个表中。常用于创建表的备份复件或者用于对记录进行存档。
sql
SELECT Sno,Sname into student1 FROM student
3.10 DATA
GETDATE() | 返回当前日期和时间 |
---|---|
DATEPART() | 返回日期/时间的单独部分 |
DATEADD() | 在日期中添加或减去指定的时间间隔 |
DATEDIFF() | 返回两个日期之间的时间 |
CONVERT() | 用不同的格式显示日期/时间 |
3.11 SUBSTRING
CONVERT(varchar(100), rq, 120):
将 rq 字段(假设是日期时间类型)转换为字符串,格式为 yyyy-mm-dd hh:mi:ss。
120 是日期时间格式的样式代码,表示 yyyy-mm-dd hh:mi:ss。
23 表示yyyy-mm-dd
SUBSTRING(字符串, 开始位置, 长度):从字符串中截取一部分。
例:SUBSTRING('2023-10-25 14:30:00', 1, 16) 返回 2023-10-25 14:30。
SUBSTRING('2023-10-25 14:30:00', 1, 10) 返回 2023-10-25
只需要前 10 个字段
select convert(date,ryrq) as 入院日期 from brxx
select convert(varchar(10),ryrq,23) as 入院日期 from brxx
select SUBSTRING(convert(varchar(100),ryrq,120),1,10) as 入院日期 from brxx
select format(ryrq,'yyyy-MM-dd') as 入院日期 from brxx
3.12 NULL
NULL 值是遗漏的未知数据。
默认地,表的列可以存放 NULL 值。
如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录。这意味着该字段将以 NULL 值保存。
NULL 值的处理方式与其他值不同。
NULL 用作未知的或不适用的值的占位符。
注释:无法比较 NULL 和 0;它们是不等价的。
仅选取NULL值
sql
SELECT Sno,Sname,Sdept,ALLGrades FROM student
WHERE ALLGrades IS NULL
选取非NULL值
sql
SELECT Sno,Sname,Sdept,ALLGrades FROM student
WHERE ALLGrades IS NOT NULL
值是 NULL 则返回 0
vbnet
SELECT Sno,Grade*(Grade+ISNULL(UnitsOnOrder ,0)) AS PriceNum
FROM Products
四、函数
AVG(column) | 返回某列的平均值 |
---|---|
COUNT(column) | 返回某列的行数(不包括NULL值) |
COUNT(*) | 返回被选行数 |
COUNT(DISTINCTcolumn) | 返回相异结果的数目 |
FIRST(column) | 返回在指定的域中第一个记录的值(SQLServer2000 不支持) |
LAST(column) | 返回在指定的域中最后一个记录的值(SQLServer2000 不支持) |
MAX(column) | 返回某列的最高值 |
MIN(column) | 返回某列的最低值 |
SUM(column) | 返回某列的总和 |