diff --git "a/40\347\216\213\347\224\237\345\274\230\347\254\224\350\256\260/sql\347\254\224\350\256\2601.md" "b/40\347\216\213\347\224\237\345\274\230\347\254\224\350\256\260/sql\347\254\224\350\256\2601.md" new file mode 100644 index 0000000000000000000000000000000000000000..0622a0650941a161ebd197e08eb8b5beb8c96eac --- /dev/null +++ "b/40\347\216\213\347\224\237\345\274\230\347\254\224\350\256\260/sql\347\254\224\350\256\2601.md" @@ -0,0 +1,374 @@ +------------------------------------------------ +# 数据库SQL + + + + + +--DDL:数据库定义语言,用于定义数据库对象;如数据库database 、数据表 table 等 +--创建:create +--删除:drop + +--修改:alter +------------------------------------------------- + + +--使用master数据库 +use master +go + +--如果存在TestDB数据库删除数据库 +if exists(select * from sys.databases where name='TestDB') +--删除数据库 +--语法:drop database 数据库名 + drop database TestDB; +go + +--创建数据库 +-- 语法:create database 数据库名 +create database TestDB +go +--go批处理标志,分割sql文件;等待前面语句执行完毕再执行后面的sql语句 + +--使用TestDB数据库 +use TestDB +go + + +----------------- +--建表部分 +----------------- + + +/* +语法: + create table 表名( + 列名 数据类型 属性, + ...... + ); +数据类型: + 1.字符串:varchar(n)、nvarchar(n)、text + 2.整型:int 、tinyint + 3.浮点型:float、decimal(n,m) + 4.日期:date 、time、datetime + 5.货币型:money +属性: + 1.主键:primary key + 2.自增标识:identity(n,m),起始值n,步长m + 3.唯一:unique + 4.检查:check + 5.默认值:default + 6.非空:not null + + +*/ + +--创建班级表 +create table ClassInfo +( + ClassId int identity(1,1) primary key, --主键,班级编号,标识列 + ClassName nvarchar(20) not null --班级名称,非空 +) +go + +--创建学生信息表 +create table StuInfo +( + StuId int identity(1,1) primary key, --主键,学号,标识列 + ClassId int references ClassInfo(ClassId) on delete set null, --所属班级编号,外键关联班级表的班级编号 + StuName nvarchar(10) not null, --姓名,非空 + StuSex nvarchar(1) default('男') check(StuSex in('男','女')), --性别 + StuBrithday date, --出生日期 + StuPhone nvarchar(11) check(len(StuPhone)=11) unique,--手机号,限制11位,唯一不重复 + StuAddress nvarchar(200),--地址 + CreateDate datetime default(getdate()) --创建时间,默认为系统时间 +) +go + + +--------------------------------------------------------------------------------------- +--DML:数据库操作语言,对数据进行增删改查的操作 +--1.插入数据:insert into 表名(列名1,列名2,.....) values(值1,值2,....),(值1,值2,....) +--2.修改数据:update 表名 set 列名=更新后的值,列名=更新后的值,..... where 更新条件 +--3.删除数据:delete from 表名 where 删除条件 +--4.查询数据:select 列名,..... from 表名 ........ +------------------------------------------------------------------------------------- + +------------------------------------------------ +--插入数据部分 +------------------------------------------------ + + +--1.插入数据:insert into 表名(列名1,列名2,.....) +-- values(值1,值2,....),(值1,值2,....) + +--插入班级信息表 +insert into ClassInfo(ClassName) +values('软件1班'),('软件2班') +go + + +--插入学生信息 +insert into StuInfo(ClassId,StuName,StuSex,StuBrithday,StuPhone,StuAddress) +values(1,'刘正','男','2002-08-02','13245678121','广西省桂林市'); + +insert into StuInfo(ClassId,StuName,StuSex,StuBrithday,StuPhone,StuAddress) +values(1,'黄贵','男','2003-07-02','13345678121','江西省南昌市'); + +insert into StuInfo(ClassId,StuName,StuSex,StuBrithday,StuPhone,StuAddress) +values(2,'陈美','女','2002-07-22','13355678125','福建省龙岩市'); + + +--2.修改数据:update 表名 set 列名1=更新后的值,列名2=更新后的值,..... where 更新条件的表达式 + +--eg:修改刘正同学的学生信息,性别改为女,出生日期为2012-01-01 +update StuInfo set StuSex='女',StuBrithday='2012-01-01' where StuId=1 + + +--3.删除数据:delete from 表名 where 删除条件的表达式 +--eg:删除黄贵同学的信息 +delete from StuInfo where StuId=2 + + +---------------------------- +--DQL:数据库查询语言 +---------------------------- +/* +语法: + select [top n [percent]]| [distinct] 列名,列名,..... + from 表名 + [inner|left|right|full] join 表名 on 连接条件(两表的关联字段相等) + where 条件表达式(对原数据进行条件筛选,表达式中只能包含原字段,不可有聚合函数) + group by 分组字段,.... + having 条件表达式(对聚合后的数据进行条件筛选,表达式中只能包含分组字段或者聚合函数,不可以有其他非分组字段) + order by 排序字段 [asc|desc],排序字段 [asc|desc],.... + +*/ + + + + + +--1.查询单表的所有数据 +-- select * from 表名 +-- *所有列,from、指明了查询的表 + +--eg:查询班级信息 +select * from ClassInfo; + +--eg:查询学生信息 +select * from StuInfo; + + + + +--2.查询指定列 +-- select 列名,列名,....... from 表名 +--eg:查询学生的姓名、手机号和地址信息 +select StuName,Stuphone,StuAddress from StuInfo; + + +-- 给列名设置别名 +-- 列名 别名 +-- 列名 as 别名 +-- 别名=列名 + +select StuName as 姓名,Stuphone 电话,地址=StuAddress from StuInfo; + + +--3.查询若干行数据 +-- select top n [percent] 列名,列名,....... from 表名 +-- top获取查询结果的前几行 + +--eg:获取学生信息表中的前2行数据 +select top 2 * from StuInfo; +select top 10 percent * from StuInfo; + + + +--4.查询结果去除重复项 +-- select distinct 列名,列名,....... from 表名 +-- distinct :不同的 + +--eg:学生信息表中的班级编号信息 + +select distinct ClassId from StuInfo; + + + +--5.对查询结果进行排序 +--select 列名,列名,.... from 表名 +--order by 排序字段 [asc(升序)|desc(降序)] + +--eg:将学生的信息按照出生日期从小到大排序 + +select * from StuInfo order by StuBrithday; + + + + +--6.where 条件子句:对表的记录进行条件筛选,只有记录符合where条件表达式才返回到结果集中 +-- 条件表达式:结果必须是布尔型,字段名和运算符 +-- 运算符: +-- 1)比较运算符:> >= < <= <> != + +--eg:查询考试成绩不及格的成绩信息 +select * from Scores where score<60; + + +-- 2)逻辑运算符:and(与) 、 or(或者) 、not(非) +--eg:查询课程编号为1并且成绩不及格的成绩信息 +select * from Scores where score<60 and CourseId=1; + +--eg:查询班级编号为1和2的学生信息 +select * from StuInfo where ClassId=1 or classId=2; + +--eg:查询班级编号不为1和2的学生信息 +select * from StuInfo where not(ClassId=1 or classId=2); + + +-- 3)范围运算符:between A and B :值在[A,B]范围内;not between A and B :值不在[A,B]范围内 + +--eg:查询出生年份在2001的学生信息,2001-01-01 2001-12-31 +select * from StuInfo where StuBrithday>= '2001-01-01' and StuBrithday<='2001-12-31'; + +select * from StuInfo where StuBrithday between '2001-01-01' and '2001-12-31'; + +select * from StuInfo where year(StuBrithday) =2001 + +--eg:查询出生年份不在2001的学生信息 +select * from StuInfo where StuBrithday not between '2001-01-01' and '2001-12-31' + +-- 4)列表运算符:in(值1,值2,....) not in(值1,值2,....) +-- eg:查询班级编号为1,2,3的学生信息 +select * from StuInfo where classid=1 or ClassId=2 or ClassId=3 + +select * from StuInfo where ClassId in(1,2,3); + +-- eg:查询班级编号不为1,2,3的学生信息 + +select * from StuInfo where ClassId not in(1,2,3); + +-- 5)空值运算符:is null ,not is null +-- NULL代表空值,代表该字段在插入数据时未赋值,并未分配内存地址空间 +-- ''代表空字符串,有存储空间,但是没有字符 +--eg:查询地址为NULL的学生信息 +select * from StuInfo where StuAddress is null; + +--eg:查询地址信息为空(没有数据)的学生信息 +select * from StuInfo where StuAddress is null or StuAddress=''; + + +-- 6)模式匹配运算符:like '待匹配的模式字符串' +-- 通配符:%,_,[],[^] +-- %:匹配0~n个任意字符 +-- _:匹配1个任意字符 +-- [a,b,c...]:匹配指定集合中的1个字符, +-- [^a,b,c...]:不匹配指定集合中的所有字符 + +--eg:查询桂林市的学生信息 +select * from StuInfo where StuAddress like '%桂林市%' + +--eg:查询姓刘的学生信息,StuName第一字必须是刘 +select * from StuInfo where StuName like '刘%' + +--eg:查询姓刘的学生信息,名字三个字的,StuName第一字必须是刘 +select * from StuInfo where StuName like '刘__' + + + + + +--7.聚合查询 +/*聚合函数:将一组数据使用聚合函数计算,返回一个单值 + count(字段,...):返回非空值数据的个数,字段值如果为NULL不列入计数 + sum(字段):返回一组记录中指定字段的数据和 + avg(字段):返回一组记录中指定字段的平均值 + max(字段):返回一组记录中指定字段的最大值 + min(字段):返回一组记录中指定字段的最小值 +*/ + + + + + + +--8.分组聚合查询:将数据按照分组字段进行分组(分组字段值相同分为同一组),然后进行聚合运算,每一组返回一个值 +/* +语法: + select 分组字段1, 分组字段2,聚合函数(字段),...... from + group by 分组字段1,分组字段2,.... + having 条件表达式(对聚合后的数据进行条件筛选) +*/ + + +--eg:查询每门课程的总成绩,平均成绩,最高分和最低分信息(按照课程编号分组) + +select CourseId,sum(score) 总成绩,avg(score),max(score),min(score) from Scores +group by CourseId + +--eg:查询每个学生的总成绩,(按照学号分组计算每个学生的总成绩) +select StuId,sum(score) 总成绩 from Scores +group by StuId + + +--eg:查询每个学生的总成绩,要求总分大于300分 +select StuId,sum(score) 总成绩 from Scores +group by StuId +having sum(Score)>300 + + + +--eg:查询学号1-5中每个学生的总成绩,要求总分大于300分 +select StuId,sum(score) 总成绩 from Scores +where StuId >=1 and StuId<=5 +group by StuId +having sum(Score)>300 + +--eg:查询学号1-5中每个学生的总成绩,要求总分大于300分,查询结果按总成绩的降序排序 +select StuId,sum(score) 总成绩 from Scores +where StuId >=1 and StuId<=5 +group by StuId +having sum(Score)>300 +order by sum(score) desc + + +--9.连接查询:需要查询的数据涉及到多张表时,就需要使用连接查询实现多表连接 +--连接多表的关键字: join 表名 on 两表的连接条件(必填,两表的关联字段相等) + +--连接查询步骤:1.找到要查询的数据涉及到哪些表, +-- 2.然后将这些表进行连接查询,找到表之间的关联字段,将关联字段设置为连接条件 +--1)内连接 +/* +语法: + select 表1~N.列1~N,... from 表1 + inner join 表2 on 表1.列 = 表2.列 + inner join 表3 on 表2.列 = 表3.列 + ... + [where 条件] + [group by 字段] + [having 条件] + [order by 字段] + +*/ + +--eg:查询学生的成绩信息:班级名称,学号,姓名、课程名称和成绩 +select ClassInfo.ClassId 班级编号,ClassName 班级名称,StuInfo.StuId 学号,StuName 姓名,CourseName 课程名称 ,Score 成绩 +from StuInfo +join Scores on StuInfo.StuId = Scores.StuId +join CourseInfo on CourseInfo.CourseId = Scores.CourseId +join ClassInfo on ClassInfo.ClassId=StuInfo.ClassId + + + +--eg:查询学生总成绩信息:姓名和总成绩 +--姓名在stuinfo ,总成绩:sum(score) score字段在Scores +--数据在两张表连接两张表 +select StuName,sum(Score) 总成绩 from StuInfo +join Scores on StuInfo.StuId=Scores.StuId --连接scores表 +group by StuInfo.StuId,StuName + + + + +