Sqlserver学习笔记快速让自己快速上手已忘记知识点

第一天
1.新建数据库
2.分离数据库
3.附加
4.创建表
CREATE TABLE  表名
 (
    列名1 数据类型 列的特征,
    列名2 数据类型 列的特征,
     ...
)
///////////////////
USE MySchool                       --将当前数据库设置为MySchool
GO
CREATE  TABLE  Student    --创建学生信息表
(
  StudentNo   int  NOT  NULL,                       --学号,非空(必填)
  LoginPwd  nvarchar(20)  NOT  NULL,        --密码,非空(必填)
  StudentName  nvarchar(20)  NOT  NULL,  --姓名,非空(必填)
  Sex bit NOT NULL,                                       --性别,非空(必填)
  GradeId int NOT NULL,                                --年级号(必填)
  Phone nvarchar(50) NOT NULL,                  --电话
  BornDate  datetime  NOT  NULL,                --出生日期(必填)
  Address  nvarchar(255),                              --地址
  Email nvarchar(50),                                      --邮件帐号
  IDENTITYCard varchar(18)                          --身份证号

GO
5.检测表是否存在
select *from 表名
6.删除表
DROP TABLE 表名
7.判断课程表是否存在,若存在则删除
使用SQL语句创建课程表subject
USE MySchool
GO
IF EXISTS (SELECT * FROM  sysobjects  WHERE  name='Subject' )
    DROP  TABLE  Subject
GO
CREATE  TABLE Subject    --创建课程表
(
    SubjectNo int  IDENTITY(1,1)  NOT NULL,
    SubjectName nchar(50) NOT NULL,
    ClassHour int NOT NULL,
    GradeId int NOT NULL

GO

8.增加一行写内容
insert into 表名(列名,列名,列名) values(列内容,列内容,列内容)
insert into grade(id,studentId,result,subject) values(4,'1001',90,'英语')

9.修改内容
update grade set 列名='修改内容' where 要修改的标记
update grade set subject='语文' where id=3
10.删除行
delete from grade where 要修改的标记
delete from grade where id=4
10.
    数据完整性有哪几种?各自作用是什么?
    实体完整性
    能够唯一标识表中的每一条记录
    实现方式:主键、唯一键、IDENTITY属性
    域完整性
    表中特定列数据的有效性,确保不会输入无效的值
    实现方式:类型、缺省值、约束、空值
    引用完整性
    维护表间数据的有效性、完整性
    实现方式:建立外键联系另一表的主键
    自定义完整性
    根据业务处理流程定义的特定业务规则
    实现方式:存储过程、触发器、规则

11.
    使用约束的目的是什么?
    确保表中数据完整性
    常用的约束类型有哪些?
    主键约束(Primary Key Constraint):要求主键列数据唯一,并且不    允许为空
    唯一约束(Unique Constraint):要求该列数据唯一,允许为空,但只    能出现一个空值
    检查约束(Check Constraint):某列取值范围限制、格式限制等
    默认约束(Default Constraint):某列的默认值
    外键约束(Foreign Key Constraint):用于两表间建立关系,需要指    定引用主表的哪列

12.添加约束
添加约束的语法
ALTER TABLE 表名  
     ADD CONSTRAINT 约束名  约束类型  具体的约束说明

约束名的取名规则推荐采用:约束类型_约束列
主键(Primary Key)约束:如 PK_stuNo
唯一(Unique Key)约束:如 UQ_stuID
默认(Default Key)约束:如 DF_stuAddress
检查(Check Key)约束:如 CK_stuBornDate
外键(Foreign Key)约束:如 FK_stuNo 

如何在表Student中添加下面的约束?
主键约束:学号
唯一约束:身份证号 
默认约束:Address列的默认值是“地址不详”
检查约束:出生日期的值为1980年1月1日后
外键约束:设置GradeID列为外键,建立Grade表与Student表的引用关系

ALTER TABLE Student    添加主键约束(StudentNo作为主键)
     ADD CONSTRAINT PK_stuNo PRIMARY KEY (StudentNo)
ALTER TABLE Student    添加唯一约束(因为每人的身份证号全国唯一)
    ADD CONSTRAINT UQ_stuID UNIQUE (IDENTITYCard)
ALTER TABLE Student    添加默认约束(如果地址不填,默认为“地址不详
    ADD CONSTRAINT DF_stuAddress DEFAULT ('地址不详') FOR stuAddress
ALTER TABLE Student    添加检查check约束,要求出生日期在1980-1-1之后
    ADD CONSTRAINT CK_stuBornDate 
        CHECK(BornDate > '1980-01-01')

ALTER TABLE Grade     添加主键约束(GradeID作为主键)
    ADD CONSTRAINT PK_GradeID PRIMARY KEY(GradeID)

ALTER TABLE Student    添加外键约束(主表Grade和从表Student建立关系,关联列为GradeID)
    ADD CONSTRAINT FK_Grade          
    FOREIGN KEY(GradeID) REFERENCES Grade(GradeID)
GO

13.删除约束
alter table 表名
drop constraint 约束名
例如:删除Student表中地址默认约束
ALTER  TABLE  Student  
     DROP  CONSTRAINT  DF_stuAddress

扫描二维码关注公众号,回复: 4112040 查看本文章

第二天

1.SQL简介
SQL是什么?
Structured Query Language:结构化查询语言
为何要使用SQL?
难道仅仅使用SQL Server Management Studio操作数据库?
应用程序如何与数据库打交道?
如何使用?
对SQL Server执行所有的操作都是可以
程序中的增删改查
怎么使用?
。。。。

2.SQL的组成
DML(数据操作语言)
插入、删除和修改数据库中的数据
insert、update、delete等
DCL(数据控制语言)
用来控制存取许可、存取权限等
grant,revoke等
DQL(数据查询语言)
用来查询数据库中的数据
select等
DDL(数据定义语言)
用来建立数据库,数据对象和定义表的列
create ,table,drop,table等

3.SQL中的运算符
运算符
一种符号,它是用来进行列间或者变量之间的比较和数学运算的
算数运算符:+,-,*,/,%
赋值运算符:=  如:name='王华'
比较运算符:=,>,<,<>,>=,<=,!=
逻辑运算符:AND,OR,NOT

4.插入数据行语法
insert[into]表名[(列名)]values(值列表)
向学生表中插入一行数据
insert into student(SName,SAddress,SGrade,SEmail,SSEX) values('张青裁','上海松江',6,'[email protected]',0) 
难点分析
默认值的插入方式、日期型数据的插入方式、允许空值的列插入方式

5.插入多行数据
1)通过insert select语句将现有表中的数据添加到已存在的表中
语法
insert into <表名>(列名)
select<列名>
from <源表名>
示例
insert into AddressList (姓名,地址,电子邮件) 
select SName,SAddress,SEmail
from Students

2)通过SELECT INTO语句将现有表中的数据添加到新表中
SELECT(列名)
INTO<表名>
FROM<源表名>
示例
SELECT tudents.SName,Students.SAddress,Students.SEmail
INTO AddressList
FROM  Students

3)通过UNION关键字合并数据进行插入
INSERT INTO<表名>(列名)
SELECT<列名>UNION
SELECT<列名>UNION
SELECT<列名>UNION
.......
示例
INSERT STUDENTS(SName,SGrade,SSex)
SELECT '张可',7,1 UNION
SELECT '李扬',4,0 UNION
SELECT '杨晓',2,0 UNION
SELECT '汤美',3,0 UNION
SELECT '苏三东',7,1 UNION
SELECT '王立岩',3,1 UNION
SELECT '张伟',7,1 UNION
SELECT '陈刚',4,1 UNION
SELECT '王娟娟',7,0 //最后一个不能加UNION

6.使用UPDATE更新数据
UPDATE 表名 SET 列名=更新值
[WHERE 更新条件]
示例
UPDATE STUDENTS SET SSEX=0
UPDATE STUDENTS 
SET SADDRESS='北京女子职业技术学校家政班'
WHERE SADDRESS='北京女子职业技术学校刺绣班'
UPDATE SCORES
STE SCORES=SCORES+5
WHERE SCORES<=95
难点分析
多条件的联合使用AND
WHERE EXAMDATE='2009-9-13' AND SUBJECTLD=1
AND STUDENTTESULT<60
日期的比较
WHERE EXAMDATE='2009-9-13'
判断是否为空
WHERE EMAIL IS NULL OR EMAIL=''

7.使用DELETE删除数据行
语法
DELETE[FROM]表名[WHERE<删除条件>]
注意:字表中存在对应数据时直接删除会有运行错误

8.查询语法
语法
SELECT <列名>
FROM <表名>
[WHERE <查询条件表达式>]
[ORDER BY <排序的列名>[ASC或者DESC]]
示例
SELECT SCode,SName,SAddress 
FROM STUDENTS
WHERE SSEX=0
ORDER BY SCODE
查询部分行或列:
查询‘北京’地区的学生姓名和年级
SELECT SNAME,SGRADE FROM STUDENTS
WHERE SADDERSS='北京'
查询女学生姓名和地址
SELECT SNAME,SADDRESS FROM STUDENTS
WHERE SSEX=1

9.数据查询-列别名
1)使用AS来命名列
示例
SELECT SCODE AS 学生编号,SNAME AS 学生姓名,SADDRESS AS 学生地址
FROM STUDENTS
WHERE SADDRESS<>'河南新乡'
SELECT FirstName+'.'+LASTNAMEAS姓名
FROM Employees
注意:
1.+连接的数据类型必须兼容
2.如果+连接字符型数据,结果为字符串数据的连接
3.如果+连接数值型数据,结果为数值的和
2)使用=来命名列
SELECT 姓名=FistName+','+LastName
FROM Employees

10.数据查询-空行、常量列
1)查询空行
SELECT SName FROM Students WHERE SEmail IS NULL
问题:原来有数据,但数据被清除的列这样能怎么样查出来?
2)使用常量列
SELECT 姓名=SName,地址=SAddress,'北京新兴桥' AS 学校名称
FROM Students

11.数据查询-限制行数
1)限制固定行数
SELECT TOP 5 SName, SAddress
FROM Students WHERE SSex=0
2)返回百分之多少行
SELECT TOP 20 PERCENT SName, SAddress
FROM Students WHERE SSex=0

12.查询单行排序
1)升序查询
示例
SELECT StudentID,Score FROM Score ORDER BY Score
SELECT StudentID AS 学生编号,(Score*0.9+5)AS综合成绩
FROM Score
WHERE(Score*0.9+5)>60
ORDER BY Score
2)降序排序
SELECT StudentID,Score FROM Score ORDER BY Score DESC
3)按多列排序
示例
SELECT StudentID AS 学生编号,CourseID AS 课程ID,ScoreAS 成绩 FROM Score
WHERE Score>60
ORDER BY CourseID, Score
提问
1、如果成绩按升序,课程编号按降序,该如何编写?
2、排序中的列,可以使用表达式吗?
       —— 如果不可以,请说明原因
       —— 如果可以,请举例说明

13.什么是模糊查询
语法:SELECT * FROM Students
      WHERE 姓名 like '张%'
一类字符,代替一个或多个真正的字符
与LIKE关键字一起使用
表格
通配符        解释              示例          符合条件的值
-        一个字符         A LIKE'C_'              CS、Cd等
%        任意长度的字符串    B LIKE'CO_%'      CONST、COKE等
[]        括号中所指定范围    C LIKE'9W0[1-2]'      1W01或9W02
        内的一个字
[^]        不在括号中所指定    D LIKE'%[A-Z][^1-2]'  9W3或9W7
        范围内的一个字符
1)模糊查询-LIKE
注意:LIKE只与字符型数据联合使用**************************
提问:匹配,只要列中含有这些内容
SELECT*FROM 数据表
WHERE 编号 LIKE '00[^8]%[AC]%'
可能会查询出的编号值为( B  )。
A、9890ACD
B、007_AFF
C、008&DCG
D、KK8C

2)模糊查询-IS NULL
查询某一列中内容为空的记录
SELECT SName AS 姓名,SAddress AS 地址
FROM Students WHERE SAddress IS NULL
提问
把Students表中某些行的SAddress列值删掉后
把IS NULL能查询出来这些数据行吗?
怎么查询出这些行来?
SELECT SName AS 姓名, SAddress AS 地址
FROM Students 
WHERE SAddress=''
3)模糊查询-BETWEEN
查询某一列中内容在特定范围内的记录
SELECT StudentID, Score 
FROM SCore 
WHERE Score
BETWEEN 60 AND 80
想一想:可行么?
BETWEEN 80 AND 60
语法无误,但查询不到信息
4)模糊查询-IN
查询某一列中内容与所列出的内容列表匹配的记录
SELECT SName AS 学生姓名,SAddress AS 地址
FROM Students
WHERE SAddress 
IN('北京','上海','广州')

指导——使用模糊查询学生相关信息 2-1
训练要点:
使用LIKE、BETWEEN、IN进行模糊查询 
需求说明:
查询住址为“山东”的学生姓名、电话、住址
查询名称中含有“数据库”字样科目信息
查询电话中以“1387”开头的学生信息
查询姓姜的,单名的学生信息
查询考试成绩信息
查询某出生日期之间学生信息 
指导——使用模糊查询学生相关信息2-2
难点分析:
住址为山东 
WHERE  Address  LIKE  '%山东%' 
查询姓姜的、单名的学生信息 
WHERE  StudentName   LIKE   '姜_' 
限定某学生的某些科目的考试成绩信息
WHERE StudentNo='S1101004' AND SubjectId IN(1,2,3) 

14.SQL Server中的函数
常用的几类函数
1)字符串函数:用于控制返回给用户的字符串
2)日期函数:用于操作日期值
3)数学函数:用于对数值进行代数运算
4)系统函数:获取有关SQL Server中对象和设置的系统信息

案例1—问题
某公司印了一批充值卡,卡的密码是随机生成的,现在出现这个问题:
    卡里面的字母“O和数字0”、“字母i和数字1”,用户反映说看不清楚,公司决定,把存储在数据库中的密码中所有的“O”都改成“0”,把所有的“i”都改成“1”;
请编写SQL语句实现以上要求
数据库表名:Card
密码列名:PassWord
案例1—分析
实现卡密码更新的功能,需要使用UPDATE语句
牵涉到字符串的替换,需要使用到SQL Server中的函数REPLACE()
案例1—T-SQL
两行SQL语句
UPDATE Card SET PassWord = REPLACE(PassWord ,'O','0')
UPDATE Card SET PassWord = REPLACE(PassWord ,'i','1')
一行SQL语句
UPDATE  Card 
SET     PassWord = REPLACE(REPLACE(PassWord ,'O','0'),'i','1')

案例2—问题
在数据库表中有以下字符数据,如:
    13-1、13-2、13-3、13-10、13-100、13-108、13-18、13-11、13-15、14-1、14-2
现在希望通过SQL语句进行排序,并且首先要按照前半部分的数字进行排序,然后再按照后半部分的数字进行排序,输出要排成这样:
    13-1、13-2、13-3、13-10、13-11、13-15、13-18、13-100、13-108、14-1、14-2
数据库表名:SellRecord
列名:ListNumber
案例2—分析
排序:ORDER BY
在ORDER BY的排序列中,需要重新计算出排序的数字
前半部分的数字:
找到“-”符号的位置
取其左半部分
使用CONVERT函数将其转换为数字:
CONVERT(INT, LEFT(ListNumber, CHARINDEX('-', ListNumber)-1))
后半部分的数字:
找到“-”符号的位置
把从第一个位置到该位置的全部字符替换为空格
使用CONVERT函数将其转换为数字:
CONVERT(INT, STUFF(ListNumber,1, CHARINDEX('-', ListNumber), ''))
案例2—T-SQL
关键代码如下:
SELECT ListNumber
FROM    SellRecord
ORDER BY 
CONVERT(int, LEFT(ListNumber, CHARINDEX('-', ListNumber)-1)),
CONVERT(int, STUFF(ListNumber,1, CHARINDEX('-', ListNumber), ''))

指导——使用函数查询学生相关信息 2-1
训练要点:
使用SELECT语句查询数据
使用函数处理数据
需求说明:
查询年龄超过20周岁的三期的学生信息
查询1月份过生日的学生信息
查询今天过生日的学生姓名及所在年级
查询学号为“S1200902001”的学生Email的域名
新生入学,为其分配一个Email地址 
指导——使用函数查询学生相关信息2-2
难点分析:
年满20周岁的条件
DATEDIFF(DD,BornDate, GETDATE())>=365*20 
获取Email的域名
RIGHT(Email, LEN(Email) - CHARINDEX('@',Email) )
获取当前日期的年、月、日 
CONVERT(VARCHAR(4), DATEPART(YYYY,GETDATE()))
获取4位随机数 
RIGHT(RAND(),4) 

15.什么是聚会函数
已学过TSQL的内部函数
字符串函数
日期函数
数学函数
系统函数 
成绩表中存储了所有学生的成绩,如果想知道:
学生的总成绩、平均成绩、有成绩的学生总共有多少名?怎么办?
////
聚合函数:对一组值进行计算,并返回计算后的值 ,具有统计数据的作用
///
SUM()
SELECT SUM(Score)AS 学号为23的学生总分
FROM Score
WHERE StudentID=23
AVG()
SELECT AVG(SCore)AS 及格平均成绩
FROM Score
WHERE Score>=60
MAX()、MIN()
SELECT AVG(SCore)AS 平均成绩,MAX(Score) AS 最高分,MIN(Score)AS最低分
FROM Score
WHERE Score>=60
COUNT()
SELECT COUNT(*)AS及格人数
FROM Score
WHERE Score>=60

16.分组查询用法
分组查询的语句
语法
SELECT....FROM<表名>
WHERE....
GROUP BY...
示例
SELECT COUNT(*)AS 人数,SGrade AS 年级
FROM Students
GROUP BY SGrade
分组查询解析2-1
查询每门课程的平均分
      CourseID    课程平均成绩
1    1        76
2    3        71
3    9        78
按照什么进行分组?
SELECT CourseID, AVG(Score) AS 课程平均成绩
FROM Score
GROUP BY CourseID
注意:对分组后的每个组内的记录进行一个聚集,通常用到聚合函数
分组查询解析2-2
查询每门课程的平均分,并且按照分数由低到高的顺序排列显示
SELECT CourseID, AVG(Score) AS 课程平均成绩
FROM Score
GROUP BY CourseID
ORDER BY AVG(Score) 
1)多列分组
SELECT COUNT(*) AS 人数,SGrade AS 年级,SSex AS   性别
 FROM StudentS 
GROUP BY SGrade,SSex 
ORDER BY SGrade
2)分组筛选
语法
SELECT …… FROM  <表名>
WHERE ……
GROUP BY ……
HAVING……
示例
SELECT COUNT(*) AS 人数,SGrade AS 年级FROM Students 
GROUP BY SGrade
HAVING COUNT(*)>15 
WHERE与HAVING对比
WHERE子句:
用来筛选 FROM 子句中指定的操作所产生的行 
GROUP BY子句:
用来分组 WHERE 子句的输出 
HAVING子句:
用来从分组的结果中筛选行 

17常用的多表联接查询
内联接(INNER JOIN)
外联接
左外联接   (LEFT JOIN)
右外联接   (RIGHT JOIN)

内联接3-2
内联接语句
SELECT     S.SName,C.CourseID,C.Score 
FROM         Score AS C
INNER JOIN     Students AS S
ON         C.StudentID = S.SCode
等价
SELECT Students.SName, Score.CourseID, Score.Score
FROM     Students,Score
WHERE  Students.SCode = Score.StudentID
/////
内联接3-3
下面的查询语句返回的查询结果是一样的吗?
SELECT Students.SName, Score.CourseID, Score.Score
FROM     Students,Score
WHERE  Students.SCode = Score.StudentID
两个语句的执行结果相同
SELECT     S.SName,C.CourseID,C.Score 
FROM         Students AS S
INNER JOIN     Score AS C
ON         C.StudentID = S.SCode

左右联接、外部联接笔记没写

子查询得看PPT才行

三表内联接
SELECT 
S.SName AS 姓名, CS.CourseName AS 课程, C.Score AS 成绩
FROM Students AS S 
INNER JOIN Score AS C ON (S.SCode = C.StudentID)
INNER JOIN Course AS CS ON (CS.CourseID = C.CourseID)
左外联接
SELECT     S.SName,C.CourseID,C.Score 
FROM         Students AS S
LEFT JOIN     Score AS C
ON         C.StudentID = S.SCode
右外联接
SELECT 图书编号,图书名称,出版社名称
FROM 图书表
RIGHT OUTER JOIN 出版社表 
ON 图书表.出版社编号 = 出版社表.出版社编号
总结
在一个SQL语句中,GROUP BY、WHERE、HAVING这三部分正确使用次序是什么? 
将以下的SQL语句改写成内联接查询的语句
SELECT Students.SName, Score.CourseID,Score.Score 
FROM Students,Score 
WHERE Students.SCode = Score.StudentID
如下T-SQL语句返回结果是什么? 
SELECT * FROM Item AS a
 LEFT JOIN OrderDetails AS b
 ON a.Icode=b.ItemCode 

什么是子查询
子查询,总是用圆括号括起来
采用子查询实现
SELECT StudentNo, StudentName,  Sex, BornDate, Address 
 FROM Student 
 WHERE BornDate >
  (SELECT BornDate FROM Student WHERE StudentName='李斯文')
GO 

子查询在WHERE语句中的一般用法:
 SELECT … FROM 表1 WHERE 字段1  比较运算符(子查询)   
将子查询和比较运算符联合使用,必须保证子查询返回的值不能多于一个
子查询是一个嵌套在 SELECT、INSERT、UPDATE 或 DELETE 语句或其他子查询中的查询

首先,执行小括号中的子查询,返回的结果是所有来自子查询的结果
其次,才开始执行外围的父查询,返回查询的最终结果

使用子查询替换表联接
查询“Java Logic”课程至少一次考试刚好等于60分的学生
第一步:查询“Java Logic”课程的课程编号
第二步:根据课程编号查询成绩是60分学生的学号
第三步:根据学号查询得到学生姓名

实现方法一:采用表联接
SELECT StudentName FROM Student stu 
  INNER JOIN Result r ON stu.StudentNO = r.StudentNo
  INNER JOIN Subject sub ON r.SubjectNo = sub.SubjectNo 
  WHERE StudentResult = 60 AND SubjectName = 'Java Logic'
GO
实现方法二:采用子查询 
SELECT StudentName FROM Student WHERE StudentNo = (
    SELECT StudentNo FROM Result 
        INNER JOIN Subject ON Result.SubjectNo= Subject.SubjectNo 
        WHERE StudentResult=60 AND SubjectName='Java Logic'
  )
GO
一般来说,表联接都可以用子查询替换,但有的子查询却不能用表联接替换
子查询比较灵活、方便,常作为增删改查的筛选条件,适合于操纵一个表的数据
表联接更适合于查看多表的数据
 

猜你喜欢

转载自blog.csdn.net/qq_39556476/article/details/84101274
今日推荐