T-SQL操作SQLSERVER——基本语法

52 阅读9分钟

基本语法

查询表中数据的基本语法

SELECT 列名1, 列名2, ... FROM 表名;

条件查询的语法:

SELECT column1, column2, ... FROM table_name WHERE .... ;

新建表的基本语法

CREATE TABLE 表名 ( 列名1 数据类型 [约束条件], 列名2 数据类型 [约束条件], ... );

删除表的基本语法

DROP TABLE 表名;

更新表中数据基本语法

UPDATE 表名 SET 列名1 = 新值1, 列名2 = 新值2, ... WHERE 条件;

删除表中数据的基本语法

DELETE FROM 表名 WHERE 条件;

给某个表添加一个数据的基本语法

INSERT INTO 表名 (列名1, 列名2, ...) VALUES (值1, 值2, ...);

给某个表添加多个数据的基本语法

INSERT INTO 表名 (列名1, 列名2, ...) VALUES (值1, 值2, ...), VALUES (值1, 值2, ...), VALUES (值1, 值2, ...)

Union插入去重

INSERT INTO 表名 (列名1, 列名2, ...) select 值1 union select 值1 union select 值2 union select 值2

克隆表的数据

-- 目标表存在 --注意:1.目标表中的列名 -- 2.保存数据,列的类型一样 --3.目标表不能设置自动递增

insert into 目标表 select 列名, ... from 数据源表 例: insert into Book
select BookId as id,BookName as name from BookOld

--目标表不存在 --问题:不想让目标表列名与源表列名一样 --as

select 列名, ... into 目标表名 from 数据源表名 例: select BookId as id,BookName as name into Book from BookOld

修改表名

ALTER TABLE 旧表名 RENAME TO 新表名;

添加列

ALTER TABLE 表名 ADD 列名 数据类型;

删除列

ALTER TABLE 表名 DROP COLUMN 列名;

修改列的数据类型

ALTER TABLE 表名 MODIFY 列名 新数据类型; 或 ALTER TABLE 表名 ALTER COLUMN 列名 TYPE 新数据类型;

修改列的默认值

ALTER TABLE 表名 ALTER COLUMN 列名 SET DEFAULT 默认值;

删除列的默认值

ALTER TABLE 表名 ALTER COLUMN 列名 DROP DEFAULT;

重命名列

ALTER TABLE 表名 RENAME COLUMN 旧列名 TO 新列名;

修改列的约束(如 NOT NULL)

ALTER TABLE 表名 MODIFY 列名 数据类型 [NOT NULL];

添加表的约束(如 PRIMARY KEY)

ALTER TABLE 表名 ADD CONSTRAINT 约束名 PRIMARY KEY (列名);

删除表的约束

ALTER TABLE 表名 DROP CONSTRAINT 约束名;

添加外键约束

ALTER TABLE 表名 ADD CONSTRAINT 约束名 FOREIGN KEY (列名) REFERENCES 另一个表(列名);

删除外键约束

ALTER TABLE 表名 DROP CONSTRAINT 外键约束名;

索引

-- 1.什么的列可以创建索引? -- 列的值是唯一的,就可以创建索引 -- 2:索引有什么作用? -- 索引提高了查询数据的速度,针对 以万为单位的数据查询应该使用索引。 -- 经常更新的数据,不要用索引。 -- 3:索引的优点和缺点? -- 优点:查询数据块 -- 缺点:占据内存大 -- 4:怎么使用索引查询,才会感觉的速度杀 -- 当你使用列作为查询条件时候,数据库服务发现该列为索引列,数据库服务就会进行相关的算法 -- 从而提升查询速度 -- 测试方式:找一个10w条数据的表,分两次查询,一个使用索引列查新,一个用普通列拆线呢 -- 比较响应的时间、

聚集索引

CREATE CLUSTERED INDEX 索引名 ON 表名 (列名1, 列名2, ...);

例:create clustered index PK__BookInfo on BookInfos(BookId) -- 常用:with中什么也不写 with ( -- 默认值 off -- on 验证索引是否存在,如果存在先删除再创建 -- 注意:第一次新建索引时会报错。, -- off 如果索引存在,提示一个错误 drop_existing= on )

非聚集索引

CREATE (unique)NONCLUSTERED INDEX 索引名 ON 表名 (列名1, 列名2, ...);

例:create unique nonclustered index Uq_BookName_index on BookInfos(BookName) with ( drop_existing= off, pad_index = on, --是否填充索引,设置 fillfactor才有效 fillfactor = 50, -- 填充因子,表示创建索引时,每个索引页的数据占用索引页的百分比 ignore_dup_key=on --向唯一索引列插入,重复值会忽略重复值 )


实验一:创建宿舍管理系统数据库

-- 编辑器的操作: -- 如果不选脚本,默认执行所有脚本,按照从上往下顺序执行 -- 如果选中脚本,仅执行选中的脚本

-- 因为你需要再系统数据库下面操作数据库,所以编写sql文档的第一步:使用系统数据库

use master
go -- 执行上面的内容

-- 需求描述

创建数据库

ChuangDingDB 数据库实例,从代码角度:相当于变量赋值为数据库实例

Create Database ChuangDingDB 
On Primary  -- 主要文件
(
	name='ChuangDingDB', -- 名字,注意不是主文件的文件面
	fileName = 'D:\data\ChuangDingDB.mdf', -- 存储路径(绝对路径)
	size=10MB,  -- 初始大小
	-- Filegrowth = 10%
	filegrowth = 1MB  -- 增量
)
Log on -- 日志文件
(
	name = 'ChuangDingDB_Log',
    fileName = 'D:\data\ChuangDingDB_Log.ldf', -- 存储路径(绝对路径)
	size=10MB,  -- 初始大小
    filegrowth = 10%
)

删除数据库 注意:当数据库没有创建时,这里会报错。

drop database ChuangDingDB

完整备份

backup database ChuangDingDB to disk = 'D:data\ChuangDingDB_Full_backup.bak'

差异备份

backup database ChuangDingDB to disk = 'D:data\ChuangDingDB_Diff_backup.bak' 
with differential

备份还原

restore database ChuangDingDB from disk='D:\data\ChuangDingDB_Full_backup.bak'
with replace,recovery

实验流程

清空数据库和备份文件。。 -- 执行新建数据库 -- 新建表格,输入一行数据。 -- 执行完全备份 -- 再次输入3条数据, -- 执行差异备份 -- 删除表格 -- 开始还原完成还原差异备份的需求 -- 0:脱机 -- 1:先执行不覆盖的完全备份还原 -- 2:再执行差异备份还原

1:先还原完全备份-- 注意 不覆盖

restore database ChuangDingDB from disk='D:\data\ChuangDingDB_Full_backup.bak'
with replace,norecovery

-- 2:再次还原差异备份

差异还原

restore database ChuangDingDB from disk='D:\data\ChuangDingDB_Diff_backup.bak'
with recovery

-- 实验:事务日志备份以及还原 -- 删除数据库;清空数据库 -- 新建数据库,新建表,添加条数据 -- 完全备份 -- 添加n 条数据, -- 事务日志备份 -- 删除表 -- 脱机 -- 不覆盖还原完全备份 -- 覆盖还原事务日志备份 ———————————————————————————————————————————————

-- 先完全备份 -- 再事务日志备份

-- 完全备份

backup database ChuangDingDB to disk = 'D:\data\ChuangDingDB_Full_backup.bak'

-- 事务日志备份

backup log ChuangDingDB to disk='D:\data\ChuangDingDB_Log_backup.bak'

-- 还原 -- 1.先还原完全备份--- 不覆盖

restore database ChuangDingDB from disk='D:\data\ChuangDingDB_Full_backup.bak'
with replace,norecovery

-- 2.再还原事务日志备份 -- 覆盖

restore database ChuangDingDB from disk='D:\data\ChuangDingDB_Log_backup.bak'
with recovery

查看系统数据库中信息

-- 以下代码,需要一行一行的执行,才能看到每行的效果 -- 注意:不要打开文件后,马上点击执行

use master
go

查询系统下所有的数据库

-- select 查询 -- from 从哪里查询呢 -- * 所有列 -- sys.databases 获取所有数据库

select * from sys.databases

查询用户定义的数据库。

database_id 列名称 -- where 筛选条件。 and or
--database_id 是每个数据库的唯一标识符,系统数据库通常有固定的 ID 值: --master 的 database_id 为 1 --tempdb 的 database_id 为 2 --model 的 database_id 为 3 --msdb 的 database_id 为 4 --因此,database_id > 4 的条件排除了系统数据库 master、tempdb、model 和 msdb,只返回用户创建的数据库。

select * from sys.databases where database_id > 4

查询数据库的所有实例对象(表,视图,存储过程,约束....)

sys.objects 数据库实例:表,视图,存储过程,索引,约束....

查询ChuangDingDB中所有实例

select * from ChuangDingDB.sys.objects
select * from ChuangDingDB.sys.objects where type='U'  -- 表
select * from ChuangDingDB.sys.objects where type='V'  -- 视图
select * from ChuangDingDB.sys.objects where type='PK'  -- 主键
select * from ChuangDingDB.sys.objects where type='F'    -- 外键
select * from ChuangDingDB.sys.objects where type='UQ'   -- Unique 唯一键
select * from ChuangDingDB.sys.objects where type='TR'   -- 触发器
select * from ChuangDingDB.sys.objects where type='D'    -- default 默认值
select * from ChuangDingDB.sys.objects where type='P'  -- proc
go

-- 使用 ChuangDingDB 数据库, -- 作用:下面的 select insert update delet .... 操作的都是 ChuangDingDB 数据库

查询ChuangDingDB数据库的所有表

use ChuangDingDB
select * from sys.objects where type='U'
-- select * from ChuangDingDB.sys.objects where type='U'

查询 a 表中所有列

oject_id() 作用:获取表的id -- syscolumns 或者 sys.columns 表示:所有的列

select * from syscolumns where id=OBJECT_ID('a')
select * from sys.types   -- 类型表

查询满足条件部分列数据

select id,name from syscolumns  where id=OBJECT_ID('a')

获取指定数据库中,表,视图的列结构信息

use SecondDB -- 这里写什么数据库,下面获取的就是哪个 数据库的表 视图 列的结构信息。
select o.name ,c.name ,t.name,c.max_length
from sys.tables As o,sys.columns As c,sys.types As t
where o.type in('u','v') And o.object_id = c.object_id And c.user_type_id = t.user_type_id
Order by o.name,c.name,t.name,c.max_length
                                                  ||
select o.name,c.name,t.name,c.max_length
from ChuanDingDB.sys.tables As o,ChuanDingDB.sys.columns As c,ChuanDingDB.sys.types As t
where o.type in('u','v') and o.object_id=c.object_id and c.user_type_id=t.user_type_id
Order by o.name,c.name,t.name,c.max_length

-- as 别名,针对取值特别长的情况下。可以使用as 把名字变短 -- sys.tables As o 将 sys.tables 的值 赋值为 o -- o.name 的值为 sys.tables.name -- o.type in('u','v') 获取type列下 为 u 和v 的数据


测试:

-- 再每次测试创建表代码时,需要先执行删除表 -- 否者报错 -- 测试:新建表后,输入数据,看约束是否有用 -- 输入正确,输出错误看是否报错 -- 注意:删除表后,刷新表,创建表后,刷新

use ChuangDingDB

创建表

create table StudentTb
(
	-- 字段 名,类型,约束
	-- 约束:主键,外键,不能为空,范围,默认值,唯一
	-- not null 不能为空
	-- primary key  设置主键
	-- check(条件表达式)   范围
		-- and 并列 都成立
		-- or 选择 只有一个成立
		-- in() 等于值
	-- unique 唯一
	-- foreign key 外键列 reference 表名(主键列)   绑定外键
	-- identity(起始值,增改良) 自动递增
	Id int primary key identity(101,1) not null,  -- 主键  不能为空
	StudentName varchar(10) unique not null,-- 唯一  不能为哦那个
	Age int check(Age>0 And Age < 150) not null, --值0-149  不能为空
	Sex nvarchar(1) check(Sex in ('男','女')) ,  -- 值只能是  男或者女
	HouseId int foreign key (HouseId) references HouseTable(id), -- 外键
	ClassId int, 
)
drop table StudentTb

练习,sql对数据中表,实现 插入,删除,更新 查询数据

-- 实验步骤 -- 1.直接执行所有脚本。 -- 2:注意:编写报错,不影响执行,

use ChuangDingDB
go

-- 插入数据
-- 1.插入一条数据
-- 2.插入多条数据,批量添加
-- 3.克隆表数据

-- 1.插入一条数据
insert into StudentTb (StudentName,Age,Sex,HouseId,ClassId) values ('杨栏',21,'女',1,101)

-- 2:插入多条数据
insert into StudentTb (StudentName,Age,Sex,HouseId,ClassId) values 
('杨三',21,'女',1,101),
('杨四',21,'女',2,101),
('杨五',21,'女',1,101)

-- 查询StudentTb 中所有数据
select * from StudentTb
-- 查询StudentTb中StudentName,Age 列数据
select StudentName,Age from StudentTb

-- 更新,StudentTb中StudentName为杨三 将Sex变为男  Age 变为33
update StudentTb set Sex='男',Age=33 where StudentName='杨三'

-- 删除

delete from StudentTb where StudentName='杨三'
-- 删除StudentTb表中age为21的所有数据
delete from StudentTb where Age=21