SqlService基础知识总汇

  • 前言
  • 一、SQLSERVER建库建表
    • 1.检查数据库名是否存在
    • 2.创建数据库
    • 3.建表
    • 4.修改表结构
    • 5.删除添加约束
  • 二、SQLSERVER插入数据
    • 1.向部门表插入数据
    • 2.向职级表插入数据
    • 3.向员工表插入数据
    • 4.查询数据是否插入成功
  • 三、SQLSERVER修改和删除数据
    • 1.修改数据示例
    • 2.删除数据示例
    • 3.drop、truncate、delete区别
  • 四、SQLSERVER基础查询
    • 1.查询所有行所有列
    • 2.指定列查询(姓名,性别,月薪,电话)
    • 3.指定列查询,并自定义中文列名(姓名,性别,月薪,电话)
    • 4. 查询公司员工所在城市(不需要重复数据)
    • 5.假设工资普调10%,查询原始工资和调整后的工资,显示(姓名,性别,月薪,加薪后的月薪)(添加列查询)。
  • 五、SQLSERVER条件查询
    • 1.SQL中常用运算符
    • 2.查询示例:
  • 六、SQLSERVER模糊查询
  • 七、SQLSERVER聚合函数
    • 1.聚合函数举例应用
    • 2.补充-SQL中常用时间处理函数
  • 八、SQLSERVER分组查询
  • 九、SQLSERVER多表查询
    • 1.笛卡尔乘积
    • 2.简单多表查询
    • 3.内连接
    • 4.外连接
    • 5.多表查询综合示例
    • 6.自连接
  • 总结

前言

  近阶段学习sqlservice,网课期间借助互联网整理此笔记。


一、SQLSERVER建库建表

1.检查数据库名是否存在

   创建数据库,首先要排除数据库名字重名的现象,我们可以使用如下代码查询数据库名是否存在,存在则删除此数据库。

--删除数据库
if exists(select *from sys.databases where name = '数据库名字')drop database 数据库名字

   慎用,操作不当可能会删除重要数据。

2.创建数据库

--创建数据库
creat database Test
on --数据文件
(name = 'Test',                  --逻辑名称filename = 'D:\Data\Test.mdf,   --物理路径及名称size = 5MB,                   --数据文件初始大小filegrowth = 2MB             --数据文件增长速度,也可使用百分比设置
)
log on --日志文件
(name = 'Test_log',                  --逻辑名称filename = 'D:\Data\Test_log.ldf,   --物理路径及名称size = 5MB,                       --数据文件初始大小filegrowth = 2MB                   --数据文件增长速度,也可使用百分比设置
)

以上分别使用on和log on规定了数据文件和日志文件的信息。

创建数据库也可以按照如下简单语法来创建:

create database Test

此方法数据库的数据文件和日志文件的相关信息,全部采取默认值。

3.建表

使用数据库和删除数据表

use Test   --切换当前数据库
if exists(select *from sys.objects where name = 'biaoming' and type = 'U')drop table biaoming;

创建数据表语法:

create table 表名
(字段名1 数据类型(长度),字段名2 数据类型(长度)
)

字符串类型比较:

char 定长,例如 char(10),不论你存储的数据是否达到了10个字节,都要占去10个字节的空间
varchar 变长,例如varchar(10),并不代表一定占用10个字节,而代表最多占用10个字节。最大长度8000,也可以使用varchar(max)表示2G以内的数据,但存储机制会和text一样,效率会降低。
text 长文本, 最大长度为2^31-1(2,147,483,647)个字符 。
nchar,nvarchar,ntext: 名字前面多了一个n, 它表示存储的是Unicode数据类型的字符,区别varchar(100)可以存储100个英文字母或者50个汉字,而nvarchar(100)可以存储100个英文字母,也可以存储100个汉字。

创建数据表示例(部门表,职级表,员工信息表):


create table Department
(--int代表整数类型;primary key代表主键;identity(1,1)代表从1开始步长为1自增长;DepartmentID  int primary key identity(1,1),--nvarchar(50)代表长度50的字符串;not null代表不能为空;DepartmentNmae nvarchar(50) not null,--text代表长文本;DepartmentRemark text
)
--创建职级表,rank为系统关键字,此处使用[]代表自定义名字,而非系统关键字
create table [Rank]
(RankID int primary key identity(1,1),RankNaem nvarchar(50) not null,RankRemark text
)
--创建员工信息表
create table People
(PeopleId int primary key identity(1,1),--references代表外键引用,此字段必须符合与其表的外键约束DepartmentID int references Department(DepartmentID) not null,RankID int references [Rank](RankID) not null,PeopleName nvarchar(50) not null,--default代表字段默认值; check可以规定字段值的约束条件;PeopleSex nvarchar(1) default('男') check(PeopleSex='男' or PeopleSex='女') not null,PeopleBirth datetime not null,--decimal(P,D)P:有效数字位数,D:小数位PeopleSalary decimal(12,2) check(PeopleSalary>= 1000 and PeopleSalary <= 100000) not null,--unique代表唯一约束,为数据提供唯一性保证PeoplePhone nvarchar(20) unique not null,--datetime和smalldatetime都可以表示时间类型,getdate()用于获取系统当前时间PeopleAddTime smalldatetime default(getdate()))

4.修改表结构

  1. 在表中添加列
alter table People
add PeopleMail nvarchar(100) --添加一列员工邮箱:

2.在表中删除列

alter table People
drop column PeopleMail --删除员工表中的邮箱这一列
  1. 改变表中列的数据类型
alter table People
alter column PeopleMail varchar(100) --改变邮箱列的数据类型为varchar(100)

5.删除添加约束

删除约束语法:

if exists(select *from sysobjects where name=约束名)
alter table 表名 drop constraint 约束名;

添加约束语法:

--添加主键约束
alter table 表名 add constraint 约束名称 primary key(列名)
--添加check约束
alter table 表名 add constraint 约束名称 check(条件表达式)
--添加unique约束
alter table 表名 add constraint 约束名称 unique(列名)
--添加default约束
alter table 表名 add constraint 约束名称 default 默认值 for 列名
--添加外键约束
alter table 表名 add constraint 约束名称 foregin key (列名) references 关联表
名(关联表列名)

二、SQLSERVER插入数据

1.向部门表插入数据

标准语法:

insert into Department (DepartmentName,DepartmentRemark)
values('HR','......')
insert into Department DepartmentName,DepartmentRemark)
values('管理部','......')
insert into Department DepartmentName,DepartmentRemark)
values('技术部','......')

简写语法:(省略字段名称)

insert into Department values('行政部','公司主管行政工作的部门')注:不推荐此种写法,当数据表结构变化的时候,数据会出错或产生错误数据。

一次插入多行数据:

insert into Departement(DepartmentName,DepartmentRemark)
select 'HR','喝酒的部门' union --union相当于and
select '管理部','管理的部门' union
select '技术办','划水的部门'

2.向职级表插入数据

insert into [Rank](RankName,RankRemark)
values('初级','辅助其他人完成任务')
insert into [Rank](RankName,RankRemark)
values('中级','具备独立处理事务的能力')
insert into [Rank](RankName,RankRemark)
values('高级','具备可以带动全场节奏的能力')

3.向员工表插入数据

insert into People(DepartmentId,RankId,PeopleName,PeopleSex,PeopleBirth,
PeopleSalary,PeoplePhone,PeopleAddress,PeopleAddTime)
values(1,3,'陈思宇','男','1984-7-9',20000,'13554785452','成都',getdate())insert into People(DepartmentId,RankId,PeopleName,PeopleSex,PeopleBirth,
PeopleSalary,PeoplePhone,PeopleAddress,PeopleAddTime)
values(1,2,'钢铁侠','女','1987-7-9',15000,'13256854578','荆州',getdate())insert into People(DepartmentId,RankId,PeopleName,PeopleSex,PeopleBirth,
PeopleSalary,PeoplePhone,PeopleAddress,PeopleAddTime)
values(1,1,'蜘蛛侠','男','1988-8-8',12000,'13985745871','荆州',getdate())insert into People(DepartmentId,RankId,PeopleName,PeopleSex,PeopleBirth,
PeopleSalary,PeoplePhone,PeopleAddress,PeopleAddTime)
values(2,1,'美国队长','男','1990-8-8',8000,'13535987412','宜昌',getdate())insert into People(DepartmentId,RankId,PeopleName,PeopleSex,PeopleBirth,
PeopleSalary,PeoplePhone,PeopleAddress,PeopleAddTime)
values(2,3,'雷神','男','1989-4-8',9000,'13845789568','宜昌',getdate())insert into People(DepartmentId,RankId,PeopleName,PeopleSex,PeopleBirth,
PeopleSalary,PeoplePhone,PeopleAddress,PeopleAddTime)
values(3,3,'浩克','男','1995-4-8',9500,'13878562568','香港',getdate())insert into People(DepartmentId,RankId,PeopleName,PeopleSex,PeopleBirth,
PeopleSalary,PeoplePhone,PeopleAddress,PeopleAddTime)
values(3,2,'黑豹','男','1989-4-20',8500,'13335457412','武汉',getdate())insert into People(DepartmentId,RankId,PeopleName,PeopleSex,PeopleBirth,
PeopleSalary,PeoplePhone,PeopleAddress,PeopleAddTime)
values(3,1,'黑寡妇','女','1989-4-20',6500,'13437100050','武汉',getdate())insert into People(DepartmentId,RankId,PeopleName,PeopleSex,PeopleBirth,
PeopleSalary,PeoplePhone,PeopleAddress,PeopleAddTime)
values(2,2,'鹰眼','男','1987-12-20',25000,'13889562354','北京',getdate())insert into People(DepartmentId,RankId,PeopleName,PeopleSex,PeopleBirth,
PeopleSalary,PeoplePhone,PeopleAddress,PeopleAddTime)
values(2,3,'死待','男','1981-11-11',9000,'13385299632','北京',getdate())insert into People(DepartmentId,RankId,PeopleName,PeopleSex,PeopleBirth,
PeopleSalary,PeoplePhone,PeopleAddress,PeopleAddTime)
values(2,1,'毒液','男','1978-1-13',8000,'13478545263','上海',getdate())insert into People(DepartmentId,RankId,PeopleName,PeopleSex,PeopleBirth,
PeopleSalary,PeoplePhone,PeopleAddress,PeopleAddTime)
values(1,1,'哨兵','男','1998-12-12',7500,'13878523695','深圳',getdate())insert into People(DepartmentId,RankId,PeopleName,PeopleSex,PeopleBirth,
PeopleSalary,PeoplePhone,PeopleAddress,PeopleAddTime)
values(1,3,'万磁王','男','1968-11-22',9000,'13698545841','广州',getdate())insert into People(DepartmentId,RankId,PeopleName,PeopleSex,PeopleBirth,
PeopleSalary,PeoplePhone,PeopleAddress,PeopleAddTime)
values(3,3,'金刚狼','男','1988-1-22',11000,'13558745874','深圳',getdate())insert into People(DepartmentId,RankId,PeopleName,PeopleSex,PeopleBirth,
PeopleSalary,PeoplePhone,PeopleAddress,PeopleAddTime)
values(3,2,'镭射眼','男','1990-2-21',12000,'13698745214','深圳',getdate())insert into People(DepartmentId,RankId,PeopleName,PeopleSex,PeopleBirth,
PeopleSalary,PeoplePhone,PeopleAddress,PeopleAddTime)
values(3,2,'白皇后','女','1995-2-21',13000,'13985478512','上海',getdate())insert into People(DepartmentId,RankId,PeopleName,PeopleSex,PeopleBirth,
PeopleSalary,PeoplePhone,PeopleAddress,PeopleAddTime)
values(2,1,'银影侠','女','1996-2-21',13500,'13778787874','北京',getdate())insert into People(DepartmentId,RankId,PeopleName,PeopleSex,PeopleBirth,
PeopleSalary,PeoplePhone,PeopleAddress,PeopleAddTime)
values(1,2,'红浩克','男','1992-10-11',8000,'13987455214','武汉',getdate())insert into People(DepartmentId,RankId,PeopleName,PeopleSex,PeopleBirth,
PeopleSalary,PeoplePhone,PeopleAddress,PeopleAddTime)
values(2,3,'新星','男','1984-9-10',5500,'13254785965','成都',getdate())insert into People(DepartmentId,RankId,PeopleName,PeopleSex,PeopleBirth,
PeopleSalary,PeoplePhone,PeopleAddress,PeopleAddTime)
values(3,3,'惩戒者','男','1987-5-19',8500,'13352197364','成都',getdate())insert into People(DepartmentId,RankId,PeopleName,PeopleSex,PeopleBirth,
PeopleSalary,PeoplePhone,PeopleAddress,PeopleAddTime)
values(1,1,'冬日战士','男','1996-5-19',7500,'13025457392','南京',getdate())insert into People(DepartmentId,RankId,PeopleName,PeopleSex,PeopleBirth,
PeopleSalary,PeoplePhone,PeopleAddress,PeopleAddTime)
values(1,2,'刚力士','男','1983-6-1',7500,'13077778888','上海',getdate())

   其中DepartmentId,RankId,PeopleSalary均为数字类型,在赋值的时候不需要添加单引号,而其它类型需要添加单引号。

4.查询数据是否插入成功

select * from Department
select * from [Rank]
select * from People

三、SQLSERVER修改和删除数据

1.修改数据示例

为每个员工+500 元工资(批量修改)

update People setPeopleSalary = PeopleSalary + 500

将员工编号为8的工资+1000 元(根据条件修改)

update People set PeopleSalary = PeopleSalary + 1000 where  PeopleId = 8

将HR部(部门编号已知=1)所有员工工资低于1万的全部调整成1 万(根据多条件修改

update People set PeopleSalary = 10000 WHERE DepartmentId=1 and PEOPLESALARY < 10000

修改美国队长的工资为以前的2 倍,并且修改其地址为平顶山(同时修改多个字段)

update People SET PeopleSalary = PeopleSalary *2,PeopleAddress='平顶山' where PelpleName= '美国队长'

2.删除数据示例

删除员工表中所有数据

delete from People

已知部门编号=3中工资大于15000 的所有员工

delete from people where DepartmenntID = 3 and PeopleSalary >15000

3.drop、truncate、delete区别

drop table 删除表对象,表数据、表结构、表对象都进行了删除。
delete和truncate table 删除表数据,表对象及表结构依然存在。

delete与truncate table的区别如下:

delete:
(1)可以删除表所有数据,也可以根据条件删除数据。
(2)如果有自动编号,删除后继续编号,例如delete删除表所有数据后,之前数据的自动编号是1,2,3,那么之后新增数据的编号从4开始。
truncate table:
(1)只能清空整个表数据,不能根据条件删除数据。
(2)如果有自动编号,清空表数据后重新编号,例如truncate table清空表所有数据后,之前数据的自动编号是1,2,3,那么之后新增数据的编号仍然从1开始。

四、SQLSERVER基础查询

1.查询所有行所有列

--查询所有的部门
SELECT * FROM Department
--查询所有的职级
SELECT * FROM [Rank]
--查询所有的员工信息
SELECT * FROM People

2.指定列查询(姓名,性别,月薪,电话)

select PeopleName,PeopleSex,PeopleSalary,PeoplePhone from People

3.指定列查询,并自定义中文列名(姓名,性别,月薪,电话)

select PeopleName 姓名,PeopleSex 性别,PeopleSalary 工资,PeoplePhone 电话 from People

4. 查询公司员工所在城市(不需要重复数据)

select distinct PeopleAddress from People

5.假设工资普调10%,查询原始工资和调整后的工资,显示(姓名,性别,月薪,加薪后的月薪)(添加列查询)。

select PeopleName 姓名,PeopleSex 性别,
PeopleSalary 月薪,PeopleSalary*1.1 加薪后月薪
from People

五、SQLSERVER条件查询

1.SQL中常用运算符

= 等于,比较是否相等及赋值
!= 比较不等于
> 比较大于
< 比较小于
>= 比较大于等于
<= 比较小于等于
IS NULL 比较为空
IS NOT NULL 比较不为空
in 比较是否在其中
like 模糊查询
BETWEEN…AND…. 比较是否在两者之间
and 逻辑与(两个条件同时成立表达式成立)
or 逻辑或(两个条件有一个成立表达式成立)
not 逻辑非(条件成立,表达式则不成立;条件不成立,表达式则成立)

2.查询示例:

  1. 根据指定列(姓名,性别,月薪,电话)查询性别为女的员工信息,并自定义中文列名
select PeopleName 姓名,PeopleSex 性别,PeopleSalary 工资,PeoplePhone 电话
from People where PeoPleSex = '女'
  1. 查询月薪大于等于10000 的员工信息( 单条件 )
select * from People where PeopleSalary >= 10000
  1. 查询月薪大于等于10000 的女员工信息(多条件)
select * from People where PeopleSalary >= 10000 and PeopleSex = '女'
  1. 显示出出身年月在1980-1-1之后,而且月薪大于等于10000的女员工信息。
select *from People where
PeopleBirth >= '1980-1-1' and PeopleSalary >= 10000 and PeopleSex = '女'
  1. 显示出月薪大于等于15000 的员工,或者月薪大于等于8000的女员工信息。
select * from People where
PeopleSalary >= 15000 or (PeopleSalary >= 8000 and PeoPleSex = '女')
  1. 查询月薪在10000-20000 之间员工信息( 多条件 )
--方案一:
select * from People where PeopleSalary >= 10000 and PeopleSalary <= 20000
--方案二:
select * from People where PeopleSalary  between 10000 and 20000
  1. 查询出地址在北京或者上海的员工信息
--方案一:
select * from People where PeopleAddress = '北京' or PeopleAddress = '上海'
--方案二:
select * from People where PeopleAddress in('北京','上海'
  1. 查询所有员工信息(根据工资排序,降序排列)
selecr * from People order by PeopleSalary desc
注:order by: 排序  asc: 正序  desc: 倒序
  1. 显示所有的员工信息,按照名字的长度进行倒序排列
select * from People order by len(PeopleName) desc
  1. 查询工资最高的5个人的信息
select top 5 * from People ordrer by PeopleSalary desc
  1. 查询工资最高的10%的员工信息
select top 10 percent *from People order by PeopleSalary desc
  1. 查询出地址没有填写的员工信息
select * from People  where PeopleAddress is null
  1. 查询出地址已经填写的员工信息
select * from People where PeopleAddress is not null
  1. 查询所有的80后员工信息
--方案一:
select * from People where PeopleBirth >= '1980-1-1'
and PeopleBirth <= '1989-12-31'
--方案二:
select * from People where PeopleBirth between '1980-1-1'
and '1989-12-31'
--方案三:
select * from People where year(PeopleBirth) >= 1980
and year(PeopleBirth) <= 1989
  1. 查询年龄在30-40 之间,并且工资在15000-30000 之间的员工信息
--方案一:
select * from People where
(year(getdate())-year(PeopleBirth) >= 30
and year(getdate())-year(PeopleBirth) <= 40)
and (PeopleSalary >= 15000 and PeopleSalary <= 30000)
--方案二:
select * from People where
(year(getdate())-year(PeopleBirth) between 30 and 40)
and PeopleSalary between 15000 and 30000
  1. 查询出巨蟹 6.22–7.22 的员工信息
select * from People where
(month(PeopleBirth) = 6 and DAY(PeopleBirth) >= 22) or
(month(PeopleBirth) = 7 and DAY(PeopleBirth) <= 22)
  1. 查询工资比美国队长高的人
select * from People where PeopleSalary >
(select PeopleSalary from People where PEOPLENAME = '赵云')
  1. 查询出和美国队长在同一个城市的人
select * from People where PEOPLEADDRESS =
(select PEOPLEADDRESS from People where PEOPLENAME = '赵云')
  1. 查询出生肖为鼠的人员信息
select * from People where year(PeopleBirth) % 12 = 4
  1. 查询所有员工信息,添加一列显示属相(鼠,牛,虎,兔,龙,蛇,马,羊,猴,鸡,狗,猪)
--方案一:
select PeopleName 姓名,PeopleSex 性别,PeopleSalary 工资,PeopleBirth 生日,
case when year(PeopleBirth) % 12 = 4 then '鼠'when year(PeopleBirth) % 12 = 5 then '牛'when year(PeopleBirth) % 12 = 6 then '虎'when year(PeopleBirth) % 12 = 7 then '兔'when year(PeopleBirth) % 12 = 8 then '龙'when year(PeopleBirth) % 12 = 9 then '蛇'when year(PeopleBirth) % 12 = 10 then '马'when year(PeopleBirth) % 12 = 11 then '羊'when year(PeopleBirth) % 12 = 0 then '猴'when year(PeopleBirth) % 12 = 1 then '鸡'when year(PeopleBirth) % 12 = 2 then '狗'when year(PeopleBirth) % 12 = 3 then '猪'ELSE ''end 生肖 from People
--方案二:
select PeopleName 姓名,PeopleSex 性别,PeopleSalary 工资,PEOPLEBIRTH 生日,
case year(PeopleBirth) % 12when 4 then '鼠'when 5 then '牛'when 6 then '虎'when 7 then '兔'when 8 then '龙'when 9 then '蛇'when 10 then '马'when 11 then '羊'when 0 then '猴'when 1 then '鸡'when 2 then '狗'when 3 then '猪'ELSE ''
end 生肖
from People

六、SQLSERVER模糊查询

模糊查询使用like关键字和通配符结合来实现,通配符具体含义如下:

% 代表匹配0个字符、1个字符或多个字符。
_ 代表匹配有且只有1个字符。
[] 代表匹配范围内
[^] 代表匹配不在范围内
  1. 查询姓美的员工信息
select * from People where PeopleName like '美%'
  1. 显示名字中有“尚”或者“史”的员工信息
select * from People  where PeopleName like '%尚%' or PeopleName like '%史%'
  1. 查询姓刘的员工,名字是2个字
--方案一:
select * from People  where PeopleName like '刘_'
--方案二:
select * from People where substring(PeopleName,1,1) = '刘' and len(PeopleName) = 2
  1. 查询出名字最后一个字是香,名字一共三个字的员工信息
--方案一:
select * from People  where PeopleName like '__香'
--方案二:
select * from People where SUBSTRING(PeopleName,3,1) = '香' and LEN(PeopleName) = 3
  1. 查询出电话号码开头138的员工信息
select * from People  where PeoplePhone like '138%'
  1. 查询出电话号码开头138的员工信息,第4位可能是7,可能8 ,最后一个号码是5
select * from People where PeoplePhone like '138[7,8]%5'
  1. 查询出电话号码开头133的员工信息,第4位是2-5之间的数字 ,最后一个号码不是2和3
--方案一:
select * from People where PeoplePhone like '133[2,3,4,5]%[^2,3]'
--方案二:
select * from People where PeoplePhone like '133[2-5]%[^2-3]'

七、SQLSERVER聚合函数

SQL SERVER中聚合函数主要有:

count 求数量
max 求最大值
min 求最小值
sun 求和
avg 求平均值

1.聚合函数举例应用

  1. 求员工总人数
select COUNT(*) 数量 from People
  1. 求最大值,求最高工资
select MAX(peopleSalary) 最高工资 from People
  1. 求最小时,求最小工资
select MIN(PeopleSalary) 最低工资 from People
  1. 求和,求所有员工的工资总和
select SUM(PeopleSalary) 工资总和 from People
  1. 求平均值,求所有员工的平均工资
--方案一:
select AVG(PeopleSalary) 平均工资 from People
--方案二:精确到2位小数
select round(avg(PeopleSalary),2) 平均工资 from People
--方案三:精确到2位小数
select Convert(decimal(12,2),AVG(PeopleSalary))  平均工资 from People

ROUND函数用法:

round(num,len,[type])
其中:
num表示需要处理的数字,len表示需要保留的长度,type处理类型(0是默认值代表四舍五入,非0代表直接截取)
select ROUND(123.45454,3) --123.45500
select ROUND(123.45454,3,1) --123.45400

  1. 求数量,最大值,最小值,总和,平均值,在一行显示
select COUNT(*) 数量,MAX(PeopleSalary) 最高工资,
MIN(PeopleSalary) 最低工资,
SUM(PeopleSalary) 工资总和,
AVG(PeopleSalary) 平均工资 from People
  1. 查询出武汉地区的员工人数,总工资,最高工资,最低工资和平均工资
select '武汉' 地区,COUNT(*) 数量,MAX(PeopleSalary) 最高工资,
MIN(PeopleSalary) 最低工资
,SUM(PeopleSalary) 工资总和,
AVG(PeopleSalary) 平均工资
from People WHERE PEOPLEADDRESS = '武汉'
  1. 求出工资比平均工资高的人员信息
select * from People where PeopleSalary > (select AVG(PeopleSalary) 平均工资 from People)
  1. 求数量,年龄最大值,年龄最小值,年龄总和,年龄平均值,在一行显示
--方案一:
select COUNT(*) 数量,
MAX(year(getdate())-year(PeopleBirth)) 最高年龄,
MIN(year(getdate())-year(PeopleBirth)) 最低年龄,
SUM(year(getdate())-year(PeopleBirth)) 年龄总和,
AVG(year(getdate())-year(PeopleBirth)) 平均年龄
from People
--方案二:
select COUNT(*) 数量,
MAX(DATEDIFF(year, PeopleBirth, getDate())) 最高年龄,
MIN(DATEDIFF(year, PeopleBirth, getDate())) 最低年龄,
SUM(DATEDIFF(year, PeopleBirth, getDate())) 年龄总和,
AVG(DATEDIFF(year, PeopleBirth, getDate())) 平均年龄
from People
  1. 计算出月薪在10000 以上的男性员工的最大年龄,最小年龄和平均年龄
--方案一:
select '男' 性别,COUNT(*) 数量,
MAX(year(getdate())-year(PeopleBirth)) 最高年龄,
MIN(year(getdate())-year(PeopleBirth)) 最低年龄,
SUM(year(getdate())-year(PeopleBirth)) 年龄总和,
AVG(year(getdate())-year(PeopleBirth)) 平均年龄
from People where PeopleSex = '男' and PeopleSalary >= 10000
--方案二:
select '男' 性别,COUNT(*) 数量,
MAX(DATEDIFF(year, PeopleBirth, getDate())) 最高年龄,
MIN(DATEDIFF(year, PeopleBirth, getDate())) 最低年龄,
SUM(DATEDIFF(year, PeopleBirth, getDate())) 年龄总和,
AVG(DATEDIFF(year, PeopleBirth, getDate())) 平均年龄
from People where PeopleSex = '男' and PeopleSalary >= 10000
  1. 统计出所在地在“武汉或上海”的所有女员工数量以及最大年龄,最小年龄和平均年龄
--方案一:
select '武汉或上海' 地区,'女' 性别,COUNT(*) 数量,
MAX(year(getdate())-year(PeopleBirth)) 最高年龄,
MIN(year(getdate())-year(PeopleBirth)) 最低年龄,
SUM(year(getdate())-year(PeopleBirth)) 年龄总和,
AVG(year(getdate())-year(PeopleBirth)) 平均年龄
from People where PeopleSex = '女' and PeopleAddress in('武汉','上海')
--方案二:
select '武汉或上海' 地区,'女' 性别,COUNT(*) 数量,
MAX(DATEDIFF(year, PeopleBirth, getDate())) 最高年龄,
MIN(DATEDIFF(year, PeopleBirth, getDate())) 最低年龄,
SUM(DATEDIFF(year, PeopleBirth, getDate())) 年龄总和,
AVG(DATEDIFF(year, PeopleBirth, getDate())) 平均年龄
from People where PeopleSex = '女' and PeopleAddress in('武汉','上海')
  1. 求出年龄比平均年龄高的人员信息
--方案一:
select * from People where
year(getdate())-year(PeopleBirth) >
(select AVG(year(getdate())-year(PeopleBirth))
from People)
--方案二:
select * from People where
DATEDIFF(year, PeopleBirth, getDate()) >
(select AVG(DATEDIFF(year, PeopleBirth, getDate()))
from People)

2.补充-SQL中常用时间处理函数

GETDATE() 返回当前的日期和时间

DATEPART() 返回日期/时间的单独部分

DATEADD() 返回日期中添加或减去指定的时间间隔

DATEDIFF() 返回两个日期直接的时间

DATENAME() 返回指定日期的指定日期部分的整数

CONVERT() 返回不同格式的时间
示例:

--获取指定时间的差值
select dateiff(day,'2021-09-04',getDate());
--加减时间,此处为获取五分钟前的时间,MINUTE 表示分钟,可为 YEAR,MONTH,DAY,HOUR
select dateadd(MINUTE,-5,getDate());
select datename(monrh,getDate());                 --当前月份
select DATENAME(WEEKDAY, getDate());              --当前星期几
select DATEPART(month, getDate());                --当前月份
select DAY(getDate());                            --返回当前日期天数
select MONTH(getDate());                          --返回当前日期月数
select YEAR(getDate());                           --返回当前日期年数SELECT CONVERT(VARCHAR(22),GETDATE(),20)          --2021-09-04 19:58:28
SELECT CONVERT(VARCHAR(24),GETDATE(),21)          --2021-09-04 19:59:09.673
SELECT CONVERT(VARCHAR(22),GETDATE(),23)          --2021-09-04
SELECT CONVERT(VARCHAR(22),GETDATE(),24)          --19:59:40
SELECT CONVERT(varchar(20),GETDATE(),14)          --19:59:51:333

时间格式控制字符串:

名称 日期单位 缩写
year yyyy 或yy
季度 quarter qq,q
month mm,m
一年中的第几天 dayofyear dy,d
day dd,d
一周中的第几天
星期 week dw
小时 Hour hh
分钟 minute mi,n
second ss,s
毫秒 millisecond ms

八、SQLSERVER分组查询

  1. 根据员工所在地区分组统计员工人数 ,员工工资总和 ,平均工资,最高工资和最低工资
--方案一:使用union(此方案需要知道所有的地区,分别查询出所有地区的数据,然后使用union拼接起来。)
select '武汉' 地区,COUNT(*) 数量,MAX(PeopleSalary) 最高工资,MIN(PeopleSalary) 最低工资
,SUM(PeopleSalary) 工资总和,AVG(PeopleSalary) 平均工资 from Peoplewhere PeopleAddress = '武汉' union
select '北京' 地区,COUNT(*) 数量,MAX(PeopleSalary) 最高工资,MIN(PeopleSalary) 最低工资
,SUM(PeopleSalary) 工资总和,AVG(PeopleSalary) 平均工资 from Peoplewhere PeopleAddress = '北京'--...其它地区数据--...其他地区数据--方案二:使用Group by
select PeopleAddress 地区,COUNT(*) 人数,SUM(PeopleSalary) 工资总和,
AVG(PeopleSalary) 平均工资,MAX(PeopleSalary) 最高工资,MIN(PeopleSalary) 最低工资
from People group by PeopleAddress
  1. 根据员工所在地区分组统计员工人数,员工工资总和,平均工资,最高工资和最低工资,1985 年及以后出身的员工不参与统计。
select PeopleAddress 地区,COUNT(*) 人数,SUM(PeopleSalary) 工资总和,
AVG(PeopleSalary) 平均工资,MAX(PeopleSalary) 最高工资,MIN(PeopleSalary) 最低工资
from People
where PeopleBirth < '1985-1-1'
group by PeopleAddress
  1. 根据员工所在地区分组统计员工人数,员工工资总和,平均工资,最高工资和最低工资,要求筛选出员工人数至少在2人及以上的记录,并且1985年及以后出身的员工不参与统计。
select PeopleAddress 地区,COUNT(*) 人数,SUM(PeopleSalary) 工资总和,
AVG(PeopleSalary) 平均工资,MAX(PeopleSalary) 最高工资,MIN(PeopleSalary) 最低工资
from People
where PeopleBirth < '1985-1-1'
group by PeopleAddress
having COUNT(*) >= 2

九、SQLSERVER多表查询

1.笛卡尔乘积

select * from People,Department

此查询结果会将People表的所有数据和Department表的所有数据进行依次排列组合形成新的记录。例如People表有3条记录,Department表有3条记录,则排列组合之后查询结果会有3*3=9条记录。

2.简单多表查询

此种查询不符合主外建关系的数据不会被显示

查询员工信息,同时显示部门名称

select * from People,Department where People.DepartmentId = Department.DepartmentId


查询员工信息,同时显示职级名称

select * from People,Rank where People.RankId = Rank.RankId


查询员工信息,同时显示部门名称,职位名称

select * from People,Department,Rank
where People.DepartmentId = Department.DepartmentId and People.RankId = Rank.RankId

3.内连接

此种查询不符合主外建关系的数据不会被显示

查询员工信息,同时显示部门名称

select * from People inner join Department on People.DepartmentId = Department.DepartmentId

查询员工信息,同时显示职级名称

select * from People inner join Rank on People.RankId = Rank.RankId

查询员工信息,同时显示部门名称,职位名称

select * from People
inner join Department on People.DepartmentId = Department.DepartmentId
inner join Rank on People.RankId = Rank.RankId

4.外连接

外连接分为左外连接、右外连接和全外连接。
左外联接:以左表为主表显示全部数据,主外键关系找不到数据的地方null取代。
右外连接(right join):右外连接和左外连接类似,A left join B == B right join A
全外连接(full join):两张表的所有数据无论是否符合主外键关系必须全部显示,不符合主外键关系的地方null取代。

以下是左外连接的语法示例:
查询员工信息,同时显示部门名称

select * from People left join Department on People.DepartmentId = Department.DepartmentId

查询员工信息,同时显示职级名称

select * from People left join Rank on People.RankId = Rank.RankId

查询员工信息,同时显示部门名称,职位名称

select * from People
left join Department on People.DepartmentId = Department.DepartmentId
left join Rank on People.RankId = Rank.RankId

5.多表查询综合示例

  1. 查询出武汉地区所有的员工信息,要求显示部门名称以及员工的详细资料
select PeopleName 姓名,People.DepartmentId 部门编号 ,DepartmentName 部门名称,
PeopleSex 性别,PeopleBirth 生日,
PeopleSalary 月薪,PeoplePhone 电话,PeopleAddress 地区
from People left join DEPARTMENT on Department.DepartmentId = People.DepartmentId
where PeopleAddress = '武汉'
  1. 查询出武汉地区所有的员工信息,要求显示部门名称,职级名称以及员工的详细资料
select PeopleName 姓名,DepartmentName 部门名称,RankName 职位名称,
PeopleSex 性别,PeopleBirth 生日,
PeopleSalary 月薪,PeoplePhone 电话,PeopleAddress 地区
from People left join DEPARTMENT on Department.DepartmentId = People.DepartmentId
left join [Rank] on [Rank].RankId = People.RankId
where PeopleAddress = '武汉'
  1. 根据部门分组统计员工人数,员工工资总和,平均工资,最高工资和最低工资。
--提示:在进行分组统计查询的时候添加二表联合查询。
select DepartmentName 部门名称,COUNT(*) 人数,SUM(PeopleSalary) 工资总和,
AVG(PeopleSalary) 平均工资,MAX(PeopleSalary) 最高工资,MIN(PeopleSalary) 最低工资
from People left join DEPARTMENT on Department.DepartmentId = People.DepartmentId
group by Department.DepartmentId,DepartmentName
  1. 根据部门分组统计员工人数,员工工资总和,平均工资,最高工资和最低工资,平均工资在10000 以下的不参与统计,并且根据平均工资降序排列。
select DepartmentName 部门名称,COUNT(*) 人数,SUM(PeopleSalary) 工资总和,
AVG(PeopleSalary) 平均工资,MAX(PeopleSalary) 最高工资,MIN(PeopleSalary) 最低工资
from People left join DEPARTMENT on Department.DepartmentId = People.DepartmentId
group by Department.DepartmentId,DepartmentName
having AVG(PeopleSalary) >= 10000
order by AVG(PeopleSalary) desc
  1. 根据部门名称,然后根据职位名称,分组统计员工人数,员工工资总和,平均工资,最高工资和最低工资
select DepartmentName 部门名称,RANKNAME 职级名称,COUNT(*) 人数,SUM(PeopleSalary) 工资总和,
AVG(PeopleSalary) 平均工资,MAX(PeopleSalary) 最高工资,MIN(PeopleSalary) 最低工资
from People
LEFT JOIN DEPARTMENT on Department.DepartmentId = People.DepartmentId
LEFT JOIN [Rank] on [Rank].RANKID = People.RANKID
group by Department.DepartmentId,DepartmentName,[Rank].RANKID,RANKNAME

6.自连接

自连接:自己连接自己。

例如有如下结构和数据:

create table Dept
(DeptId int primary key,  --部门编号DeptName varchar(50) not null, --部门名称ParentId int not null,  --上级部门编号
)
insert into Dept(DeptId,DeptName,ParentId)
values(1,'软件部',0)
insert into Dept(DeptId,DeptName,ParentId)
values(2,'硬件部',0)insert into Dept(DeptId,DeptName,ParentId)
values(3,'软件研发部',1)
insert into Dept(DeptId,DeptName,ParentId)
values(4,'软件测试部',1)
insert into Dept(DeptId,DeptName,ParentId)
values(5,'软件实施部',1)insert into Dept(DeptId,DeptName,ParentId)
values(6,'硬件研发部',2)
insert into Dept(DeptId,DeptName,ParentId)
values(7,'硬件测试部',2)
insert into Dept(DeptId,DeptName,ParentId)
values(8,'硬件实施部',2)

如果要查询出所有部门信息,并且查询出自己的上级部门,查询结果如下:

--部门编号      部门名称     上级部门
-- 3           软件研发部     软件部
-- 4           软件测试部     软件部
-- 5           软件实施部     软件部
-- 6           硬件研发部     硬件部
-- 7           硬件测试部     硬件部
-- 8           硬件实施部     硬件部select A.DeptId 部门编号,A.DeptName 部门名称,B.DeptName 上级名称 from Dept A
inner join Dept B on A.ParentId = B.DeptId

总结

不知不觉已经两万字了…

SqlService基础一篇搞定(建库建表、插入数据、修改和删除数据、基础查询、条件查询、模糊查询、聚合函数、分组查询、多表查询)相关推荐

  1. 一篇搞定 SpringBoot+Mybatis+Shiro 实现多角色权限管理

    初衷:我在网上想找整合springboot+mybatis+shiro并且多角色认证的博客,发现找了好久也没有找到想到的,现在自己会了,就打算写个博客分享出去,希望能帮到你. 原创不易,请点赞支持! ...

  2. vlan配置实例详解_网工知识角|MUXVLAN技术详解,基本原理一篇搞定

    学网络,就在IE-LAB 国内高端网络工程师培养基地 MUX VLAN(Multiplex VLAN )提供了一种通过VLAN进行网络资源控制的机制.通过MUX VLAN提供的二层流量隔离的机制可以实 ...

  3. CentOS7搭建LNMP+WordPress一篇搞定

    零.关于本文 本文首次完成于2019年5月12日,经历多次修改.本文所有的参考文献,均以超链接的形式给出.考虑到网上的部分教程不够完整,有的已经过时,我将我搭建环境的方法记录下来. 这篇文章适合: 希 ...

  4. SpringBoot的Web开发支持【超详细【一篇搞定】果断收藏系列】

    SpringBoot的Web开发支持 常用的服务器配置 使用Jetty服务器替换Tomcat 排除Tomcat的启动器,引入Jetty application.yml 编写入口程序 编写Control ...

  5. mysql中数据库怎么建库建表

    数据库操作命令 本博客记录了,创建数据库,数据表的最基本操作,手把手教你如何入门Mysql,基础的创建数据库,数据表的注意事项,以及一些禁忌. 首先数据库是不区分大小写的,但是它对空格已经中文下的字符 ...

  6. 数据库1-SQL server建库建表操作

    菜鸟学习数据库(一) 这是一个目录 菜鸟学习数据库(一) (一)每贴一句 (二)开始 (1)进入MSSMS软件 1.进入软件 2.点击新建查询: 3.新建的查询界面 (2)开始sql语言建库建表 1. ...

  7. hive:建库建表、表分区、内部表外部表、数据导入导出

    hive建库建表与数据导入 建库 hive中有一个默认的库: 库名: default 库目录:hdfs://hdp20-01:9000/user/hive/warehouse 新建库: create  ...

  8. SQL Server建库建表命令

    数据库建库建表 1.直接右键数据库,选择新建数据库: 2.通过新建查询,输入命令建库建表. 使用CREATE DATABASE创建数据库school. 数据文件的逻辑名称自定义,需要注意的点是主数据文 ...

  9. Mysql 数据库实战-建库-建表-查多表

    前文:MySql数据库基本概念 数据库 DataBase(数据库),存储数据的仓库. 第一方或第三方提供的图形化界面的客户端(DBeaver,Mariadb) 在Mysql中创建若干个数据库,每个数据 ...

最新文章

  1. 谷歌ALBERT模型V2+中文版来了:之前刷新NLP各大基准,现在GitHub热榜第二
  2. 面试准备工作 -戈多编程
  3. 洛谷 P1736 创意吃鱼法(多维DP)
  4. 2008下php上传文件崩溃,php – 当用户反复尝试上传无效文件类型时,网站崩溃
  5. python字符串内建函数_Python的字符串内建函数(字符串处理)
  6. 【英语学习】【WOTD】largesse 释义/词源/示例
  7. Python 开发工具集:关于文档、测试、调试、程序的优化和分析
  8. linux命令--ldconfig和ldd用法
  9. 高效使用使用SQL缓存依赖
  10. CentOS 7配置Docker Storage
  11. 拓端tecdat|matlab使用贝叶斯优化的深度学习:卷积神经网络CNN
  12. 从阿尔法狗元(AlphaGo Zero)的诞生看终极算法的可能性
  13. mysql jemalloc_安装 jemalloc for mysql
  14. Vue前端技术知识整理
  15. 权变理论计算机管理理论,现代管理理论的主要学派
  16. Python 对json文件加密和解密
  17. 本机远程Windows服务器远程桌面不能相互复制粘贴的两种解决方案
  18. SpringBoot整合Sa-Token
  19. 为GET和POST请求添加请求参数和请求头
  20. 交流电源和直流电源有什么区别?

热门文章

  1. PLC模拟输入滤波10种方法
  2. canvas+js实现简单的数字华容道小游戏
  3. Python初学者学习笔记
  4. 20款常用的在线配色工具
  5. 微信小游戏 :未找到入口 app.json 文件,或者文件读取失败,请检查后重新编译
  6. 计算机程序创始人阿达洛芙莱斯
  7. 从头开始,彻底理解服务端渲染原理
  8. Linux运行jar包报错:Error:Invalid or corrupt jarfile xxx.jar
  9. vue3开发1:在vue3项目中集成ckeditor5编辑器,自定义图片上传,图片编辑排坑(一)
  10. Oulipo(欧力波)(经典kmp模板题) HDU-1686