SQL Server 数据库
- 一、了解数据库
- 二、创建库表
-
- 1.创建数据库
-
- A:可视化创建库
- B:Sql 语句创建库
- C:切换数据库
- D:删除数据库
- E:开启数据库服务
- 2.创建数据表
-
- A:可视化创建表
- B:通过 Sql 语句来创建
- 三、增.改.删数据
-
- 1.insert 添加数据
- 2.update更新表
- 3.数据删除 (delete和truncate)
- 四、查询数据
-
- distinct 过滤重复
- 使用 top
- group by分组
- having
- order by排序
- 列的别名
- case when
- like模糊查询
- in
- between
- where 限定条件
- 运算符
-
- 比较运算符
- 逻辑运算符
一、了解数据库
数据库:用于存储数据的仓库
常用的数据库 :
Oracle:大型商用数据库
SqlServer:中大型数据库,商用也需要收费。
MySql:中型数据库,商用有免费版
Access:小型数据库
SQLite:可以运行在多种平台上
系统数据库:
msdb:记录SQL Server中所有的系统级别信息
model:新建数据库的模板
tempdb:保存了所有的临时表和临时存储过程
msdb:提供代理程序调度、警报、作业以及记录操作员等活动。
二、创建库表
1.创建数据库
A:可视化向导来创建库 B:通过 Sql 语句来创建
A:可视化创建库
右键单击数据库,选择“新建数据库”
在弹出对话框中输入数据库名称,可以修改数据库文件的保存路
B:Sql 语句创建库
CREATE DATABASE [TestDB] ON PRIMARY
( NAME = N'TestDB', FILENAME = N'E:TestDBTestDBX.mdf' , SIZE = 5120KB , MAXSIZE = UNLIMITED,
FILEGROWTH = 2048KB )
LOG ON
( NAME = N'TestDB_log', FILENAME = N'E:TestDBTestDBX_log.ldf' , SIZE = 2048KB , MAXSIZE = 2048GB ,
FILEGROWTH = 10%)
GO
C:切换数据库
将查询编辑器连接切换到 TestDB数据库
USE TestDB
GO
D:删除数据库
DROP DATABASE [TestDB]
E:开启数据库服务
开启数据库服务:
Wind+R搜索services.msc打开服务管理器,找到SQL Server (MSSQLSERVER)手动开启/属性自动开启
Dos命令启动:启动:net start mssqlserver关闭:net stop mssqlserver
忘记数据库密码:先启动数据库,使用Windows登录,在数据库安全性找到sa的账户名,双击打开窗口,更改密码,确定即可;
2.创建数据表
A:可视化向导来创建表 B:通过 Sql 语句来创建
表就像大仓库中的一个个隔间一样,数据按照分类存储在隔间中
A:可视化创建表
选中Test库下的“表”节点,单击右键,选择“新建表”,
在打开的设计窗口中,设计此表所需的列
B:通过 Sql 语句来创建
CREATE TABLE [dbo].[Student]([Id] [int] IDENTITY(1,1) NOT NULL,[StuCode] [varchar](20) NULL,[RealName] [nvarchar](20) NULL,[Sex] [nchar](1) NULL
);
--创建表的过程中,最后一行语句后面可以不加逗号;
--create table 表名 (字段名 字段类型,字段名 字段类型);
--注释:--表示单行注释,/**/表示多行注释;
三、增.改.删数据
DDL:数据定义语言 create、alter、drop
DML:数据操纵语言 insert、update、delete
DQL:数据查询语言 select
DCL:数据控制语言 commit、rollback、savepoint
关键字:
添加:insert
修改:update
删除:delete
@@identity用于插入数据时显示的自增值;
@@rowcount用于更新数据时显示修改了多少行的数据
1.insert 添加数据
-- 添加单条数据
INSERT dbo.Student (StuCode, RealName, Sex) VALUES ('2021', '张三', '男')
GO
--添加多条数据
INSERT dbo.Student (StuCode, RealName, Sex) VALUES ('2021', '张三', '男') ,('2022', 'Tom', '男')
GO
--基本语法如下:INSERT 表名 列的列表 VALUES 要插入的值的列表
--注意:添加多条的数据不能完全相同,否则会认为成是一条数据!
--如果某行的前面有两个连字符,则指示该行为注释,编译器将忽略其文本。 在这种情况下,注释说明允许的语法变体。
--以下语句显示如何通过在字段列表(在圆括号中)中和值列表中均切换 RealName和 StuCode的位置,更改提供参数的顺序。
INSERT dbo.Student (RealName,StuCode,Sex) VALUES ('张三', '2021','男')
GO
--以下语句演示,只要值是按正确顺序列出的,列的名称就是可选的。
--此语法很常见,但是建议不要使用它,因为其他人了解您的代码可能会更困难。
--NULL 为 Sex列指定,因为还不知道此产品的价格。
INSERT dbo.Student VALUES ('2021', '张三', '男')
GO
--由于 sex列允许 Null 值,而且没有提供值,因此可以从语句中完全删除 sex列的名称和值。
INSERT dbo.Student (StuCode, RealName) VALUES ('2021', '张三')
GO
@@identity 自增值
INSERT dbo.Student (StuCode, RealName) VALUES ('2021', '张三')
GO
Print @@identity
--@@identity,是一个系统变量,表示当前 “会话”中最后一条 insert 语句 产生的自增值;
注意:
1、所有列都添加不需要指明哪个字段
2.有默认值和可为空的列可以不添加值,值要和字段位置一致。
3.选择列添加时需要看字段设置,自增一定不添加
4.列名所提供值的数目和表定义的不匹配
5.不能为空的列,必须添加值
6、外键约束下开启需要注意引用表的ID数据
7.使用SQL语句对数据库中表进行操作时,文本型和日期型数据需要加上单引号
2.update更新表
UPDATE dbo.Student SET RealName = 'Tim' ,列2 = 新值2WHERE ID = 15
GO
--语法:UPDATE 表名 SET COLUMN1 = 新值 1,COLUMN2=新值 1….. WHERE 条件
--注意:修改数据时一定要添加条件,否则将会改变表中的所有的数据;
--条件表达式,指明了我们要修改哪些数据,最终可能是 0 条、1 条也可能是很多条
--每次 update 执行完后,我们可以从@@rowcount 系统变量中获取真正发生修改了多少行数据。
UPDATE dbo.Student SET RealName = 'Tim' WHERE ID = 15
select @@rowcount; --返回更新查询中修改的行数,返回一个数值型数值;
Top 限定修改
--在实际开发中,不经常用到此知识点,它表示的含义是 在满足 where 条件的数据中,选取若干条来进行更新
update top (20) Student set RealName ='Tim' where RealName ='张三'
注意:update修改前一定检查好条件,谨慎对待
总结:
1、修改语法:
2、@@rowcount 返回受影响的行数
3、top限定修改的使用
3.数据删除 (delete和truncate)
如果删除数据后,再次创建数据时,编号可能会断裂(除自增列)。
可视化界面:
右击表—>编辑前200行—>选中要删除的数据—>右击—>删除
语法:
DELETE [FROM] 表名称 WHERE 条件
TRUNCATE TABLE 表名称 --总结:
--delete:删除整张表的数据或者某条数据。速度慢
--truncate:只能删除整张表的数据。 快速
--注意:Delete 删除语句执行的过程中如果不添加条件则会删除表中的所有数据;
Top 限定的删除
--Top 限定的删除是在满足条件的语句中删除指定数量的数据。
delete top(2) Student where Id<7
四、查询数据
- 在查询中使用*代表所有列。
- 结果集:查询得到的数据行的集合
查询的步骤:
1. 先确定要查询的表;
2. 确定查询的列名;
3. 结合条件看是否符合条件;
distinct 过滤重复
distinct 关键字用来过滤重复数据,保证查到的数据是唯一的。
语法:select distinct 列 1,列 2…… from 表名
使用 top
--上面也简单的提到过 top 的使用,在真正的开发中,top 更多用于查询,
--用来限制结果集中的行数,我们可以直接指定一个数值来限制记录的条数,
--TOP 必须放在*型号或者列名的前面
语法:SELECT TOP (expression) [PERCENT] [ WITH TIES ] 列名 1……列名 N
FROM 表
例子:
查询Student表中的前 10 条记录
select top (10) * from Student
查询Student表中的前 10%的记录
select top (10) percent * from Student --也可以指定一个百分比
group by分组
将查询结果划分为多个行组的 SELECT 语句子句,通常用于在每个组上执行一个或多个聚合。 SELECT 语句每组返回一行。
语法:select 列1 from 表A group by 列1
列表达式:允许使用下面的语句:SELECT ColumnA, ColumnB FROM 表A GROUP BY ColumnA, ColumnB; SELECT ColumnA + ColumnB FROM 表A GROUP BY ColumnA, ColumnB; SELECT ColumnA + ColumnB FROM 表A GROUP BY ColumnA + ColumnB; SELECT ColumnA + ColumnB + constant FROM 表A GROUP BY ColumnA, ColumnB;不允许使用下面的语句:SELECT ColumnA, ColumnB FROM 表A GROUP BY ColumnA + ColumnB; SELECT ColumnA + constant + ColumnB FROM 表A GROUP BY ColumnA + ColumnB;
例子:
A:根据班级名称分组
select ClassName from Classes group by ClassName
B:和having子句一起使用
select ClassName from Classes group by ClassName having ClassName = '1班'
having
having指定分组的过滤,having通常与 GROUP BY 子句一起使用。where 和having 的区别 :
having 子句限制的是组,而不是行,先分组再过滤。
where 先过滤再分组
where 子句中不能使用聚集函数,而 having 子句中可以。
两者都可以的情况下建议where优先,能用where不要用having
order by排序
--指定用于对查询结果集进行排序的列或表达式。
语法:select 列名 from 表名 order by 列名 asc/desc
--ASC 按从最低值到最高值的顺序进行排序。
--DESC 按从最高值到最低值的顺序进行排序。
-- ASC 是默认排序顺序。Null 值被视为最低的可能值。
例:
A:select top (10) * from Product order by SellPrice desc
B:同时指定升序和降序
--以下示例按两个列对结果集进行排序。
--先按 FirstName 列升序对查询结果集进行排序,然后按 LastName 列降序进行排序。
SELECT LastName, FirstName FROM Person.Person
WHERE LastName LIKE 'R%'
ORDER BY FirstName ASC, LastName DESC ;
列的别名
我们进行查询时,有时候希望以汉语的方式显示列名,这时候我们就可以采用别名的方式来进行查询了
三种:as 空格 等号=
select Id as '编号',Name '名称','价格'=price from 表名
--注意:在其他数据库中,= 的方式起别名可能不被支持,推荐使用 as。
case when
允许您有条件地从多次比较中返回特定值。 有两种类型的 Case 语句:
作用:1、转换显示。2、分等级
结构:case 列名 when '真实值' then '显示值'(when可以多个)else '' end
--任务1:将Student表中的sex列中男显示为'man',女显示为'woman'
select RealName,case sex
when '男' then 'man'
when '女' then 'woman'
else '未知'end as '性别'
from Student;
--任务2:查询 News 表中的数据,并对点击量进行分级
--1 到 100 为 C 级,100 到 500 为 B 级,500 到 2000 为 A 级,2000 以上为 T 级
select Title,Clicks, case
when Clicks<100 and Clicks>=1 then 'C'
when Clicks<500 then 'B'
when Clicks<2000 then 'A'
else 'T' end
from News;
like模糊查询
%:包含零个或多个字符的任意字符串。
_(下划线):任何单个字符。
[]:指定范围 ([a-f]) 或集合 ([abcdef]) 中的任何单个字符。
[^]:不属于指定范围 ([a-f]) 或集合 ([abcdef]) 的任何单个字符。
例子:
A:查询姓王的学生(使用带 % 通配符)
select * from Student where RealName like '王%'
B:查询姓王的学生(使用带 _ 通配符)
select * from Student where RealName like '王_'
C:查找姓名为王文或张文的学生(使用 [] 通配符)
select * from Student where RealName like '[王,张]文'
in
in确定指定的值是否列表中的值相匹配。
一个方法是很多个OR条件,可以用IN或NOT IN关键字。
例子:
--选出年龄是20,21,19岁的学生
select * from Student where Age in(20,21,19)
–-选出年龄不是20,21,19岁的学生
select * from Student where age not in (20,21,19)
between
首先先思考一下between 15 and 20的范围包括15和20吗?
例子:
select * from studnet
whree age between 15 and 20--查询出年龄介于15到20之间的学生信息--后面条件也可以更改为 where age>=20 and age<=50
where 限定条件
指定查询返回的行的搜索条件。
A. 使用简单等式查找行
SELECT EmployeeKey,LastName FROM DimEmployee WHERE LastName ='Smith';
B. 查找包含作为字符串一部分的值的行
SELECT EmployeeKey,LastName FROM DimEmployee WHERE LastName LIKE('%Smi%');
C. 使用比较运算符查找行
SELECT EmployeeKey,LastName FROM DimEmployee WHERE EmployeeKey<= 500;
D. 查找满足三个条件当中的任何一个条件的行
SELECT EmployeeKey,LastName FROM DimEmployee
WHERE EmployeeKey = 1 OR EmployeeKey = 8 OR EmployeeKey = 12;
E. 查找必须满足若干个条件的行
SELECT EmployeeKey, LastName FROM DimEmployee
WHERE EmployeeKey <= 500 AND LastName LIKE '%Smi%' AND FirstName LIKE'%A%';
--"%" 是个通配符表示匹配所有字符。匹配单个字符需要使用 "_"。
--查询某列的内容本身中含有%的行,用中括号[]将%包起来。
F. 查找位于值列表中的行
SELECT EmployeeKey, LastName FROM DimEmployee
WHERE LastName IN ('Smith', 'Godfrey', 'Johnson');
--in 后边跟一对小括号,括号内填写 常量值,值之间用逗号分割,
--当然也可以使用 not in 来表达相反的意思。
G. 查找含有两个值之间的一个值的行
SELECT EmployeeKey, LastName FROM DimEmployee
WHERE EmployeeKey Between 100 AND 200
--NOT对谓词指定的布尔表达式求反
--AND组合两个条件,并在两个条件都为 TRUE 时取值为 TRUE
--OR组合两个条件,并在任何一个条件为 TRUE 时取值为 TRUE。
运算符
比较运算符
比较运算符测试两个表达式是否相同。 除 text、ntext 或 image 数据类型的表达式外,比较运算符可以用于所有其他表达式。 下表列出了 Transact-SQL 比较运算符。
运算符 | 含义 |
---|---|
=(等于) | 等于 |
>(大于) | 大于 |
<(小于) | 小于 |
>=(大于或等于) | 大于等于 |
<=(小于或等于) | 小于或等于 |
<>(不等于) | 不等于 |
!=(不等于) | 不等于(非 ISO 标准) |
!<(不小于) | 不小于(非 ISO 标准) |
!>(不大于) | 不大于(非 ISO 标准) |
逻辑运算符
逻辑运算符对某些条件进行测试,以获得其真实情况。 逻辑运算符和比较运算符一样,返回带有 TRUE、FALSE 或 UNKNOWN 值的布尔数据类型。
运算符 | 含义 |
---|---|
AND | 连接两个条件,并且仅当两上条件都为真时才返回true |
OR | 连接两个条件,但只要其中任一个为真就返回TRUE。 |
NOT | 一个语句中使用了多个逻辑运算符时,首先求not的值,然后求and的值 ,最后再求or的值 |
ANY | 表示至少一个值 例:>ANY (1, 2, 3) 表示大于 1 |
ALL | 表示每一个值或者说表示最大值 例:>ALL (1, 2, 3) 表示大于 3 |
SOME | 表示其中某些,与any等效的。 |
BETWEEN | 如果操作数在某个范围之内,那么就为 TRUE。 |
EXISTS | 如果子查询包含一些行,那么就为 TRUE。 |
IN | 如果操作数等于表达式列表中的一个,那么就为 TRUE。 |
LIKE | 如果操作数与一种模式相匹配,那么就为 TRUE。 |
注意:
=ANY 运算符与 IN 等效
< >ANY 运算符则不同于 NOT IN
<>ANY(a,b,c) 表示不等于 a,或者不等于 b,或者不等于 c。NOT IN 表示不等于 a、不等于 b 并且不等于 c。
<>ALL 与 NOT IN 表示的意思相同。
查询结果集创建新表
语法:SELECT * INTO 新表名称 FROM 源表名
查询结果集加入已有表
INSERT [INTO] 表名1 (列名) 结果集