SQL Server 实战常见问题总结
Posted 王睿丶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL Server 实战常见问题总结相关的知识,希望对你有一定的参考价值。
文章目录
- 1、分离
- 2、增、删、改代码
- 3、创建数据库
- 4、2014企业版安装包
- 5、更改数据库名
- 6、建表语句,设置种子数量与增量以及设置主键 代码
- 7、导入数据与导出数据到表的方法
- 8、表的操作
- 9、主键、外键、唯一性约束、检查约束
- 10、设置外键+组合键(唯一性约束)、修改取值范围、设置某列的默认值
- 11、查询前10%的数据、查询并参与计算显示出数据、查询前10行数据、多重升序降序查询、去掉重复值、替换列名显示
- 12、附加(如何导入外部文件数据库)
- 13、条件查询、比较运算符查询、模糊查询、枚举查询、范围查询、空值查询、多重条件查询
- 14、条件查询、比较运算符查询、模糊查询、枚举查询、范围查询、空值查询、多重条件查询
- 15、年龄查询、条件查询、多表查询、姓氏查询
- 16、多表查询、个数计算、多重约束条件、两表间的交集、多表之间的关系分析
- 17、视图
- 18、索引信息
- 19、存储过程(上)
- 20、存储过程(下)
- 21、触发器(上)
- 22、触发器(中)
- 23、触发器(下)
喜欢记得点个赞哟,我是王睿,很高兴认识大家!
1、分离
use master
go
exec sp_detach_db 'EMIS301'
2、增、删、改代码
增:
use master
go
alter database EMIS301
add file
( name='emis301_data',
filename='D:\\Database301\\emis301_data.ndf',
size=5MB,
maxsize=100MB,
filegrowth=5MB
)
go
———————————————————————————————————————————
改:
alter database EMIS301
modify file
(
name='emis301_data',
filename='.ndf',
size = 8Mb,
maxsize=150Mb,
filegrowth=
)
go
———————————————————————————————————————————
删:
alter database EMIS301
remove file emis301_data
go
3、创建数据库
4、2014企业版安装包
5、更改数据库名
use master
go
exec sp_renamedb 'EMIS308','EMIS301'
go
6、建表语句,设置种子数量与增量以及设置主键 代码
USE EMIS301
GO
CREATE TABLE table_student2_课程注册
(
注册号 bigint IDENTITY (10000000,1) NOT NULL CONSTRAINT[PK_t_course_reg] PRIMARY KEY,
学号 char(12) NOT NULL,
学程号 char(4) NOT NULL,
教师编号 char(12) NOT NULL,
学年 char(4) NULL,
学期 tinyint NULL,
收费否 bit NULL,
注册 bit NULL,
成绩 decimal(5,2) NULL,
学分 tinyint NULL
)
GO
可以看到第一列很长,那么代表什么呢?我们来分析一下这句代码:
注册号 bigint IDENTITY (10000000,1) NOT NULL CONSTRAINT[PK_t_course_reg] PRIMARY KEY,
- 注册号表示 — 列名
- IDENTITY (10000000,1)
第一个参数表示:种子数目,第二个参数表示:种子增量 - .NOT NULL — 不允许此项值为空
- CONSTRAINT[PK_t_course_reg] PRIMARY KEY, 设置这一列为主键,然后它的主键名叫:PK_t_course_reg
7、导入数据与导出数据到表的方法
一丶 表的设计:
首先我们要准备一份 Microsoft Excel.xls 表格的数据文件,里面记录了所有学生的信息,有 学号、姓名、性别、出生日期、入学时间、班级代码、学籍状态、微信号、手机号码
9项内容,那么我们现在就要先设计一张与这些列名对应的数据库的表,我已经设计好了这张表,如图:
二丶 导入数据
那么这是一张新的表,没有任何数据,接下来我们的任务就是要从 Microsoft Excel.xls 表格的数据文件导入里面所有的学生信息,那么怎么导入呢?往下看!
右键点击 EMIS301 这个数据库,找到导入数据的选项,点击,之后会弹出:
点击下一步,注意数据源这里的选项要选择与你外面的数据文件对应的同一款软件,我们用的是Microsoft Excel软件,所以我们也要选择它:
注意:
目标选择 SQL SeverN…11.0这个选项
服务器名称是你本机的服务器
数据库选择环境中你所想存放的数据库文件里
左边选择第一个
右边选择你想配对的表
注意,这个环节最容易出错!
如果这里失败,说明你的数据库设计的表有问题,回去再重新查看一下,有几种常见原因:
- 列数设少或多了
- 数据范围不够或者超出
成功的话就会如下所示:
之后我们打开数据库的表查看数据,就会看到所有的数据都成功导入了进来!
OK,有没有感觉很神奇,很厉害,哈哈!计算机的世界还真是强大而又奇妙!
三丶 导出数据
数据源: Microsoft Excel 这一项
Excel 文件路径: 选择浏览,选择我们新建的Microsoft Excel表格文件
没有我们就新建
服务器名称:查看本机服务器
身份验证:Windows 身份验证
数据库:选择对应的数据库
左右边对应
下面的按着点击 Next(下一步就可以了)! 这样就完成了将表中所有的数据全部拷贝到了表格文件中,就是这么神奇好玩哈哈!
8、表的操作
一丶 新增一列
USE EMIS301
GO
alter table 课程
add 学分 tinyint NOT NULL
go
二丶 删除一列
USE EMIS301
GO
alter table 班级
alter column 备注 varchar not null
go
alter table 系部
drop column 系部介绍
go
三丶 修改一列
修改列的类型
USE EMIS301
GO
alter table 班级
alter column 备注 varchar not null
go
四丶 重命名列名
USE EMIS301
GO
exec sp_rename '课程.先修课','先修课呀'
go
五丶 导入数据注意事项《补》
表在设置时,是不要都不为空,因为你导入一堆数据进入表中时,如果有一个值为空,那么就会与你设定的表中的列不为空发生冲突,这时候数据就无法成功导入进表里
9、主键、外键、唯一性约束、检查约束
一丶 主键
USE EMIS301
GO
ALTER TABLE 系部
ADD CONSTRAINT PK_专业 PRIMARY KEY(系部名称)
GO
二丶 外键
USE EMIS301
GO
ALTER TABLE 系部
ADD CONSTRAINT FK_系部_专业 FOREIGN KEY(系部代码) REFERENCES 学生(系部代码)
GO
三丶 唯一性约束
USE EMIS301
GO
ALTER TABLE 专业
ADD CONSTRAINT IX_专业 UNIQUE(专业代码)
GO
特性: 可以允许控制!
四丶 检查约束
USE EMIS301
GO
ALTER TABLE 成绩
ADD CONSTRAINT CK_成绩 CHECK(成绩>= 0 AND 成绩<= 100)
GO
10、设置外键+组合键(唯一性约束)、修改取值范围、设置某列的默认值
一丶 外键
/* 添加外键 */
USE EMIS301
GO
ALTER TABLE 课程收费表
ADD CONSTRAINT FK_课程收费_学号 FOREIGN KEY(student_id) REFERENCES 学生(学号)
GO
解释:
ADD CONSTRAINT 外键名称 FOREIGN KEY(设置外键的列) REFERENCES 另一个表名(列名)
二丶 设置组合键(唯一性约束)
USE EMIS301
GO
ALTER TABLE 课程收费表
ADD CONSTRAINT IX_课程收费_学号科目学校 UNIQUE(student_id,course_code,school_term)
GO
解释:
ADD CONSTRAINT 组合键名称 UNIQUE(列名,列名,列名)
三丶 修改取值范围
USE EMIS301
GO
ALTER TABLE 课程收费表 add check(school_term between 1 and 10)
解释:
ALTER TABLE 表名 add check(列名 between 起始 and 截止)
GO
四丶 设置某列的默认值
/* 修改默认值 */
USE EMIS301
GO
ALTER TABLE 课程收费表
ADD charge tinyint NULL DEFAULT 0
GO
解释:
ADD 列名 数据类型 NULL 默认值 0
11、查询前10%的数据、查询并参与计算显示出数据、查询前10行数据、多重升序降序查询、去掉重复值、替换列名显示
1、查询学生表中的所有信息。
USE EMIS1
GO
SELECT * FROM 学生
GO
2、查询学生表中所有学生的学号(别名为Number)、姓名(别名为Name)、性别(别名为Sex)和手机号码(别名为Telephone),按别名输出信息。
SELECT 学号,姓名,性别,手机号码 FROM 学生
GO
3、查询学生表中所有学生的学号、姓名和年龄信息(年龄=现在年份-出生日期的年份)。
SELECT 学号,姓名,year(GETDATE())-year(出生日期) AS 年龄信息 FROM 学生
GO
4、查询学生表中班级代码列的信息,并去掉重复值。
SELECT DISTINCT 班级代码 FROM 学生
GO
5、查询课程注册表中学号、课程号和学年的前20行信息。
SELECT TOP 20 学号,课程号,学年 FROM 课程注册
GO
6、查询学生表的前10%行记录。
SELECT TOP 10 PERCENT * FROM 学生
GO
7、在课程注册表中按课程号的降序、教师编号的升序查询所有信息。
SELECT * FROM 课程注册 order by 课程号 DESC,教师编号 ASC
GO
12、附加(如何导入外部文件数据库)
第一步:找到我们的数据库资源,如图:
第二步:打开SQL Sever,右键点击附加
第三步:
第四步:成功!
13、条件查询、比较运算符查询、模糊查询、枚举查询、范围查询、空值查询、多重条件查询
USE EMIS1
GO
/* 条件查询 */
/* 查询课程注册表中 学年为2016的所有信息 */
SELECT * FROM 课程注册 where 学年='2016'
GO
/* 比较运算符查询 */
/* 查询课程注册表中成绩不低于80分的所有信息 */
SELECT * FROM 课程注册 where 成绩>=80
GO
/* 模糊查询 */
/* 查询课程注册表中学号前9位是“20150211”的所有信息 */
/* like % 任意字符 _任意一个字 */
SELECT * FROM 课程注册 where 学号 like '20150211%'
GO
/* 拓展:表示查询学生表中名字含有张的学生的学号,姓名信息 */
SELECT 学号,姓名 FROM 学生 where 姓名 like '%张%'
GO
/* 枚举查询: */
/* 查询课程注册表中课程号为“0001” 和 “0002”的所有信息 */
SELECT * FROM 课程注册 where 课程号='0001' or 课程号='0002'
GO
/* 拓展:第二种表达方式(★推荐) */
SELECT * FROM 课程注册 where 课程号 in('0001','0002')
GO
/* 范围查询 */
/* 查询课程注册表中成绩介于80到90之间的所有信息 */
SELECT * FROM 课程注册 where 成绩>=80 and 成绩<=90
GO
/*拓展:第二种表达方式(★推荐)*/
SELECT * FROM 课程注册 where 成绩 between 80 and 90
GO
/* 空值查询 */
/* 课程注册表中成绩是空的所有记录 */
SELECT * FROM 课程注册 where 成绩 is null
GO
/* 多重条件查询 */
/* 查询课程注册表中考试课程号为“0001”,且成绩不及格的所有信息 */
SELECT * FROM 课程注册 where 课程号='0001' and 成绩<60
GO
14、条件查询、比较运算符查询、模糊查询、枚举查询、范围查询、空值查询、多重条件查询
USE EMIS1
GO
/* 条件查询 */
/* 1、查询学生表中班级代码为“15wljs301”同班同学的学号、姓名和性别信息。 */
SELECT 学号,姓名,性别 FROM 学生 where 班级代码='15wljs301'
GO
/* 比较运算符查询 */
/* 2、查询课程注册表中考试不及格的所有学生的学号、课程号和教师编号。 */
SELECT 学号,课程号,教师编号 FROM 课程注册 where 成绩<60
GO
/* 模糊查询 */
/* 3、查询学生表中所有姓李的男学生信息。 */
SELECT * FROM 学生 where 姓名 like '李%'
GO
/* 范围查询 */
/* 4、查询学生表中1999年1月1日至2000年3月31日之间出生的学生学号、姓名和微信号。 */
SELECT 学号,姓名,微信号 FROM 学生 where 出生日期 between '1999-01-01' and '2000-03-31'
GO
/* 枚举查询 */
/* 5、查询课程表中学分为2分或3分的课程号和课程名称。 */
SELECT 课程号,课程名称 FROM 课程 where 学分 in('2','3');
GO
/* 多重条件查询 */
/* 6、查询学生表中年龄为21岁的所有女学生的学号、姓名和手机号码。 */
SELECT 学号, 姓名,手机号码 FROM 学生 where year(GETDATE())-year(出生日期)=21 and 性别='女'
GO
15、年龄查询、条件查询、多表查询、姓氏查询
题目:
课程实训
1、查询教师表中年龄超过45岁的教师编号、姓名、学历和职称。
2、查询课程注册表中成绩介于80分与90分之间的学生学号、课程号和教师编号。
3、查询成绩大于或等于90分的学生学号、姓名、性别和课程号。
4、查询考试不及格的学生学号、姓名、课程名称、任教教师姓名和职称。
5、查询‘王’姓教师的教师编号、姓名、学历和职称。
代码:
USE EMIS1
GO
/* 1、 查询教师表中年龄超过45岁的教师编号、姓名、学历和职称。 */
SELECT 教师编号,姓名,职称 FROM dbo.教师 where YEAR(GETDATE())-YEAR(出生日期)>45
GO
/* 2、 查询课程注册表中成绩介于80分与90分之间的学生学号、课程号和教师编号。 */
SELECT 学号,课程号,教师编号 FROM 课程注册 where 成绩 between 80 and 90
GO
/* 3、 查询成绩大于或等于90分的学生学号、姓名、性别和课程号。 */
SELECT 学生.学号,学生.姓名,学生.性别 课程号
FROM 课程注册 inner join 学生 on 学生.学号=课程注册.学号
where 成绩 between 80 and 90
GO
/* 4、 查询考试不及格的学生学号、姓名、课程名称、任教教师姓名和职称。 */
SELECT 学生.学号,学生.姓名,课程名称,教师.姓名 as 教师姓名,职称,成绩
FROM 课程注册 inner join 学生 on 学生.学号=课程注册.学号
inner join 课程 on 课程.课程号=课程注册.课程号
inner join 教师 on 教师.教师编号=课程注册.教师编号
where 成绩<60
GO
/* 5、 查询‘王’姓教师的教师编号、姓名、学历和职称。 */
SELECT 教师编号,姓名,学历,职称 FROM 教师 where 姓名 like '王%'
GO
16、多表查询、个数计算、多重约束条件、两表间的交集、多表之间的关系分析
一丶 题目&答案
【1】查询15级网络技术301班所有姓陈的男同学的信息
USE EMIS5
GO
select 班级代码 from 班级 where 班级名称='15级网络技术301班' //通过班级名称找到班级代码
select * from 学生
where 班级代码 in(select 班级代码 from 班级 where 班级代码='15级网络技术301班')
and 姓名 like '陈%' and 性别='男'
go
【2】查询每个班的男女生各有多少人
select 班级代码,性别,count(*) as 总人数 from 学生 group by 性别,班级代码
【3】查询平均分大于80分的学生的学号、姓名和班级名称信息
select 学号 from 课程注册 group by 学号 having avg(成绩)>80 //平均分大于80分学生学号
select 学号,姓名,班级名称 from 学生 inner join 班级 on 学生.班级代码=班级.班级代码
and 学号 in(select 学号 from 课程注册 group by 学号 having avg(成绩>80))
go
【4】查询大学英语成绩前三名的同学的学号,姓名以及所在系部名称
//先找到大学英语成绩排名前三的学生学号
select top 3 学号 from 课程注册 inner join 课程
on 课程注册.课程号=课程.课程号 and 课程名称='大学英语'
select 学号,姓名,系部名称
from 学生 inner join 班级 on 学生.班级代码=班级.班级代码
inner join 专业 on 专业.专业代码=班级.专业代码
inner join 系部 on 系部.系部代码=专业.系部代码
where 学号 in(select top 3 学号 from 课程注册 inner join 课程
on 课程注册.课程号=课程.课程号 and 课程名称='大学英语' order by 成绩 DESC)
go
思路
1、先在课程注册表中通过课程号关联课程表中的课程号,找到匹配的同一行,然后就可以知道它的课程名称是否为大学英语。
2. 然后再通过成绩找到前三名同学,约束条件是大学英语,而且要倒序从高到低排
3. 找到了这三名学生后,就可以在课程注册表中确定他们三位的学号,再进入到学生表中拿到他们的班级代码。
4. ,通过学生表的班级代码与班级表的班级代码,找到他们的专业代码,拿到他们的系部代码
5. 通过专业表的系部代码与系部的系部代码,就可以找到他们的系部名称。
【5】查询只有一门课程不及格的同学的最高分、最低分及平均分信息
//查询只有一门课程不及格的学生学号
select 学号 from 课程注册 where 成绩<=60 group by 学号 having count(成绩)=1
select 学号,max(成绩) as 最高分,min(成绩) as 最低分,avg(成绩) from 课程注册
where 学号 in(select 学号 from 课程注册 where 成绩<60 group by 学号
having count(成绩)=1)
group by 学号
go
二丶 所有表的结构
班级:
管理员:
教师:
教师任课:
教学计划:
课程:
课程类型:
课程收费:
课程注册:
系部:
学籍状态:
学生:
专业:
17、视图
USE EMIS1
GO
/* 1、创建一个名为“V_学生”的视图,在求查询学生表中与王迪同学同班的学生姓名、性别、出生日期和手机号码 */
/*select 班级代码 from 学生 where 姓名='王迪';*/
create view V_学生
as
select 姓名,性别,出生日期,手机号码 from 学生 where 班级代码=(select 班级代码 from 学生 where 姓名='王迪')
/* 2、创建一个名为“V_网络专业”的视图,要求查询“计算机网络技术”专业的班级信息 */
USE EMIS1
GO
create view V_网络专业
as
/*select 专业代码 from 专业 where 专业名称='计算机网络技术'*/
select 班级代码 from 班级 where 专业代码=(select 专业代码 from 专业 where 专业名称='计算机网络技术')
/* 3、将视图“V_网络专业”重命名为“V_网络技术专业” */
exec sp_rename 'V_网络专业','V_网络技术专业'
go
/* 4、删除名为“V_学生”和“V_网络技术专业”的视图 */
drop view V_网络技术专业
drop view V_学生
go
18、索引信息
/* 在专业表中,对字段专业名称创建一个非聚集索引,索引名称为IX_专业名称 */
USE EMIS301
GO
CREATE NONCLUSTERED INDEX IX_专业名称 ON 专业(专业名称)
GO
/* 通过系统存储过程查看数据表T_MAJOR的索引信息 */
USE EMIS301
GO
EXEC SP_HELPINDEX '专业'
GO
/* 使用T-SQL语言来查看 ‘IX_专业代码’ 索引的统计信息 */
USE EMIS301
GO
DBCC SHOW_STATISTICS('专业',IX_专业名称)
GO
/* 重命名索引 */
USE EMIS301
GO
exec sp_rename '专业.IX_专业名称','IX_专业名称A'
GO
/* 删除索引 */
USE EMIS5
GO
DROP INDEX 专业.IX_专业名称A
GO
19、存储过程(上)
USE EMIS1
GO
/*1、编写一个输出“Hello, My Procedure!”字符串的存储过程*/
/* 解法一: */
create procedure P_zifuchuan01
as
print 'Hello, My Procedure!'
GO
exec P_zifuchuan01
GO
/* 解法二: */
create procedure P_zifuchuan02
as
select 'Hello, My Procedure!'
GO
exec P_zifuchuan02
GO
/*2、编写一个存储过程p_stu17wljs301,该存储过程查询班级代码为“17wljs301”的所有学生的学号、姓名、性别和出生日期。*/
create procedure P_stu17wljs301
as
SELECT 学号,姓名,性别,出生日期 from 学生
where 班级代码='17wljs301'
GO
exec P_stu17wljs301
GO
/*3、编写一个存储过程p_stubjdm,该存储过程根据输入参数@bjdm(班级代码)显示相应班级的学生学号、姓名、性别和出生日期。*/
create procedure P_stubjdm @bjdm char(9)='17wljs301'
as
select 学号,姓名,性别,出生日期 from 学生
where 班级代码=@bjdm
GO
/* 方式一: */
declare @bjdm char(9)
set @bjdm='15wljs301'
EXEC P_stubjdm @bjdm
GO
/* 方式二: */
declare @bjdm char
exec @bjdm=[dbo].P_stubjdm '15wljs301'
select 'Returen Value以上是关于SQL Server 实战常见问题总结的主要内容,如果未能解决你的问题,请参考以下文章
MySQL实战45讲 第一课总结&My SQL VS SQL Server