SQL Server 数据库

一、了解数据库

数据库:用于存储数据的仓库
常用的数据库 :
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:\TestDB\TestDBX.mdf' , SIZE = 5120KB , MAXSIZE = UNLIMITED, 
FILEGROWTH = 2048KB )
LOG ON 
( NAME = N'TestDB_log', FILENAME = N'E:\TestDB\TestDBX_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语句对数据库中表进行操作时,文本型和日期型数据需要加上单引号

ID为自增时,再添加ID时会报错错误
ID为自增时,再添加ID会报错错误

2.update更新表

UPDATE dbo.Student  
    SET RealName = 'Tim'  
    ,2 = 新值2
    WHERE 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. 结果集:查询得到的数据行的集合
查询的步骤:
1.	先确定要查询的表;
2.	确定查询的列名;
3.	结合条件看是否符合条件;

distinct 过滤重复

distinct 关键字用来过滤重复数据,保证查到的数据是唯一的。
语法:select distinct1,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 语句每组返回一行。
语法:select1 from 表A group by1
列表达式:
	允许使用下面的语句:
	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 子句一起使用。

wherehaving 的区别 :
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条件,可以用INNOT 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的范围包括1520吗?
例子:
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 (列名) 结果集
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1024节

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值