sql server 快速入门学习笔记(基础)

以下是我刚开始学习sql过程中自己写的一些笔记 ,希望对刚开始入门的朋友有点帮助

内容比较杂大家见谅

 sql 语句

1.增加语句
(1)insert into <表名>([列名,列名])
values (对应列的值, 对应列的值)        
其中若值为NULL 则用default 填充, 字符串用'' int不用   该语句不能多行输入

(2)insert into <表名> (列名, 列名)
select 对应值, 对应值 union
select 对应值, 对应值 union
select 对应值, 对应值
该行可以一次性多行输入.  不能输入空值

(3)insert into <表名1> (列名, 列名)
select 列名, 列名 from <表名2>
从表2 中选出 两列值添加到表1 的两列中    表1必须是已经存在的表

(4)select 列名, 列名 into 表名1 from 表名2
新建一个表1, 将表二的两列添加到这个新表中. 表1必须是不存在的表
若要重复执行该语句应该把表1删除了
drop table 表1   删除该表
表1 前面加一个# 代表者新建临时表

2.更新语句
(1) update 表名 set 列名=.., 列名2 = ...
where 条件              如果条件为真则对列进行操作否则不操作
判断是否为空值
where 列 is NULL or 列=''

3.删除语句
(1)delete from 表名
where 条件

4.查询语句
全句:select 列名 from 表名 where 条件 group by 分组 having 再次筛选 order by 排序 (asc&desc)

5.模糊搜索  (当条件搜索的列中有NULL则跳过对应行)
 列名 like '(三个通配符 %, _, [],)加内容'
% :表示位数任意  字符任意 
eg: '许% '  表示找到以许开头的字符串 许后续有多少位都没关系
   '%@% '  表示找内容有 @ 的字符串

_ :表示一个任意字符
eg: '许_'   表示找两位字符组成的字符串 开头是  许

[]:表示 取一个范围  只表示一位
eg: '[A-Z]%'表示找以大写字母开头的字符串
   '[^A-Z]%'表示找不是以大写母开头的字符串

6. 条件运算符
(1) between .... and .....
eg: 列名 between 起始值 and 终止值   (值可以是时间和数值)

(2) or 或  , and  与 , not 非   
注 : and 的优先级 高于or

(3) IS NULL & NOT IS NLL
注 : 判断是否为空

(4) in (合法值, 合法值...)
eg: 列名 in (1,5)  表示这个列 要等于 1 或者 5 两个值  

7. 算数运算符
+ | -
* | / 除 (除法和c语言一样)
% 取模 |

8. 逻辑运算符
> 大于 | < 小于
= 等于 | >= 大于等于
<= 小于等于 | <> 不等于

9. 其他
(1) top 行数
eg: select top 5 列名 from 表名   显示找出的所有记录的前五条记录

(2) as 别名
eg: select 列名 as 别名 from 表名 as 别名   
给想要附上别名的列附别名. 表也可以 别名只有本个select语句中生效

(3)列链接符 +
eg: select 列名+列名+'字符串' from 表名  + 号可以连接起前后两个列 或者字符串(常量列)

10.聚合函数
(1) count (* || 列名) 计算一共有多少行 包括 null
(2) sum (列名) 计算这一列数值的总和 (空值NULL跳过)
(3) avg (列名) 计算这一列的数值的平均值 (空值NULL跳过)
(4) max (列名)||min (列名)找出这一列的最大或则最小值

注: 聚合函数一般与group by 一起使用 
eg: select 列名1,列名2, ...count (*) from 表名 group by 列名1, 列名2.. 
select 中有点列名 group by 中一定要有 只能多不能少

11. 内连接  (进行表与表之间的笛卡尔积)
(1)inner join
eg : select 表名1.列名1, 表名2.列名2 ...
from 表名3 (一般是主表 既主键)
inner join 表4 (外键) on 表4.列名 = 表3,列名
inner join 表5 (外键) on 表5.列名 = 表.列名   注: 这表示表5和上面连接后的表连接  
这里的表名都是乱填的 看情况连接
(2)from 多个表
eg: select 表名1.列名, 表名2.列名...
from 表1 , 表2
where 表1.列名= 表2.列名

12.外连接  (格式和inner join 一样)
(1) left join 关键字的左边表为主表  注:如果主表有23行则连接后的表也为23行
(2) right join 关键字的右边表为主表  注:...............................

13. 时间函数 (常用)   帮助文档 里 更多
(1)时间缩写 year   yy, yyyy
quarter qq, q
month   mm, m
dayofyear   dy, y
day   dd, d
week   wk, ww
weekday   dw 
Hour Hh
Minute mi、n
Second ss, s

(2)DATEPART () 返回一个具体日期的日期部分的整数。
格式: DATEPART (要返回的部分,'具体时间')
eg :  DATEPART (YY, '1994-1-5') 返回1994

(3)DATEADD ()   返回将指定时间加上具体时间后的时间
格式: DATEADD (要加的部分, 要加多少, '具体时间')
eg: DATEADD (YY, 6, '1994-1-5')   返回:2000-1-5...

(4)DATEDIFF () 返回两个时间时间的差
格式: DATEDIFF (要返回的部分, '时间1', '时间2')  时间2-时间1 单位为 要返回的部分
eg:   DATEDIFF (MM, '1994-1-1', '1995-1-1') 返回:12

14.字符串函数(常用) F1  (字符串函数 (Transact-SQL))看帮助文档
(1)CHARINDEX () 在一个字符串中寻找另一串字符的位置并返回它的位置
格式: CHARINDEX ('要找的字符串', '被找的字符串', 开始寻找的位置)
eg:  CHARINDEX ('EF','AB C DEFGH', 2) 返回在字符串中的绝对位置 7
    CHARINDEX ('EF','AB C DEFGH', 3) 2和3都是表示开始寻找的位置还是返回 7

(2)SUBSTRING () 将字符串截取一部分出来并返回
格式: SUBSTRING ('字符串', 起始位置, 截取位数)
eg:   SUBSTRING ('ABCDEFGH', 2, 4) 返回 BCDE
     SUBSTRING ('ABCDEFGH', 3, 4) 返回 CDEF

(3)LEN () 返回指定字符串表达式的字符数,其中不包含尾随空格
格式: LEN ('要计算位数的字符串')
eg: LEN ('ABCDEF') 返回 6

(4)LEFT () 返回字符串中从左边开始指定个数的字符
格式: LEFT ('字符串', 要返回的位数)
eg: LEFT ('ABCDEFGH', 3) 返回 ABC

(5)LOWER () 将大写字符数据转换为小写字符数据后返回字符表达式。
  UPPER () 将小写字符数据转换为大写字符数据后返回字符表达式。
eg: LOWER ('ABCDEF') 返回 abcdef
     UPPER ('abcdef') 返回 ABCDEF

(6)LTRIM () 删除字符串的前导空格
  RTRIM () 删除字符串的尾随空格
格式: LTRIM ('字符串')
     RTRIM ('字符串')

(7) RIGHT () 同理LEFT ()

(8) REPLACE () 用另一个字符串值替换出现的所有指定字符串值
格式: REPLACE ('具体字符串', '将被替换的部分', '用来替换的部分')
eg: REPLACE ('abcdefghicde','cde','xxx') 返回 abxxxfghixxx

(9) STUFF () 将字符串插入另一字符串。它在第一个字符串中从开始位置删除指定长度的字符;然后将第二个字符串插入第一个字符串的开始位置。
格式: STUFF ('字符串1', 开始位置, 删除的位数, '字符串2')
eg:  STUFF('abcdef', 2, 3, 'ijklmn') 返回 aijklmnef

16. 数学函数 F1

15. 其他函数
(1) CONVERT () 将一种数据类型的表达式转换为另一种数据类型的表达式
格式: CONVERT (类型, 要被转换的表达式)
注: 类型见 F1 帮助文档 CONVERT函数

进阶

1. 建库
(1)先查看要创建的数据库是否存在和开启xp_cmdshell
use master
go
if exists (select * from sysdatabases where name = '数据库名')
drop database 数据库名
exec sp_configure 'show advanced options',1 --0|关闭;1|打开
go

reconfigure
go

exec sp_configure 'xp_cmdshell',1
go

reconfigure
go

exec xp_cmdshell 'mkdir d:\sqldata' --表示在d:\下建一个sqldata文件,rmdir表示删除
reconfigure
go

--开始建库
create database 数据库名
on [primary] --primary定义主文件可省略
(
name = '数据文件名', --逻辑名
filename = 'D:\SqlData\数据文件名.mdf', --物理名
size = 5mb, --初始大小
maxsize = 100mb, --增长最大值
filegrowth = 15% --增长率
),
() --要是还有数据文件可逗号然后括号继续如上添加
log on --建日志文件
(
name = '日志文件名', --逻辑名
filename = 'D:\SqlData\数据文件名.ldf', --物理名
size = 1mb, --初始大小
maxsize = 10mb, --增长最大值
filegrowth = 1 --增长率
),
() --要是还有日志文件可逗号然后括号继续如上添加
go --建完要注意go一下 才能引用

(2)库级操作
execute sp_helpdb --省略数据库名则查询所有数据库信息
go

execute sp_helpdb DBONE --查询数据库DB1的信息
go

--更新数据库名称
execute sp_renamedb DB1,DBone --将DB1改为DBONE
GO

SELECT * FROM sys.databases where name='DBONE' --查询DBONED 的信息.或者用sp_helpdb
go

--增加数据库的数据文件 alter database 数据库名
alter database DBONE
add file
(
name=DB11_data,
filename='E:\SQLDB\DB11_data.mdf',
size=3,
maxsize=8,
filegrowth=10%
)
go
--增加数据库的日志文件
alter database DBONE
add log file
(
name=DB11_log, --没咧出来的项 系统赋默认值
filename='E:\SQLDB\DB11_log.ldf',
filegrowth=10%,
size=2
)
GO

--修改数据库文件
alter database DBONE
modify file
(
name=DB1_data, --指定被要修改的文件
size=7, --要修改的值
maxsize=15
)
go
--同理修改日志文件
alter database DBONE
modify file
(
name=DB1_log,
size=3
)
go

--删除数据库文件
alter database DBONE
remove file DB11_log

2. 建表
(1)约束constraint 
NOT NULL | NULL:不允许为空和允许为空
PRIMARY KEY:主键,不能为空,且唯一,
UNIQUE:值唯一,允许一个空值
REFERENCES:外键
CHECK:取值范围
identity(1,1):自增
default('默认值'):默认值

(2)常用的表
sysdatabasses :所有的数据库信息

sysobjects :所有表信息(约束,视图,索引)

syscolums :字段信息

systypes : 对于每种系统提供数据类型和用户定义数据类型,均包含一行信息.

sysindexes :索引信息

(3)建表步骤

--先判断表存不存在
if exists (select * from sysobjects where name = '表名')
drop table 表名

--创建局部临时数据库表在表名前面加#,如:create table #table1
--创建全局临时数据库表在表名前面加##,如:create table ##table1

create table 表名
(
列名 类型 各种约束  --约束之间没有区分顺序以空格隔开,
列名 类型 各种约束  --约束之间没有区分顺序以空格隔开
)
go

example:
create table table1
 (
 StoreHouseID int constraint pk_SH1 PRIMARY KEY, --constraint 约束名,可省略如:StoreHouseID int PRIMARY KEY,
 
 StoreHouseND varchar(50) constraint uk_SH1 UNIQUE,
 
 City varchar(50) NOT NULL,
 
 --City varchar(50) default '上海' --这里省略了constraint
 
 Area int constraint ck_A1 CHECK (Area>600 and Area<1800)
 )
 go
 
create table table3
 (
 StaffID int primary key,
 StaffND varchar(50) unique,
 StoreHouseND varchar(50),
 Salary int 
 )
 go
create table table4
 (
 OrderID int primary key,
 OrderND varchar(50) unique,
 StaffND varchar(50) references table3(StaffND),
 --references后面为主表,要先建主表才能建附表,然后关联
 --table3的staffND为主键 table4的为外键
 PayData datetime,
 PayMoney int
 )
 go
 --创建含有计算字段的表
 create table table5
 (
 StaffID int identity(1,1) primary key,
 --自编号列,identity(1,1) 从1开始每次加1
 StaffND varchar(50) unique,
 StoreHouseND varchar(50),
 基本工资 int default 900 check(基本工资>800 and 基本工资<2000),
 --默认值:default 值
 加班工资 int,
 奖金 int,
 扣率 int,
 应发工资 as(基本工资+加班工资+奖金-扣率) --计算字段
 )
 go
(4)表外添加约束

alter table 表名
add constraint 约束名 约束 

example :
alter table table1 --给table1 添加主键组StoreHouseID, StoreHouseND
add constraint pk_StoreHouseID primary key (StoreHouseID, StoreHouseND)

alter table table1 --给table15 添加默认值
add constraint dk_基本工资 default (900) for 基本工资

alter table Student --添加外键foreign key (外键) references 主表 (主键),
add constraint FK_Student_GradeId foreign key (GradeId) references Grade (GradeId)

alter table table5
add constraint CK_基本工资 check(基本工资>800 and 基本工资<2000)

(5)表级操作

--查看表信息
--sp_help 方式查看
 execute sp_help --省略表名,查看所有表的基础信息
 go
 
 execute sp_help table1 --查看table1表的具体信息
 go
 
 --select 方式查看
 select * from sysobjects where type='U'--查看所有表的基础信息
 
 --重命名表
 --格式:execute sp_rename 'oldname','newname'
 execute sp_rename 'table11','table1'
 execute sp_help table2
 
 --增加表的列, 可以附带各种约束 
 --格式: alter table 表名 add 列名 类型 约束
 alter table table1 add Email varchar(50) not null check (Email='1')
 go
 execute sp_help table1
 
 --在SQL sever 中可以修改非空列的大小
 --有约束或者默认值的列不能修改
 --要指明哪个表,哪个列
 alter table table1
 alter column Email varchar(100)
 go
 execute sp_help table1
 
 --删除列,指定表,指定列
 -- 要是该列有约束就要先删除约束 如:主外键.ck.pk.uk 才能删掉
 --先删除列的约束
 alter table table1
drop constraint CK__table1__Email__1920BF5C
 go
 
 --在删除列
 alter table table1
drop column Email
 go
 
3. T-SQL 编程
(1) 变量
 变量定义 : declare @变量名1 类型, @变量名2 类型
 
 赋值 : set @变量名1 = 值    --set 只能给单一变量赋值
 
 select  @变量名1 = 值, @变量名2 = 值 --可以多个变量赋值
 
 select @变量名1 = 列名 from 表 --这样到这列的最后一个值(重复赋值,所以要确保只有一条)
 
 当表达式返回多个值时: set 出错 select 将最后一个值赋给变量
 当表达式未返回值时:  set 变量被赋null值 select 变量保持原值
 常用全局变量:
  @@ERROR 最后一个错误的错误代码
@@IDENTITY 最后一次插入的主键值
@@servername 本地服务器的名称
@@version SQL Server的版本信息
(2)流程控制
条件: if ()
 begin
 end
 else
 bengin
 end

循环: 

while ()

 begin
 break --跳出循环
 end
(用在查询的时候) 多分支: case 
when 条件1 then 结果1
when 条件2 then 结果2
.....
else 其他结果
end

4. 事务
begin tran --开始事务
rollback tran --回滚事务
commit tran --提交事务

example:

BEGIN tran --转账业务
declare @error int,@debt numeric(18,2)
set @error = 0
set @debt = 800
UPDATE Account SET accountMoney= accountMoney-@debt
WHERE accountNo = '001'
SET @error = @error+@@error
UPDATE Account SET accountMoney= accountMoney+@debt
WHERE accountNo = '002'
SET @error = @error+@@error
if @error>0
rollback tran
else
commit tran
SELECT * FROM Account

5. 视图 --将select的结果集变成一张虚拟表,课直接使用,增删改结果影响原表
create view 视图名
as
select语句
go

6. 索引
unique 唯一索引
primary 主键索引
clustered 聚集索引
non-clustered 非聚集索引

(1)建索引
if exists (select * from sysindexes where name = '索引名' )
drop index 表名.索引名
create 索引类型 index 索引名
on table_name (列名) --在那一列建
[with fillfactor = x] --填充因子:指定0-100之间,表示索引页填充的百分比

(2)使用索引查询
select * from student
with (index = 索引名)
where studentname  like '李%'
表示用这个索引查找姓李的学生

7. 存储过程

模板:
CREATE proc sp_name1 --命名sp_开头 关键字 proc
(
@参数3 参数类型 output,
@参数5 参数类型 = 默认,
@参数1 参数类型, --形参列表 默认input输入参数  output为输出参数
@参数2 参数类型
@参数4 参数类型 = 默认
)
as
--这里填操作语句

GO
调用:exec sp_name1 @参数3 output, default, @参数1,  @参数2

注意事项:
(1)输出参数和输入参数的引用一样

(2)输出参数也可以输入

(3)输出形参也可以带默认值

(4)输出参数一般放置在所有参数之前

(5)return 结束存储过程

(6)raiserror ('提示信息',错误级别,状态)

(7)指定参数赋值

(8)默认参数放在所有参数之后

(9)一般结合事务使用,事务嵌套存储过程

8.触发器
注意:
(1)inserted 表 和 deleted 表

(2)增加时先添加到inserted表,删除时先把要删除的放在deleted表

(3)修改是把原来的删掉,在插入新的,所以原来的在deleted表要插入的在inserted表

(4)after 表示已经插入后触发,instead of 表示还没插入的时候触发 都放在inserted表和deleted表

(5)触发器是更高级的事务

(6)rollback tran 回滚事务 有问题就回滚

(7)instead of 成功的话要再次执行一次操作一次而且要用变量
insert into score (sno,cno,grade) values (@sno,@cno,@grade)


格式:
create trigger 触发器名
on 表名
[after | instead of] [insert | delete | update]
as
--执行内容
go

或者
create trigger 触发器名
on 表名
for [insert | delete | update]  --默认after
as
--执行内容
go

9.游标
格式:
declare @变量1 类型, @变量 类型 .... 声明一些变量来传递值

declare 游标名 cursor for 声明游标

select 列1, 列2 from 表 where ... 指定在哪个结果集里遍历

open 游标名 打开游标

fetch next from 游标名 第一次将游标指向下一个,也就是第一条记录

into @变量1,@变量2

while @@fetch_status = 0 当@@fetch_status = 0 时表示遍历完了

begin

操作语句

fetch next from 游标名 循环将游标指向吓一条记录

into @变量1,@变量2

end

close 游标名 关闭游标

dealllocate 游标名 删除游标



你可能感兴趣的:(原创)