☻基本的一些常识
Day1
标准版 Standard
企业版 Enterprise
开发版 Developer
Express版
文件组是现代词,是一个专有名词,指的是SQL文件组就是文件的逻辑集合。
目的
它的目的是为了方便数据的管理和分配.文件组可以把指定是文件组合在一起。
临时表
Select * into #temp from sys.objects
数据库文件
配置SQLServer
常用数据库操作
数据库级别:可以分内存,分cpu核数给SQLServer
创建,修改
选项:恢复模式、Owner等
文件
文件组
联机、离线数据库
分离数据库 附加数据库——数据库可以拷走。
备份、恢复数据库 —— 一般是完整、差异、日志备份三种都用。
完整备份可以一月备份一次
差异备份可以一天备份一次
收缩数据库
删除数据库
索引
聚集索引
索引和内容的物理位置都是有序的,索引后面紧跟内容。
非聚集索引,就类似也按偏旁部首查字。
视图
就是起了个包装作用,就是把比较复杂的sql查询包装成一个视图,然后我们就可以通过查询该视图得到我们想要的数据。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Day2
数据库查询
子查询,深入理解:
1.Select 中的某个字段,可不可以用子查询做? 可以的
子查询可以用在select中的,这里只能返回一个字段值
子查询可以用在from后的,这里返回一个集合。
2.查询优化
需要哪些字段就查哪些字段,差多了没有用就会慢了。
3.什么时候,需要创建一个临时表
什么时候不用创建,就写select into #table from
上面的两种方式用法一样,就写select into #table from 是快捷操作。
两种方式各有优缺点
直接创建的临时表,表里面有已经创建好的我需要的字段名,
b. 就写select into #table from创建的临时表相对上面的不是固定的字段名,只是查出来的字段插入到临时表中了。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Day3
给变量赋值
Set
Select
两个赋值语句内部执行的复杂度差不多一样,因此我们推荐使用select 赋值语句,因为select语句可以带from做查询赋值。
存储过程中如何输出参数
在存储过程的定义变量中要定义一个接收输出参数的变量,在存储过程中需要输出的字段后跟out ,这样就可以把输出参数的值赋给定义好的变量了。
Sq_helptext 存储过程名
意思是输出存储过程的定义内容。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
☻删除姓名、年龄重复的记录(常考)
Id name age salary
1 yzk 80 1000
2 yzk 80 2000
3 tom 20 20000
4 tom 20 20000
5 im 20 20000
//取得不重复的数据
select * from Persons
where Id in
(
SELECT MAX(Id) AS Expr1
FROM Persons
GROUP BY Name, Age
)
根据姓名、年龄分组,取出每组的Id最大值,然后将Id最大值之外的排除。
删除重复的数据:
delete from Persons
where Id not in
(
SELECT MAX(Id) AS Expr1
FROM Persons
GROUP BY Name, Age
)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
☻数据修改包括:添加数据,更改数据,删除数据。
1.添加数据
添加数据包含两种方式,一种是一次插入一条数据(单行数据插入),另一种是一次添加一批数据(多行数据插入)。
插入单行数据的语句:
INSERT INTO Table_name(列名……) VALUES(值列表)
插入多行数据的语句:
INSERT INTO Table_name(列名……) SELECT ……
插入数据
①SELECT INTO
SELECT INTO语句不向调用者返回结果集,而是创建一个包含查询结果集的新表。
例如:SELECT *
INTO dbo.MyOrders
FROM Northwind.dbo.Orders
从其他数据库中查询数据插入到目表数据库(过程分析:查询数据——创建表——插入数据)
SELECT *
INOT NEW_TableName //这里注意:NEW_TableName 是物理上的表,如果是想使用临时表则是表名前带"#"
FROM NorthWind.dbo.TableName
WHERE ……
☻ROWNUM()函数的用法。
例:
SELECT CustomerID,ROW_NUMBER()OVER(ORDER BY CUSTOMERID) AS RN
FROM Northwind.dbo.Customers
WHERE Country =N'UK'
ROWNUM()函数的返回值是行号。
2.更新数据
更新数据指的是修改表中的列的值
UPDATE Table_name SET 列名=值 ,…… WHERE ……
用WHERE子句指定更新数据的条件时,分为两种情况:一种是基于本表条件的更新,即要更新的记录和更新记录的条件在同一张表中。另一种是基于其他表条件的更新,即要更新的记录在一张表中,而更新的条件来自其他表。基于其他表条件的更新的实现方法有两种:一种是使用多表连接的方式实现,另一种是使用子查询实现。
例1:基于本表条件的更新。将商品名为“最新款光波炉”的商品的单价降低100元。
UPDATE Table_Goods SET SaleUnitPrice=SaleUnitPrice-- 100
WHERE GoodsName = "最新款光波炉"
例2:基于其他表条件的更新。将家用电器类商品的单价降低5%
①用子查询实现
UPDATE Table_Goods SET SaleUnitPrice=SaleUnitPrice-SaleUnitPrice*0.05
WHERE GoodsClassID IN(
SELECT GoodsClassID FROM Table_GoodsClass
WHERE GoodsClassName="家用电器" )
② 用多表连接实现
UPDATE Table_Goods SET SaleUnitPrice=SaleUnitPrice-SaleUnitPrice*0.05
FROM Table_Goods A JOIN Table_GoodsClass B ON A.GoodsClassID =B.GoodsClassID
WHERE GoodsClassName="家用电器"
例3:对商品的单价进行分情况修改,家用电器类商品单价降低5%,服装类商品单价增加6%,食品类商品单价降低2%,其他类商品单价不变。
UPDATE Table_Goods SET SaleUnitPrice= CASE GoodsClassName WHEN '家用电器' THEN SaleUnitPrice=SaleUnitPrice-SaleUnitPrice*0.05
WHEN '服装' THEN SaleUnitPrice=SaleUnitPrice-SaleUnitPrice*0.06
WHEN '食品' THEN SaleUnitPrice=SaleUnitPrice-SaleUnitPrice*0.02
ELSE SaleUnitPrice
END
FROM Table_Goods A JOIN Table_GoodsClass B ON A.GoodsClassID =B.GoodsClassID
3.删除数据
删除数据使用的是DELETE 语句
DELETE FROM Table_Name WHERE ……
WHERE 子句说明只删除表中满足where子句条件的记录
。如果省略where子句,则表示要无条件删除表中的全部记录。
同UPDATE语句一样,删除数据也有无条件删除(删除表中的全部数据)和有条件的删除(删除满足条件的数据)两种。当用where子句指定删除条件时,又分为两种情况:一种是基于本表条件的删除,另一种是基于其他表条件的删除。基于其他表条件的删除可用两种方法实现:一种是使用多表连接实现,另一种是使用子查询实现。
例1.基于本表条件的删除。删除没有身份证号码的顾客。
DELETE FROM Table_Customer WHERE IdentityCard IS NULL
例2.基于其他表条件的删除。删除销售日期在2000年1月1日之前的销售单据明细表中的记录。
① 用于子查询实现
DELETE FROM Table_SaleBillDetail
WHERE SaleBillID IN (
SELECT SaleBillID FROM Table_SaleBill
WHERE SaleDate < '2000/1/1')
② 用多表连接实现
DELETE FROM Table_SaleBillDetail
FROM Table_SaleBillDetail A JOIN Table_SaleBill B
ON A.SaleBillID = B.SaleBillID
WHERE SaleDate < '2000/1/1'
总结:TRUNCATE TABLE 删除表中的数据是不记录日志的,删除数据不可执行回滚操作
DELETE FROM 删除表中的数据是记录日志的,删除数据可以执行回滚操作。
TRUNCATE在各种表上无论是大的还是小的都非常快。如果有ROLLBACK命令Delete将被撤销,而TRUNCATE则不会被撤销
T-SQL 支持基于联接的DELETE 和UPDATE 语法
☻基于联接的DELETE
基于联接的DELETE与基于联接的SELECT 类似。用DELETE FROM <目标表> 代替SELECT 子句即可,其中的<目标表>是你要从中删除行的表。需要注意的是,如果为表提供了别名则应该指定别名。
='19980506'" src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image001.png" width="576" height="156">