diff --git "a/\347\224\260\351\221\253\345\274\272/\344\275\234\344\270\232/0829\346\225\260\346\215\256\345\272\223\345\273\272\350\241\250.md" "b/\347\224\260\351\221\253\345\274\272/\344\275\234\344\270\232/0829\346\225\260\346\215\256\345\272\223\345\273\272\350\241\250.md" new file mode 100644 index 0000000000000000000000000000000000000000..598b1c6edf0f6a651dbb845711bf599414fdb73d --- /dev/null +++ "b/\347\224\260\351\221\253\345\274\272/\344\275\234\344\270\232/0829\346\225\260\346\215\256\345\272\223\345\273\272\350\241\250.md" @@ -0,0 +1,87 @@ +3. 创建数据库 DBTEST + 再创建表: + + 部门信息表(sectionInfo) + 部门编号 sectionID int 标识列 主键 + 部门名称 sectionName varchar(10) 不能为空 + + + 员工信息表(userInfo) + 员工编号 userNo int 标识列 主键 不允许为空 + 员工姓名 userName varchar(10) 唯一约束 不允许为空 长度必须大于4 + 员工性别 userSex varchar(2) 不允许为空 只能是男或女 + 员工年龄 userAge int 不能为空 范围在1-100之间 + 员工地址 userAddress varchar(50) 默认值为“湖北” + 员工部门 userSection int 外键,引用部门信息表的部门编号 + + + 员工考勤表(workInfo) + 考勤编号 workId int 标识列 主键 不能为空 + 考勤员工 userId int 外键 引用员工信息表的员工编号 不能为空 + 考勤时间 workTime datetime 不能为空 + 考勤说明 workDescription varchar(40) 不能为空 内容只能是“迟到”,“早退”,“旷工”,“病假”,“事假”中的一种 + + + 为每张表添加5条测试数据 + +```sql +create database DBTEST +go +use DBTEST +go + +--部门信息表 +create table sectionInfo( + sectionID int primary key identity(1,1), + sectionName varchar(10) not null +) +go + +--员工信息表 +create table userInfo( + userNo int primary key identity(1,1), + userName varchar(10) check(len(userName)>4) unique not null, + userSex varchar(2) check(userSex='男' or userSex='女') not null, + userAge int check(userAge>1 and userAge<100) not null, + userAddress varchar(50) default('湖北'), + userSection int references sectionInfo(sectionID) +) +go + +--员工考勤表 +create table workInfo( + workId int primary key identity(1,1), + userId int references userInfo(userNo) NOT NULL, + workTime datetime not null, + workDescription varchar(40) check(workDescription='迟到' or workDescription='早退' or workDescription='矿工' or workDescription='病假' or workDescription='事假') + +) +go + +insert sectionInfo +values ('人力部'), + ('市场部'), + ('售后部'), + ('监管部'), + ('行政部') +go + +insert userInfo +values ('小明ahfha','男',12,'湖南',1), + ('小asfa刘','男',22,'湖北',2), + ('小流fsafas','男',16,'江西',3), + ('小花sfaf','女',34,'云南',4), + ('小sfafa九','男',24,'福建',5) +go + + +insert workInfo +values (2,'2022-03-04','迟到'), + (2,'2022-03-04','早退'), + (3,'2022-03-04','矿工'), + (4,'2022-03-04','病假'), + (4,'2022-03-04','事假') + + +``` + diff --git "a/\347\224\260\351\221\253\345\274\272/\344\275\234\344\270\232/0901\350\277\236\346\216\245\346\237\245\350\257\242.md" "b/\347\224\260\351\221\253\345\274\272/\344\275\234\344\270\232/0901\350\277\236\346\216\245\346\237\245\350\257\242.md" new file mode 100644 index 0000000000000000000000000000000000000000..1669d069989c14d9141f3870e3be7bacc3f9df4e --- /dev/null +++ "b/\347\224\260\351\221\253\345\274\272/\344\275\234\344\270\232/0901\350\277\236\346\216\245\346\237\245\350\257\242.md" @@ -0,0 +1,47 @@ +--1. 查询出武汉地区所有的员工信息,要求显示部门名称以及员工的详细资料 + +```sql +select * from People p +inner join Department d on p.DepartmentId=d.DepartmentId +where PeopleAddress='武汉' +``` + +--2. 查询出武汉地区所有的员工信息,要求显示部门名称,职级名称以及员工的详细资料 + +```sql +select * from People p +inner join Department d on p.DepartmentId=d.DepartmentId +inner join [Rank] r on p.RankId=r.RankId +where PeopleAddress='武汉' +``` + +--3. 根据部门分组统计员工人数,员工工资总和,平均工资,最高工资和最低工资。 + +```sql +select DepartmentName,count(*) 员工总人数,sum(PeopleSalary) 员工总工资,avg(PeopleSalary) 平均工资,max(PeopleSalary) 最高工资,min(PeopleSalary) 最低工资 +from People p +inner join Department d on p.DepartmentId=d.DepartmentId +group by DepartmentName +``` + +--4. 根据部门分组统计员工人数,员工工资总和,平均工资,最高工资和最低工资,平均工资在10000 以下的不参与统计,并且根据平均工资降序排列。 + +```sql +select DepartmentName,count(*) 员工总人数,sum(PeopleSalary) 员工总工资,avg(PeopleSalary) 平均工资,max(PeopleSalary) 最高工资,min(PeopleSalary) 最低工资 +from People p +inner join Department d on p.DepartmentId=d.DepartmentId +group by DepartmentName +having avg(PeopleSalary)>10000 +order by avg(PeopleSalary) desc +``` + +--5. 根据部门名称,然后根据职位名称,分组统计员工人数,员工工资总和,平均工资,最高工资和最低工资 + +```sql +select DepartmentName,RankName,count(*) 员工总人数,sum(PeopleSalary) 员工总工资,convert(decimal(12,2),avg(PeopleSalary)) 平均工资,max(PeopleSalary) 最高工资,min(PeopleSalary) 最低工资 +from People p +inner join Department d on p.DepartmentId=d.DepartmentId +inner join [Rank] r on p.RankId=r.RankId +group by DepartmentName,RankName +``` + diff --git "a/\347\224\260\351\221\253\345\274\272/\344\275\234\344\270\232/0905\345\205\254\345\217\270\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.md" "b/\347\224\260\351\221\253\345\274\272/\344\275\234\344\270\232/0905\345\205\254\345\217\270\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.md" new file mode 100644 index 0000000000000000000000000000000000000000..a46bd02245fd5ab2bc08b34fed06b0700bab43a1 --- /dev/null +++ "b/\347\224\260\351\221\253\345\274\272/\344\275\234\344\270\232/0905\345\205\254\345\217\270\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.md" @@ -0,0 +1,73 @@ +create database company +go +use company +go + +--工程表 +create table project( + Pno varchar(20) primary key, + Pname varchar(20), +) +go + +insert project +values ('A1','花园大厦'), + ('A2','立交桥'), + ('A3','临江饭店') + +--职务表 +create table functin( + Fno int primary key identity(1,1), + Fname varchar(20), + Ftime int +) +go + +insert functin +values ('工程师',65), + ('技术员',60), + ('工人',55) + + +--职工表 +create table staff( + Sno int primary key, + Sname varchar(20), + fno int +) +go + +insert staff +values (1001,'齐光明',1), + (1002,'李思岐',2), + (1003,'鞠明亮',3), + (1004,'葛宇洪',2) +go + +--工时表 +create table manhour( + Mno int primary key identity(1,1), + Pno varchar(20) references Project(pno) , + Sno int references staff(sno), + Mtime int +) +go +insert manhour +values ('A1',1001,13), + ('A1',1002,16), + ('A2',1001,15), + ('A2',1003,17), + ('A3',1002,18), + ('A3',1004,14) +go + +-------- +select * from Project +select * from functin +select * from staff +select * from manhour + +select p.pno,p.pname,s.sno,s.sname,fname,ftime,mtime from manhour m +left join Project p on m.pno=p.pno +left join staff s on s.sno=m.sno +join functin f on s.fno=f.fno \ No newline at end of file diff --git "a/\347\224\260\351\221\253\345\274\272/\344\275\234\344\270\232/0905\345\261\200\351\203\250\345\217\230\351\207\217.md" "b/\347\224\260\351\221\253\345\274\272/\344\275\234\344\270\232/0905\345\261\200\351\203\250\345\217\230\351\207\217.md" new file mode 100644 index 0000000000000000000000000000000000000000..b64f7743f98897948eab5f5baffd536ee8a2ee01 --- /dev/null +++ "b/\347\224\260\351\221\253\345\274\272/\344\275\234\344\270\232/0905\345\261\200\351\203\250\345\217\230\351\207\217.md" @@ -0,0 +1,11 @@ +-- 练习:要求根据座位号找出张无忌的前后同学? +declare @sno int +select @sno=(select StuSeat from StuInfo where StuName='张无忌') +print @sno +select * from StuInfo where (StuSeat= @sno+1 or StuSeat= @sno-1) + +-- 练习:查询年龄最大的学生信息 +declare @age int +select @age=(select max (StuAge) from StuInfo ) +print @age +select * from StuInfo where (StuAge= @age) \ No newline at end of file diff --git "a/\347\224\260\351\221\253\345\274\272/\344\275\234\344\270\232/0906\351\200\273\350\276\221\346\216\247\345\210\266.md" "b/\347\224\260\351\221\253\345\274\272/\344\275\234\344\270\232/0906\351\200\273\350\276\221\346\216\247\345\210\266.md" new file mode 100644 index 0000000000000000000000000000000000000000..7996529e26c4e0ae5e844f5190adc67c2ecd63c4 --- /dev/null +++ "b/\347\224\260\351\221\253\345\274\272/\344\275\234\344\270\232/0906\351\200\273\350\276\221\346\216\247\345\210\266.md" @@ -0,0 +1,96 @@ +--变量 +--1. 为赵云此人进行开户开卡操作,赵云身份证:420107199904054233 + +```sql +insert into AccountInfo(AccountCode,AccountPhone,RealName,OpenTime) +values('420107199904054233','13554785965','赵云',GETDATE()) +declare @AccountId int +set @AccountId=@@IDENTITY +insert into BankCard(CardNo,AccountId,CardPwd,CardMoney,CardState) +values('6225125478544588',@AccountId,'123456',0,1) +``` + +--2. 需要求出张飞的银行卡卡号和余额,张飞身份证:420107199602034138 (1.使用连接查询,2.使用变量) + +```sql +declare @bankcar varchar(20) +declare @money money +select @bankcar = CardNo,@money = CardMoney +from AccountInfo a +inner join BankCard b on a.AccountId=b.AccountId +where AccountCode='420107199602034138' +print '张飞的银行卡号为' + convert(varchar(20),@bankcar) +print '张飞的银行卡余额为' + convert(varchar(20),@money) +``` + +--条件分支if-else + +--3.某用户银行卡号为“6225547854125656”,该用户执行取钱操作,取钱5000元, +--余额充足则进行取钱操作,并提示"取钱成功",否则提示“余额不足”。 + +```sql +declare @money money +select @money = CardMoney from BankCard where CardNo='6225547854125656' +if @money>=5000 + begin + update BankCard set CardMoney = CardMoney - 5000 + insert into CardExchange(CardNo,MoneyInBank,MoneyOutBank,ExchangeTime) + values('6225547854125656',0,5000,GETDATE()) + print '取钱成功' + end +else + print '余额不足' +``` + +--条件分支:case-when + +--4.查询银行卡信息,将银行卡状态1,2,3,4分别转换为汉字“正常,挂失,冻结,注销”, +--并且根据银行卡余额显示银行卡等级 30万以下为“普通用户”,30万及以上为"VIP用户", +--显示列分别为卡号,身份证,姓名,余额,用户等级,银行卡状态。 + +```sql +select CardNo 卡号,AccountCode 身份证,RealName 姓名,CardMoney 余额, +case + when CardMoney>300000 then 'VIP用户' + else '普通用户' +end 用户等级, +case + when CardState = 1 then '正常' + when CardState = 2 then '挂失' + when CardState = 3 then '冻结' + when CardState = 4 then '注销' +end 银行卡状态 +from BankCard b +inner join AccountInfo a on a.AccountId=b.AccountId +``` + +--while +--5.循环打印1-10 + +```sql +declare @i int=1 +while @i<=10 +begin + print @i + set @i=@i+1 +end +``` + +--6.打印99乘法表 + +```sql +declare @j int = 1 +while @j<=9 +begin + declare @k int = 1 + declare @result varchar(500) = '' + while @k<=@j + begin + set @result = @result + (convert(varchar(2),@k) + ' * ' + convert(varchar(2),@j) + ' = ' +convert(varchar(2),@k*@j)) + char(9) + set @k=@k+1 + end + print @result + set @j=@j+1 +end +``` + diff --git "a/\347\224\260\351\221\253\345\274\272/\344\275\234\344\270\232/0907\345\255\220\346\237\245\350\257\242.md" "b/\347\224\260\351\221\253\345\274\272/\344\275\234\344\270\232/0907\345\255\220\346\237\245\350\257\242.md" new file mode 100644 index 0000000000000000000000000000000000000000..4837868b380f14af2da3ba2e2f3347376368182f --- /dev/null +++ "b/\347\224\260\351\221\253\345\274\272/\344\275\234\344\270\232/0907\345\255\220\346\237\245\350\257\242.md" @@ -0,0 +1,79 @@ +--子查询 +--1. 关羽的银行卡号为"6225547858741263",查询出余额比关羽多的银行卡信息,显示卡号,身份证,姓名,余额。 + +```sql +select CardNo,AccountCode,RealName,CardMoney +from BankCard b +inner join AccountInfo a on a.AccountId=b.AccountId +where CardMoney > (select CardMoney + from BankCard + where CardNo=6225547858741263) +``` + +--2.从所有账户信息中查询出余额最高的交易明细(存钱取钱信息)。 + +```sql +select * +from CardExchange c +inner join BankCard b on c.CardNo=b.CardNo +where CardMoney = (select max(CardMoney) + from BankCard) +``` + +--3. 查询有取款记录的银行卡及账户信息,显示卡号,身份证,姓名,余额。 + +```sql +select CardNo,AccountCode,RealName,CardMoney +from AccountInfo a +inner join BankCard b on a.AccountId=b.AccountId +where CardNo in (select CardNo + from CardExchange + where MoneyOutBank >0) +``` + +--4. 查询出没有存款记录的银行卡及账户信息,显示卡号,身份证,姓名,余额。 + +```sql +select CardNo,AccountCode,RealName,CardMoney +from AccountInfo a +inner join BankCard b on a.AccountId=b.AccountId +where CardNo not in (select CardNo + from CardExchange + where MoneyInBank >0) +``` + +--5. 关羽的银行卡号为"6225547858741263",查询当天是否有收到转账。 + +```sql +if exists +(select * from CardTransfer +where CardNoIn = '6225547858741263' and CONVERT(VARCHAR(22),GETDATE()) = CONVERT(VARCHAR(22), TransferTime)) + begin + print '有收到转账' + end +else + begin + print '没有收到转账' + end +``` + +--6. 查询出交易次数(存款取款操作)最多的银行卡账户信息,显示:卡号,身份证,姓名,余额,交易数。 + +```sql +select CardNo 卡号,AccountCode 身份证,RealName 姓名,CardMoney 余额,(select top 1 count(*) from CardExchange group by CardNo) 交易数 +from BankCard b +inner join AccountInfo a on b.AccountId=a.AccountId +``` + +--7. 查询出没有转账交易记录的银行卡账户信息,显示卡号,身份证,姓名,余额。 + +```sql +select CardNo 卡号, AccountCode 身份证, RealName 姓名, CardMoney 余额 +from BankCard b +inner join AccountInfo a on b.AccountId=a.AccountId +where CardNo not in (select CardNoOut + from CardTransfer) and CardNo not in (select CardNoIn + from CardTransfer) + +``` + diff --git "a/\347\224\260\351\221\253\345\274\272/\347\254\224\350\256\260/08-28\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.md" "b/\347\224\260\351\221\253\345\274\272/\347\254\224\350\256\260/08-28\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.md" new file mode 100644 index 0000000000000000000000000000000000000000..fb819e23d22675ee9c64d2d36abc4c645e09dff4 --- /dev/null +++ "b/\347\224\260\351\221\253\345\274\272/\347\254\224\350\256\260/08-28\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.md" @@ -0,0 +1,31 @@ +#一 数据库设计 + +### 1 三范式 + +####1.1第一范式:列不能再分。 + +1.每一列属性都是不可再分的属性值,确保每一列的[原子性](https://gitee.com/link?target=https%3A%2F%2Fso.csdn.net%2Fso%2Fsearch%3Fq%3D%E5%8E%9F%E5%AD%90%E6%80%A7%26spm%3D1001.2101.3001.7020) + +2.两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据 + +####1.2.第二范式(2NF)(字段)属性完全依赖于主键 + +第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主键 + +####1.3第三范式(3NF)(字段)属性不依赖于其它非主属性 属性直接依赖于主键 + +数据不能存在传递关系,即每个属性都跟主键有直接关系而不是间接关系。像:a-->b-->c 属性之间含有这样的关系,是不符合第三范式的。 + +### 2E-R图设计 + +####2.1E-R图3个要素:实体,属性,关系 + +实体:用矩形表示,矩形框内写明实体名。 + +属性:用椭圆形表示,椭圆内写明属性名称,并用连线与实体连接起来。如果属性较多,为使图形更加简明,有时也将实体与其相应的属性另外单独用列表表示。 + +联系:用菱形表示,菱形框内写明联系名,并用连线分别与有关实体连接起来,同时在连线旁标上联系的类型。 + +连线:实体和属性之间、实体与联系之间、联系与属性之间用直线连接,并在直线上标注联系的类型。(注意:对于1:1的联系,要在两个实体连线方向各写1,1:n关系的,要在一的方向写1,多的方向写N;对于N:M关系的,则要在两个实体连线方向各写N,M) + +3. \ No newline at end of file diff --git "a/\347\224\260\351\221\253\345\274\272/\347\254\224\350\256\260/09-01\346\225\260\346\215\256\345\272\223\345\244\215\344\271\240.md" "b/\347\224\260\351\221\253\345\274\272/\347\254\224\350\256\260/09-01\346\225\260\346\215\256\345\272\223\345\244\215\344\271\240.md" new file mode 100644 index 0000000000000000000000000000000000000000..a8ccb2db7d7a150bc47f39509bc3ad664a82cfc9 --- /dev/null +++ "b/\347\224\260\351\221\253\345\274\272/\347\254\224\350\256\260/09-01\346\225\260\346\215\256\345\272\223\345\244\215\344\271\240.md" @@ -0,0 +1,248 @@ +# SQL server + +## 一 + +### 数据库操作 + +1. 查询所有数据库 + + ```sql + show databases + ``` + +2. 查询当前数据库 + + ```sql + show database() + ``` + +3. 创建数据库 + + ```sql + 如果该表不存在则创建 + create database[if not exists] 数据库名 [default charset 字符集] [collat 排序规则] + ``` + +4. 删除数据库 + + ```sql + 如果存在则删除 + drop database [if exists] 数据库名 + ``` + +5. 使用数据库 + + ```sql + use 数据库名 + ``` + +### 表操作 + + + +#### 创建 + +```sql +create table [表名]( + 字段1 字段类型 [comment 字段一注释] + ... +)[comment 表注释] +``` + +#### 修改 + +1. 修改表结构 + + ```sql + alter table 表名 add增/ drop删/ alter改 字段名 + 1. 增加一列 + alter table [表名] add 字段 数据类型 [约束] + go + 2. 删除一列 + alter table [表名] drop column 字段; + go + 3. 修改一列 + alter table [表名] alter column 字段 数据类型 [约束] + go + + ``` + +###数据类型 + +整型 +浮点:decimal(5,2):保留5位有效数字,小数点后2位 +字符串:char(固定长度)varchar(可变长度), nvarchar(可变长度,使用中文仍然只占用一个字节) +时间:datetime +文本类型:text,ntext,nvarchar(max) + +自增(标识列中的标识规范) +非空 + +### 约束 + +--约束 +--主键: primary key (唯一标识列) +--唯一: unique(),前台判断:有没有重复数据 +--默认: default +--check: 检查 +--外键: references 表名(字段) + +###查询 + +1. 查询当前所有表 + + ```sql + show tables + ``` + +2. 查询表结构 + + ```sql + desc 表名 + ``` + +3. 查询指定表的建表语句 + + ```sql + show create table 表名 + ``` + +4. .SQL中常用运算符 + + ```sql + =:等于,比较是否相等及赋值 + !=:比较不等于 + >:比较大于 + <:比较小于 + >=:比较大于等于 + <=:比较小于等于 + IS NULL:比较为空 + IS NOT NULL:比较不为空 + in:比较是否在其中 + like:模糊查询 + BETWEEN...AND...:比较是否在两者之间 50-100 BETWEEN 50 AND 100 + and:逻辑与(两个条件同时成立表达式成立) + or:逻辑或(两个条件有一个成立表达式成立) + not:逻辑非(条件成立,表达式则不成立;条件不成立,表达式则成立) + ``` + +5. 模糊查询 + + ```sql + %:代表匹配0个字符、1个字符或多个字符。 + _:代表匹配有且只有1个字符。 + []:代表匹配范围内 + [^]:代表匹配不在范围内 + ``` + +6. 聚合函数 + + ```sql + count:求数量 + max:求最大值 + min:求最小值 + sum:求和 + avg:求平均值 + ``` + +7. ROUND函数用法 + + ```sql + round(num,len,[type]) + 其中: + num表示需要处理的数字,len表示需要保留的长度,type处理类型(0是默认值代表四舍五入,非0代表直接截取) + select ROUND(123.45454,3) --123.45500 + select ROUND(123.45454,3,1) --123.45400 + ``` + +8. 常用的时间函数 + + ```sql + select DATEDIFF(day, '2019-08-20', getDate()); --获取指定时间单位的差值 + SELECT DATEADD(MINUTE,-5,GETDATE()) --加减时间,此处为获取五分钟前的时间,MINUTE 表示分钟,可为 YEAR,MONTH,DAY,HOUR + select DATENAME(month, getDate()); --当前月份 + select DATENAME(WEEKDAY, getDate()); --当前星期几 + select DATEPART(month, getDate()); --当前月份 + select DAY(getDate()); --返回当前日期天数 + select MONTH(getDate()); --返回当前日期月数 + select YEAR(getDate()); --返回当前日期年数 + + SELECT CONVERT(VARCHAR(22),GETDATE(),20) --2020-01-09 14:46:46 + SELECT CONVERT(VARCHAR(24),GETDATE(),21) --2020-01-09 14:46:55.91 + SELECT CONVERT(VARCHAR(22),GETDATE(),23) --2020-01-09 + SELECT CONVERT(VARCHAR(22),GETDATE(),24) --15:04:07 + Select CONVERT(varchar(20),GETDATE(),14) --15:05:49:330 + ``` + +9. **时间格式控制字符串:** + + | 名称 | 日期单位 | 缩写 | + | ------------ | ----------- | --------- | + | 年 | year | yyyy 或yy | + | 季度 | 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 | + | 毫秒 | millisecond | ms | + +10. 分组查询 group by + +11. 连接查询 + + ```sql + 内连接(自连接) select +表1.列1 from 表1 inner join 表2 on 表1.列=表2.列 ..... (where+条件;group by+字段;having+条件;order by+字段) + 左连接 select +表1.列1 from 表1 left join 表2 on 表1.列=表2.列 left join 表3 on 表2.列=表3.列 ..... + 右连接 select +表1.列1 from 表1 right join 表2 on 表1.列=表2.列 right join 表3 on 表2.列=表3.列 ..... + ``` + + + +12. 并集查询 + + ```sql + 交集查询(用于两个select查询之间) select..... intersect(将两个结果集中相同的记录取出来成为一个新的结果集) select..... + 减集查询(用于两个select查询之间) select.... except(比较两个结果集,将except关键字前的结果集除去交集部分而组成的新的集合) select.... + ``` + + + + +## 二 sql server进阶 + +### 1 三范式 + +####1.1第一范式:列不能再分。 + +1.每一列属性都是不可再分的属性值,确保每一列的[原子性](https://gitee.com/link?target=https%3A%2F%2Fso.csdn.net%2Fso%2Fsearch%3Fq%3D%E5%8E%9F%E5%AD%90%E6%80%A7%26spm%3D1001.2101.3001.7020) + +2.两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据 + +####1.2.第二范式(2NF)(字段)属性完全依赖于主键 + +第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主键 + +####1.3第三范式(3NF)(字段)属性不依赖于其它非主属性 属性直接依赖于主键 + +数据不能存在传递关系,即每个属性都跟主键有直接关系而不是间接关系。像:a-->b-->c 属性之间含有这样的关系,是不符合第三范式的。 + +### 2E-R图设计 + +####2.1E-R图3个要素:实体,属性,关系 + +实体:用矩形表示,矩形框内写明实体名。 + +属性:用椭圆形表示,椭圆内写明属性名称,并用连线与实体连接起来。如果属性较多,为使图形更加简明,有时也将实体与其相应的属性另外单独用列表表示。 + +联系:用菱形表示,菱形框内写明联系名,并用连线分别与有关实体连接起来,同时在连线旁标上联系的类型。 + +连线:实体和属性之间、实体与联系之间、联系与属性之间用直线连接,并在直线上标注联系的类型。(注意:对于1:1的联系,要在两个实体连线方向各写1,1:n关系的,要在一的方向写1,多的方向写N;对于N:M关系的,则要在两个实体连线方向各写N,M) + + + + + diff --git "a/\347\224\260\351\221\253\345\274\272/\347\254\224\350\256\260/09-05\345\217\230\351\207\217.md" "b/\347\224\260\351\221\253\345\274\272/\347\254\224\350\256\260/09-05\345\217\230\351\207\217.md" new file mode 100644 index 0000000000000000000000000000000000000000..a955a572a9f872b1c6454cb519cc8fab8c9784c6 --- /dev/null +++ "b/\347\224\260\351\221\253\345\274\272/\347\254\224\350\256\260/09-05\345\217\230\351\207\217.md" @@ -0,0 +1,61 @@ +# 二.变量 + +## 一.全局变量 + +全局变量必须以标记**@@**作为前缀,如@@versionا + +全局变量由系统定义和维护,我们**只能读取,不能修改全局变量的值** + +##二局部变量(重点) + +局部变量必须以标记 **@** 作为前缀,如**@age** + +局部变量的使用如同Java、c#等,也是 **先声明,再赋值** + +1 声明变量 + +```sql +declare @变量名 数据类型 +如: +declare @aa int +declare @sd varchar(20) +``` + +2 赋值 + +2.1方法一 + +```sql +set @变量名 = 值 +``` + +注意:(1)不支持同时对多变量进行赋值 + +​ (2)若表达式返回多值,则报错 + +​ (3)若表达式未返回值,则为NULL + +2.2方法二 + +```sql +select @变量名 = 值 +``` + +注意:(1)支持同时对多变量进行赋值 + +​ (2)若表达式返回多值,则返回最后一个值 + +​ (3)若表达式未返回值,则保持原值 + +3 输出 + + 3.1 print :以文本形式输出 + +```sql +例子; +print '服务器的名称为:'+@@servername +``` + + + +3. 2 select :以结果集形式输出 \ No newline at end of file diff --git "a/\347\224\260\351\221\253\345\274\272/\347\254\224\350\256\260/09-06\351\200\273\350\276\221\346\216\247\345\210\266.md" "b/\347\224\260\351\221\253\345\274\272/\347\254\224\350\256\260/09-06\351\200\273\350\276\221\346\216\247\345\210\266.md" new file mode 100644 index 0000000000000000000000000000000000000000..88e7af35208cd05c080258c714e0b1fdfbad1542 --- /dev/null +++ "b/\347\224\260\351\221\253\345\274\272/\347\254\224\350\256\260/09-06\351\200\273\350\276\221\346\216\247\345\210\266.md" @@ -0,0 +1,151 @@ +逻辑控制 + +# if + +格式 + +```sql +if(条件表达式) +begin --相当于C#里的{ + 语句1 + ... +end --相当于C#里的} + +``` + +# if...else + +格式 + +```sql +if(条件表达式) +begin --相当于C#里的{ + 语句1 + ... +end --相当于C#里的} +else +begin --相当于C#里的{ + 语句1 + ... +end + +``` + +例子 + +```sql +--2.判断男生平均成绩是否高于女生,如果男生平均成绩比女生高,输出男生中的第一名, 否则输出女生中的第一名 +--查出男生,女生的平均成绩 +declare @maleScore float--男生平均成绩 +declare @femaleScore float--女生 +declare @max int --最高分 + +select @maleScore = avg(chinese+english+math) from StuScore where StuSex='男' --男生平均成绩 +select @femaleScore = avg(chinese+english+math) from StuScore where StuSex='女' --女生 + +if @maleScore>@femaleScore +begin + print '男生平均成绩高' + --男生第一名 + --max + --select @max = max(chinese+english+math) from StuScore where StuSex='男' + --print '男生最高分'+@max + select top 1 * from StuScore where Stusex = '男' order by (English+Chinese+Math) desc +end +else +begin + print '女生平均成绩高' + --select @max = max(chinese+english+math) from StuScore where StuSex='女' + --print '女生最高分'+@max + + select top 1 * from StuScore where StuSex='女' order by (English+Chinese+Math) desc +end +``` + +#case...when + +格式 + +```sql +select name , --注意逗号 + case 条件表达式 + when 条件表达式1 then 值 + ... + end [定义新列名], --多个case...then 使用时,记得逗号 + case 条件表达式 + when 条件表达式1 then 值 + ... + end [定义新列名], +from 表名 +``` + +例子 + +```sql +--4.查询银行卡信息,将银行卡状态1,2,3,4分别转换为汉字“正常,挂失,冻结,注销”, +--并且根据银行卡余额显示银行卡等级 30万以下为“普通用户”,30万及以上为"VIP用户", +--显示列分别为卡号,身份证,姓名,余额,用户等级,银行卡状态。 +select CardNo 卡号,AccountCode 身份证,RealName 姓名,CardMoney 余额, +case + when CardMoney>300000 then 'VIP用户' + else '普通用户' +end 用户等级, +case + when CardState = 1 then '正常' + when CardState = 2 then '挂失' + when CardState = 3 then '冻结' + when CardState = 4 then '注销' +end 银行卡状态 +from BankCard b +inner join AccountInfo a on a.AccountId=b.AccountId +``` + +# 循环:while + +格式 + +```sql +declare @变量名 数据类型 --类似Java初始化条件 +while(关于@变量名的条件表达式) --类似Java循环条件 +begin + print '...' --打印 --类似java循环体 + 关于@变量名的条件表达式 --类似java迭代条件 +``` + +例子 + +```sql +--​6.打印99乘法表 +declare @j int = 1 +while @j<=9 +begin + declare @k int = 1 + declare @result varchar(500) = '' + while @k<=@j + begin + set @result = @result + (convert(varchar(2),@k) + ' * ' + convert(varchar(2),@j) + ' = ' +convert(varchar(2),@k*@j)) + char(9) + set @k=@k+1 + end + print @result + set @j=@j+1 +end +``` + +# convert + +sql中不能像java、c#等打印时自动转化数据类型,需进行强转 + +格式 + +```sql + +convert(要转换成的数据类型,变量) +``` + +例子 + +```sql +将 declare @kk 转换成数据类型为 varchar(20) +convert(varchar(20),@kk) +``` +