数据库-SQL Server

绪论

  1. 数据库中应避免笛卡尔积的存在。
  2. 选择、投影、并、差、笛卡尔积、交、连接、除。
  3. 关系模型的三类完整性约束
  • 实体完整性
  • 参照完整性
  • 用户定义的完整性

一、数据库

数据库操作 复制代码
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) 返回某列的总和
相关推荐
Alan5215914 天前
Java + SQLServer:一键导出数据库表结构为 Markdown 文档
java·sql server
梓芮.1 个月前
T-SQL 语言基础: 集合运算(Union, Intersect, Except)
sql server·t-sql·t-sql 子查询·ms sql·t-sql 集合运算·t-sql 集合交集差集·t-sql 集合 并集
全栈小51 个月前
【Sql Server】在SQL Server中生成雪花ID(Snowflake ID)
sql server·雪花id
ManageEngine卓豪1 个月前
如何监控 SQL Server
数据库·sql server·数据库性能
kanlon1 个月前
SQL server分页的四种方法(算很全面了)
后端·sql server
CoolDog;1 个月前
MySql 主从(备)部署 | 冷备份
sql server
程序员爱钓鱼2 个月前
Go 语言高效连接 SQL Server(MSSQL)数据库实战指南
后端·go·sql server
码农研究僧2 个月前
SQL Server 视图的更新排查及清除缓存
缓存·sql server·视图刷新
夜光小兔纸3 个月前
SQL Server 建立每日自动log备份的维护计划
运维·数据库·sql server