- 时间:2017-12-25 整理:byzqy
最近详细学习了一下MS SQL Server相关的知识,收获不小,在此记录一下,可能有点零散,后续会慢慢整理!
1、对数据库的一些认识
数据库中只认命令(脚本),所有的可视化操作实质上都是执行的SQL命令。
2、简单复习
1.数据库(要是使用数据库,首先需要打开服务),表(即数据表)
安装了几个数据库实例,就有几个数据库服务(服务器名称,貌似就是数据库实例名称)
2.创建数据库,创建表
3.数据类型
--带var表示不固定长度,不带var表示固定长度
--n表示使用Unicode保存,保存双字节字符,不带n的表示使用单字节字符保存
4.主键、外键(为了减少数据冗余)
--一个表中只能有一个主键,也可以没有主键(推荐表中要有主键)
--主键可以只由一个列组成,也可以由多个列组成
--有外键的表叫外键表,被引用的表叫主键表
5.t-sql语句创建数据库,创建表
--创建默认参数数据库:create database TestDB;
--创建表:create table MyTable(列名 数据类型 列的其他选项)
6.数据库的分离和附件(数据库分离之后,才能对数据库文件进行复制等操作)
3、关于SQL
SQL是最基本的命令;
T-SQL是微软对SQL的扩展(Teansact-SQL,Structured Query Language);
PL/SQL是甲骨文对SQL的扩展。
SQL分类:
DDL(数据定义语言)
DML(数据操作语言)--我们程序员常用的
DCL(数据控制语言)
4、C#和SQL的区别
1. C# 中双引号表示字符串
SQL 中使用单引号表示字符串
2. C# 中使用==判断两个变量是否相等
SQL 使用=表示两个值是否相等
3. C# 严格区分大小写
SQL 默认不区分大小写
4. C# 中使用\(斜杠)来表示转义
SQL 中使用‘(单引号)来表示转义
5. SQL中的or相当于C#中的||(或者)
C#中的!(非)对应SQL中的not
C#中的&&(且)对应SQL中的and
C#中的||(或)对用SQL中的or
5、C#中ADO.NET常用类
Connection 连接数据库
Command 执行sql语句
DataReader 读取数据
DataAdapter 封装上面三个对象的对象
DataSet 数据集
文件:SQLQuery4.sql
--1.创建数据库(不设置参数) create database MyDatabaseOne; --2.删除数据库 drop database MyDatabaseOne; --3.创建数据库时设置一些参数选项 create database MydatabaseTwo on primary ( --配置主数据文件的选项 name=‘MyDatabaseTwo‘,--主数据文件的逻辑名称 filename=‘C:\DB_Test\MyDatabaseTwo.mdf‘,--主数据文件的实际保存路径 size=5MB, maxsize=150MB, filegrowth=20% ) log on ( --配置日志文件的选项 name=‘MyDatabaseTwo_log‘,--日志文件的逻辑名称 filename=‘C:\DB_Test\MyDatabaseTwo_log.ldf‘,--日志文件的实质保存路径 size=5MB,--日志文件的初始大小 filegrowth=5MB ) --此处可能会报错,是一个C盘权限的问题 --如果忘记命令,还可以通过鼠标操作生成脚本的方式查看命令 --4.在数据库中创建一张表 --在执行之前先要切换到要创建的数据库到当前 use School create table [Departments] ( ID int identity(1,1) primary key, Name nvarchar(50) not null ) --5.通过代码删除数据库和表 use School drop database [MyDatabaseTwo] drop table [Departments] --6.通过代码创建员工表 use [School]; create table Employees ( ID int identity(1,1) primary key, IDCard varchar(18) not null, Name nvarchar(50) null, Gender bit not null, JoinDate datetime, Age int, Address nvarchar(300), PhoneNumber varchar(100), DeptID int not null, Email varchar(100) ) -------------------------------------------- --7.创建学生表 create table Student ( id int identity(1,1) primary key, name nvarchar(50) not null, gender nchar(1), address nvarchar(500), age int, birthday datetime, card_id varchar(18), class_id int ) --创建班级表 create table Class ( class_id int identity(1,1) primary key, class_name nvarchar(50) ) --创建成绩表 create table Score ( score_id int identity(1,1) primary key, id int not null,--引用学生表中的学生id English float, Math float, Chinese float ) --创建老师表 create table Teacher ( teacher_id int identity(1,1) primary key, teacher_name nvarchar(50) not null, gender bit, salary money, age int, birthday datetime ) --8.向表中插入数据 /* create table Class ( class_id int identity(1,1) primary key, class_name nvarchar(50) ) */ --①自动编号列,默认自动增长,不能也不需要插入值 insert into [Class](class_name) values(‘.NET黑马一期‘) select * from [Class] --向学生表中插入一条数据 /* create table Student ( id int identity(1,1) primary key, name nvarchar(50) not null, gender nchar(1), address nvarchar(500), age int, birthday datetime, card_id varchar(18), class_id int ) */ insert into [Student](name,gender,address,age,birthday,card_id,class_id) values(‘刘德华‘,‘男‘,‘北京市海淀区‘,25,‘1970-10-10‘,‘123652199010021012‘,1) --如果除自动编号列以外所有列都要插入时也可以省略列名 insert into [Student] values(‘郭富城‘,‘男‘,‘北京市天安门‘,25,‘1988-10-10‘,‘123652569010021012‘,1) --向部分列插入数据 insert into [Student](name,gender,age) values(‘宋祖英‘,‘女‘,25) --向自动编号列插入值 --a.需要启动某个表的"自动编号列"手动插入值的功能 --b.再次插入数据时,自动编号只会按照当前最大的编号增加 set identity_insert [Student] on --打开插入自动编号功能 insert into [Student](id,name) values(10,‘唐三藏‘) set identity_insert [Student] off --使用完后关闭插入自动编号列功能 --c.在插入字符串时如果包含中文一般在字符串引号前加上一个大写N,是为了防止"双字节字符乱码"(中文乱码) -- 在之前添加数据时,没有加N,也没有出现乱码,这跟当前的数据库排序规则有关(当前为简体中文排序规则) insert into [Student](name)values(N‘猪八戒‘) select * from [Student] --小技巧:打开和关闭查询结果窗口:Ctrl + R --9.数据更新(数据修改) --修改[Student]表中gender等于‘女‘的行的数据,年龄减一,姓名后加‘<女>‘ update [Student] set age=age-1,name=name+‘<女>‘ where gender=‘女‘ select * from [Student] --where中可以使用的其他逻辑运算符: --or、and、not、<、>、>=、<=、<>(或!=)等 --10.删除数据 --删除表中所有数据 delete from [Student] --删除表中指定数据(删除一部分数据) delete from [Student] where gender=‘女‘ --删除表中的全部数据,有两种方式 --a.delete from [表名] --b.truncate table [表名] (推荐使用这中方法) truncate table [Student] --truncate的特点: --a.truncate语句不能跟where条件(无法根据条件删除,只能全部删除) --b.truncate删除可以使自动编号恢复到初始值 --c.使用truncate删除表中的所有数据要比delete效率高很多 --d.truncate删除数据,不会触发dalete触发器 --e.truncate删除数据当这个表与其他表有主外键关联时,无法删除 select * from [Student] --11.练习和整理 --创建数据库 create database [LiangshanHero] --删除数据库 drop database [LiangshanHero] --创建表 use [LiangshanHero] go create table [Hero] ( id int identity(1,1) primary key, name nvarchar(50) not null, nick_name nvarchar(50), star nvarchar(10), age int, hometown nvarchar(50), sex nchar(1), sal int ) select * from [Hero] --为表添加数据 insert into [Hero] values(‘宋江‘,‘及时雨‘,‘天魁星‘,28,‘山东‘,‘男‘,6000) insert into [Hero] values(‘卢俊义‘,‘玉麒麟‘,‘天罡星‘,35,‘河北‘,‘男‘,7500) insert into [Hero] values(‘吴用‘,‘智多星‘,‘天机星‘,31,‘黑龙江‘,‘男‘,1000) insert into [Hero] values(‘公孙胜‘,‘入云龙‘,‘天闲星‘,32,‘重庆‘,‘男‘,5000) insert into [Hero] values(‘关胜‘,‘大刀‘,‘天勇星‘,36,‘江苏‘,‘男‘,3500) insert into [Hero] values(‘林冲‘,‘豹子头‘,‘天雄星‘,34,‘浙江‘,‘男‘,4000) insert into [Hero] values(‘秦明‘,‘霹雳火‘,‘天猛星‘,35,‘上海‘,‘男‘,5500) insert into [Hero] values(‘呼延灼‘,‘双鞭‘,‘天威星‘,33,‘湖南‘,‘男‘,2800) insert into [Hero] values(‘花荣‘,‘小李广‘,‘天英星‘,24,‘湖北‘,‘男‘,3400) insert into [Hero] values(‘柴进‘,‘小旋风‘,‘天贵星‘,26,‘广西‘,‘男‘,4800) insert into [Hero] values(‘鲁智深‘,‘花和尚‘,‘天孤星‘,38,‘河南‘,‘男‘,5000) insert into [Hero] values(‘武松‘,‘行者‘,‘天伤星‘,28,‘河南‘,‘男‘,2600) insert into [Hero] values(‘史进‘,‘九纹龙‘,‘天微星‘,36,‘河南‘,‘男‘,8000) insert into [Hero] values(‘扈三娘‘,‘一丈青‘,‘地慧星‘,28,‘云南‘,‘女‘,7000) insert into [Hero] values(‘顾大嫂‘,‘母大虫‘,‘地阴星‘,37,‘贵州‘,‘女‘,6000) insert into [Hero] values(‘孙二娘‘,‘母夜叉‘,‘地壮星‘,32,‘四川‘,‘女‘,5400) insert into [Hero] values(‘石秀‘,null,null,null,null,null,null) insert into [Hero] values(‘燕青‘,null,null,null,null,null,null) insert into [Hero] values(‘阮小七‘,null,null,null,null,null,null) insert into [Hero] values(‘李逵‘,null,null,null,null,null,null) --查询所有数据 select * from [Hero] --带条件查询 select name from [Hero] where sex=‘男‘ select count(*) as ‘工资大于5000人数‘ from hero where sal>=5000 --更新数据 update [Hero] set sal=sal*1.1 where sal<3000 --删除指定数据 delete from [Hero] where sex=‘女‘ --清空表中数据 truncate table [Hero] --删除整张表(包括表结构和所有数据) drop table [Hero] --12.约束(保证数据完整性,约束是建立在表上的) --约束大致分类 --a.非空约束 --b.主键约束(PK)primary key constraint唯一且不为空 --c.唯一约束(UQ)unique constraint唯一,允许为空,但只能出现一次 --d.默认约束(DF)default constraint默认值 --e.检查约束(CK)check constraint范围以及格式限制 --f.外键约束(FK)foreign key constraint表关系 --新建一张表(无约束的表) use [School] go create table [Employees] ( id int identity(1,1), name nvarchar(50), gender char(2), age int, email varchar(100), home_address varchar(500) ) create table [Department] ( dep_id int identity(1,1), dep_name varchar(50) ) --删除表 drop table [Employees] drop table [Department] --查询数据 select * from [Employees] select * from [Department] --13.t-sql语句实现约束(手动增加约束) --新建一张表(无约束的表) use [School] go create table [Employees] ( id int identity(1,1), name nvarchar(50), gender char(2), age int, email varchar(100), home_address varchar(500) ) create table [Department] ( dep_id int identity(1,1), dep_name varchar(50) ) --增加约束------------------------------------- --手动删除一列 alter table [Employees] drop column home_address --手动增加一列 alter table [Employees] add home_address1 nvarchar(1000) --手动修改一下某列的数据类型 alter table [Employees] alter column email varchar(200) --为某列增加一个主键约束(修改表结构,增加约束,约束类型:主键约束) alter table [Employees] add constraint PK_Employees_id primary key(id) --为某列增加一个非空约束(以修改列的方式完成,增加一个not null关键字就好) alter table [Employees] alter column name nvarchar(50) not null --为某列增加一个唯一约束(唯一约束要求值不能重复,允许只能有一个空值) alter table [Employees] add constraint UQ_Employees_name unique(name) --为性别增加一个默认约束,默认值为‘男‘ alter table [Employees] add constraint DF_Employees_gender default(‘男‘) for gender --为性别增加一个检查约束,要求性别只能是:‘男‘ or ‘女‘ alter table Employees add constraint CK_Employees_gender check(gender=‘男‘ or gender=‘女‘) --为年龄增加一个检查约束:年龄必须在0-120岁之间,含岁与岁. alter table [Employees] add constraint CK_Employees_age check(age>=0 and age<=120) --为部门表设置主键,主键列:dep_id(即为部门表某列增加主键约束) alter table [Department] add constraint PK_Employees_dep_id primary key(dep_id) --为员工表增加列,部门ID:dep_id alter table [Employees] add dep_id int not null --增加某张表外键约束(命令后增加:on delete cascade 可实现级联删除) alter table [Employees] add constraint FK_Employees_Department foreign key(dep_id) references Department(dep_id) --删除约束-------------------------------- alter table [Employees] drop constraint FK_Employees_Department,CK_Employees_age,CK_Employees_gender,UQ_Employees_name,DF_Employees_gender --通过一条代码来增加多个约束 alter table [Employees] add constraint FK_Employees_Department foreign key(dep_id) references Department(dep_id), constraint CK_Employees_gender check(gender=‘男‘ or gender=‘女‘), constraint CK_Employees_age check(age>=0 and age<=120), constraint UQ_Employees_name unique(name) --创建表的同时就为表增加约束 use [School] go create table [Employees] ( id int identity(1,1) primary key, name nvarchar(50) not null unique check(len(name)>2), gender char(2) default(‘男‘), age int check(age>0 and age<120), email varchar(100) unique, home_address varchar(500) not null, dep_id int foreign key references [Department](dep_id) on delete cascade --添加外键约束,并设置可以级联删除 ) create table [Department] ( dep_id int identity(1,1) primary key, dep_name varchar(50) not null unique --(唯一约束且不为空) ) --小经验:以上代码在"一起执行"的时候会报错:外键 ‘FK__Employees__dep_i__7C4F7684‘ 引用了无效的表 ‘Department‘。 --这是因为在代码中先创建了员工表(外键表),之后才创建了部门表(主键表),外键表需要引用主键表,所有被引用的主键表需要先创建 --删除表 drop table [Employees] drop table [Department] --查询数据 select * from [Employees] select * from [Department] --14.数据检索(查询) --*表示显示所有列 --查询语句没有加where条件表示查询所有行 select * from [Student] --只查询部分列 select id,name,address from [Student] --只查询部分行(使用where条件筛选部分行显示) select * from [Student] where class_id=1 --列别名(为查询结果集中的列起别名) select id as 编号,name as 姓名,gender as 性别 from [Student] --美化一下格式 select id as 编号, name as 姓名, gender as 性别 from [Student] --列别名1(也可以把as省略掉) select id 编号, name 姓名, gender 性别 from [Student] ----列别名2(也可以用引号把列名引起来) select id ‘编 号‘, name ‘姓 名‘, gender ‘性别‘ from [Student] --列别名3(也可以使用等号=的方式) select 编号=id, 姓名=name, 性别=gender from [Student] --查询结果中增加新列 select 编号=id, 姓名=name, 性别=gender, 婚否=‘否‘ from [Student] --获取服务器时间(没有from,select也可以单独使用) select 当前系统时间=getdate() --select单独使用 select 班长=‘刘德华‘, 班花=‘王美丽‘, 班草=‘待定‘, 班主任=‘习大大‘ --15.数据检索,关键字:top 、distinct(去重) select distinct * from [Student] --distinct关键字,针对已经查询出的结果去除重复 select distinct name,gender from [Student] --top关键字一般都与order by连用 --排序order by --按照年龄降序排序 select * from [Student] order by age desc --按照年龄升序排序 select * from [Student] order by age asc --默认排序(升序排序) select * from [Student] order by age --排序联系 use [LiangshanHero] select * from [Hero] order by sal desc select * from [Hero] order by sal --查询工资最高的前5名 select top 5 * from [Hero] order by sal desc --查询工资最低的前5名 select top 5 * from [Hero] order by sal asc --top后面跟表达式,需要使用括号将表达式括起来 select top (2*2) * from [Hero] order by sal desc --查看前百分之30工资最高的(如果百分比的结果不是整数条,会向上取整返回结果) select top 30 percent * from [Hero] order by sal desc --16.聚合函数 --sql聚合函数 --a.MAX(最大值) --b.MIN(最小值) --c.AVG(平均值) --d.SUM(和) --e.COUNT(计数) --注意 --①聚合函数对null值不计算 --②如果一行的数据都是null,count(*)包含对空值行、重复行的统计 use [LiangshanHero] go create table [Hero] ( id int identity(1,1) primary key, name nvarchar(50) not null, nick_name nvarchar(50), star nvarchar(10), age int, hometown nvarchar(50), sex nchar(1), sal int ) select * from [Hero] --统计出所有人的年龄的总和 select sum(age) as 年龄总和 from [Hero] --统计当前表中一共有多少条记录 select count(*) from [Hero] --计算平均年龄 select 平均年龄=(select sum(age) as 年龄总和 from [Hero])*1.0 --*1.0可以让数据变成小数 /(select count(*) from [Hero]) --计算年龄最大的 select max(age) from [Hero] --计算年龄最小的 select min(age) from [Hero] --计算平均值avg select avg(age) from [Hero] select avg(age*1.0) from [Hero] --将整型数据变为小数,或者直接将表中数据类型换为小数 --可以使用round()控制小数位数 --聚合函数的一下其他问题---------- --①聚合函数不统计空值 select * from [Hero] /*=>21*/ select count(age) from [Hero] /*count()是不统计空值的*/ select avg(age) from [Hero] /*avg()也是不统计空值的*/ select sum(age) from [Hero] /*sum()对于null,认为是0*/ select min(age) from [Hero] /*max()和min()也是忽略空值的*/ --②聚合函数默认把整个表中的数据当做"一组",然后才进行的统计 --如果使用聚合函数的时候,没有手动group by分组,那么聚合函数会把整个表中的数据当作"一组"来进行统计 --③所有的聚合函数(帮助文档中列出的) /*--12个 avg checksum agg count count big grouping max min sum stdev stdevp var varp */ --------------------------------------------用户登录数据库练习-------------------------------------------- --创建数据库 create database [LoginInfoDB] --删除数据库 drop database [LoginInfoDB] --创建表 use [LoginInfoDB] go create table [Users] ( autoid int identity(1,1) primary key, username varchar(50) not null, pwd varchar(50) not null, ) select * from [Users] --为表添加数据 insert into [Users] values(‘ldh‘,‘liudehua‘) insert into [Users] values(‘lm‘,‘liming‘) insert into [Users] values(‘zxy‘,‘zhangzueyou‘) insert into [Users] values(‘gfc‘,‘guofucheng‘) insert into [Users] values(‘swk‘,‘sunwukong‘) insert into [Users] values(‘zbj‘,‘zhubajie‘) insert into [Users] values(‘shs‘,‘shaheshang‘) insert into [Users] values(‘tsz‘,‘tangsanzang‘) insert into [Users] values(‘bgj‘,‘baigujing‘) --查询所有数据 select * from [Users] --带条件查询 select username from [Users] where sex=‘男‘ select count(*) as ‘工资大于5000人数‘ from hero where sal>=5000 --更新数据 update [Users] set sal=sal*1.1 where sal<3000 --删除指定数据 delete from [Users] where autoid=7 --清空表中数据 truncate table [Users] --删除整张表(包括表结构和所有数据) drop table [Hero] --存储过程 & 带参数的sql语句 exec sp_executesql N‘select count(*) from [Users] where username=@username and pwd=@pwd‘, N‘@username varchar(50),@pwd varchar(50)‘, @username=‘ldh‘, @pwd=‘123456‘
--The End.