【SQL】Sql Server SQL语句学习

1. 什么是SQL

什么是SQL(Structured Query Language)?
SQL是结构化查询语言的缩写,用来访问和操作数据库系统。SQL语句既可以查询数据库中的数据,也可以添加、更新和删除数据库中的数据,还可以对数据库进行管理和维护操作。不同的数据库,都支持SQL,这样,我们通过学习SQL这一种语言,就可以操作各种不同的数据库。

虽然SQL已经被ANSI组织定义为标准,不幸地是,各个不同的数据库对标准的SQL支持不太一致。并且,大部分数据库都在标准的SQL上做了扩展。也就是说,如果只使用标准SQL,理论上所有数据库都可以支持,但如果使用某个特定数据库的扩展SQL,换一个数据库就不能执行了。例如,Oracle把自己扩展的SQL称为PL/SQL,Microsoft把自己扩展的SQL称为T-SQL。

现实情况是,如果我们只使用标准SQL的核心功能,那么所有数据库通常都可以执行。不常用的SQL功能,不同的数据库支持的程度都不一样。而各个数据库支持的各自扩展的功能,通常我们把它们称之为“方言”。

总的来说,SQL语言定义了这么几种操作数据库的能力:

DDL:Data Definition Language

DDL允许用户定义数据,也就是创建表、删除表、修改表结构这些操作。通常,DDL由数据库管理员执行。

DML:Data Manipulation Language

DML为用户提供添加、删除、更新数据的能力,这些是应用程序对数据库的日常操作。

DQL:Data Query Language

DQL允许用户查询数据,这也是通常最频繁的数据库日常操作。

2. 关系模型

2.1 主键

主键大家都懂,还有一个东西叫做联合主键,允许通过多个字段唯一标识记录,即两个或更多的字段都设置为主键,这种主键被称为联合主键。

对于联合主键,允许一列有重复,只要不是所有主键列都重复即可:
例如我们可以把student类中的id和name都设置为主键,语法如下:

ALERT TABLE student
ADD CONSTRAINT PK_ID PK_NAME PRIMARY KEY (id,name)

注意:SQL Server这个表中之前如果已经有主键了,是不能够执行上面的语句的,只有将之前的主键取消并且保存之后才可以成功执行。

没有必要的情况下,我们尽量不使用联合主键,因为它给关系表带来了复杂度的上升。

2.2 外键

就是如果一个 student 表中存在一个字段 class_id , 是与 class 表中的 class_id 字段含义相同并且关联起来的,那么通过 class_id 的字段,可以把数据与另一张表关联起来,这种列称为外键 。
外键并不是通过列名实现的,而是通过定义外键约束实现的:

ALTER TABLE students
ADD CONSTRAINT fk_class_id
FOREIGN KEY (class_id)
REFERENCES classes (id);

外键约束的名称fk_class_id可以任意,FOREIGN KEY (class_id)指定了class_id作为外键,REFERENCES classes (id)指定了这个外键将关联到classes表的id列(即classes表的主键),引用的列必须是主键约束或者是唯一约束。
通过定义外键约束,关系数据库可以保证无法插入无效的数据。即如果classes表不存在id=99的记录,students表就无法插入class_id=99的记录。

由于外键约束会降低数据库的性能,大部分互联网应用程序为了追求速度,并不设置外键约束,而是仅靠应用程序自身来保证逻辑的正确性。这种情况下,class_id仅仅是一个普通的列,只是它起到了外键的作用而已。

要删除一个外键约束,也是通过ALTER TABLE实现的:

ALTER TABLE students
DROP FOREIGN KEY fk_class_id;

注意:删除外键约束并没有删除外键这一列。删除列是通过DROP COLUMN ...实现的。

2.3 索引

在关系数据库中,如果有上万甚至上亿条记录,在查找记录的时候,想要获得非常快的速度,就需要使用索引。

索引是关系数据库中对某一列或多个列的值进行预排序的数据结构。通过使用索引,可以让数据库系统不必扫描整个表,而是直接定位到符合条件的记录,这样就大大加快了查询速度。

为列创造索引:

ALTER TABLE table_name
ADD INDEX index_name(column_name1,column_name2);

索引的效率取决于索引列的值是否散列,即该列的值如果越互不相同,那么索引效率越高。反过来,如果记录的列存在大量相同的值,例如gender列,大约一半的记录值是M,另一半是F,因此,对该列创建索引就没有意义。

可以对一张表创建多个索引。索引的优点是提高了查询效率,缺点是在插入、更新和删除记录时,需要同时修改索引,因此,索引越多,插入、更新和删除记录的速度就越慢。

对于主键,关系数据库会自动对其创建主键索引。使用主键索引的效率是最高的,因为主键会保证绝对唯一。

唯一索引(唯一约束)

有些列根据业务要求,具有唯一性约束:例如不能出现两条记录存储了同一个身份证号。这个时候,就可以给该列添加一个唯一索引。例如,我们假设students表的name不能重复:

ALTER TABLE students
ADD UNIQUE INDEX uni_name (name);

通过UNIQUE关键字我们就添加了一个唯一索引。

也可以只对某一列添加一个唯一约束而不创建唯一索引:

ALTER TABLE students
ADD CONSTRAINT uni_name UNIQUE (name);

这种情况下,name列没有索引,但仍然具有唯一性保证。

无论是否创建索引,对于用户和应用程序来说,使用关系数据库不会有任何区别。这里的意思是说,当我们在数据库中查询时,如果有相应的索引可用,数据库系统就会自动使用索引来提高查询效率,如果没有索引,查询也能正常执行,只是速度会变慢。因此,索引可以在使用数据库的过程中逐步优化。

3. DDL操作

3.1 对库操作

添加数据库:

CREATE DATABASE kaishui

删除数据库:

DROP DATABASE kaishui

备份SQLserver

--创建备份数据库的device
USE master
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'
--- 开始 备份
BACKUP DATABASE pubs TO testBack

3.2 对表操作

3.2.1 创建和删除表

创建新表

CREATE TABLE student(
-- IDENTITY(1,1)表示从1开始,每次自增1
id INT NOT NULL IDENTITY(1,1)  PRIMARY KEY,
student_name VARCHAR(20) DEFAULT NULL,
Linux INT DEFAULT 0,
MYSql INT DEFAULT 0,
Java INT DEFAULT 0,
class_name VARCHAR(20) DEFAULT NULL
);

往表中添加数据

INSERT INTO student (student_name,Linux,MYSql,Java,class_name) VALUES ('陈二',70,90,70,'17')

删除一个表

DROP TABLE student1
3.2.2 添加约束

为表里的一列添加主键约束和唯一约束在上面已经写过,这里写为一列添加检查约束。
例如我的 student 表中有 age 字段,我添加的学生中的年龄都不能超过30,那么语句如下:

ALERT TABLE student
ADD CONSTRAINT Check_age CHECK (age<30)

为表里的一列添加默认约束,例如我的 student 表中 gender 字段默认为男

ALERT TABLE student
ADD CONSTRAINT Default_sex DEFAULT '男' FOR gender
3.2.3 对列进行操作

添加一列:

ALTER TABLE student
ADD score varchar(20)

修改列的数据类型

ALTER TABLE student
ALTER COLUMN name VARCHAR(20)

删除列

ALTER TABLE student
DROP COLUMN name

修改列名

EXEC SP_RENAME '表名.列名','age1'

修改表名

EXEC SP_RENAME 'student1','stu'
3.2.4 分页查询

使用SELECT查询时,如果结果集数据量很大,比如几万行数据,放在一个页面显示的话数据量太大,不如分页显示,每次显示100条。
例如现在,我们把结果集分页,每页5条记录。要获取第1页的记录,可以使用:

SELECT TOP 5 * FROM (SELECT ROW_NUMBER() OVER ( ORDER BY  id ) AS RowNumber,
* from ( select*  from student) as x )  as z  WHERE z.RowNumber >=1 and z.RowNumber<=5

如果要第二页第三页,就在后面的RowNumber 修改就可。

3.2.5 连接查询

内连接:

SELECT s.id, s.name, s.class_id, c.name class_name, s.gender, s.score
FROM students s
INNER JOIN classes c
ON s.class_id = c.id;

外连接:

SELECT s.id, s.name, s.class_id, c.name class_name, s.gender, s.score
FROM students s
RIGHT OUTER JOIN classes c
ON s.class_id = c.id;

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_34659777/article/details/88916376