SQL SERVER数据库:SQL看这一篇就看够了(附详细代码及截图)

这篇具有很好参考价值的文章主要介绍了SQL SERVER数据库:SQL看这一篇就看够了(附详细代码及截图)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

写在前面

01-SQL SERVER 数据库基础

02_01-创建数据库

02_02-创建数据表

02_03-表结构和约束的维护

03-插入数据

04-数据的修改和删除

05-基本查询

06_01-条件查询一

06_02-条件查询二

07-模糊查询

08-聚集函数

09-分组查询

10-多表查询一

11-多表查询二


写在前面

本篇文章是在下面这个B站课程里学的,作为我的学习记录同时也希望能帮助到大家。

【SQL SERVER数据库_D丝学编程】 https://www.bilibili.com/video/BV1XV411C7TP/?p=2&share_source=copy_web&vd_source=02052d2fc18088b96251f0ac88221db6

sql代码,# 数据库SQL,数据库,sqlserver

废话少说,现在就开始学习吧!

01-SQL SERVER 数据库基础

SQL SERVER介绍

数据库:数据库是“按照数据结构来组织、存储和管理数据的仓库”,是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。

应用场景:在软件系统中无处不在,几乎所有的软件系统背后都有数据库,例如(淘宝、QQ、游戏等)。

数据表现形式:(二维表)

学号 姓名 性别 电话 邮箱
001 刘备 13558789854 liubei@qq.com

002

孙尚香 13665878523 susnhangxiang@163.com
003 关羽 13223569852 guanyu@163.com
004 张飞 1343720083 zhangfei@163.com

主流关系型数据库:SQL SERVER、MySQL、ORACLE等。

SQL SERVER官网:SQL Server 下载 | Microsoft

SQL SERVER界面

sql代码,# 数据库SQL,数据库,sqlserver

打开数据库:

(1)启动服务:

【1】命令行启动;【2】SQL SERVER配置管理器;【3】Windows服务;

(2)打开SQL SERVER Management Studio,使用工具连接到数据库。

【1】Windows身份验证;【2】SQL SERVER身份验证;

数据库基本操作

(1)建库;(2)建表;(3)数据维护。

(1)建库:右键数据库 新建数据库

sql代码,# 数据库SQL,数据库,sqlserversql代码,# 数据库SQL,数据库,sqlserver

DBTEST是数据文件,DBTEST_log是日志文件。

(2)建表

 sql代码,# 数据库SQL,数据库,sqlserver

 把StuNo(学号)设置为主键,唯一标识一个人。

sql代码,# 数据库SQL,数据库,sqlserver sql代码,# 数据库SQL,数据库,sqlserver

设置好之后,刷新表就能看到刚才新建的表了。

sql代码,# 数据库SQL,数据库,sqlserver sql代码,# 数据库SQL,数据库,sqlserver

选择前1000行可以查询数据,刚建的表还没有插入数据,所以现在是查询不到信息的。

sql代码,# 数据库SQL,数据库,sqlserver sql代码,# 数据库SQL,数据库,sqlserver

 编辑数据:编辑前200行,可以插入、修改、删除数据。

 sql代码,# 数据库SQL,数据库,sqlserversql代码,# 数据库SQL,数据库,sqlserver

 删除数据sql代码,# 数据库SQL,数据库,sqlserver

数据库的迁移

 (1)数据库的分离、附加;(分离和删除的区别在于硬盘上是否还留存有数据库文件)

(2)数据库的备份、还原;

(3)数据库脚本的保存。

02_01-创建数据库

--drop database DBTEST 当前数据库如果已经存在DBTEST 就先删掉再创建
--创建数据库
/*if exists (select * from sys.databases where name = 'DBTEST')
drop database DBTEST*/
--危险操作

create database DBTEST
on --数据文件
(
    name = 'DBTEST',--逻辑名称 在数据库里字符串放在单引号‘’里
	filename = 'D:\DATA\DBTEST.mdf' , --物理路径和名称
    size = 5MB,--文件的初始大小
	filerowth = 2MB--文件增长可以写大小,也可以写百分比
)
log on --日志文件
(
    name = 'DBTEST_log',--逻辑名称 在数据库里字符串放在单引号‘’里
	filename = 'D:\DATA\DBTEST_log.ldf' , --物理路径和名称
    size = 5MB,--文件的初始大小
	filerowth = 2MB--文件增长可以写大小,也可以写百分比
)

02_02-创建数据表

建表(部门表、职级表、员工表)

--默认情况下,建表会建在master库里
--切换数据库
use DBTEST
--创建表基本语法
/*
create table 表名
(
   列名1 数据类型,
   列名2 数据类型,
   列名3 数据类型
)
*/
--判断表是否存在
if exists(select * from sys.objects where name = 'Department'and type='U')
drop table Department
--建表(部门表、职级表、员工表)
create table Department
(--部门表
   --部门编号 primary:主键,唯一标识一行;identity:自动增长,初始值为1,增长步长也为1
   DepartmentId int PRIMARY KEY identity(1,1),--设置为主键之后编号不能重复。
   --部门名称
   DepartmentName nvarchar(50) not null,--nvarchar代表字符串,nvarchar(50)表示最多不能超过50个字符
   --部门描述
   DepartmentRemark text
)

/* char\varchar\text\nchar\nvarchar\ntext的区别
  ①char     定长,char(10),无论存储的数据是否真的有10字节,都要占用10字节;
             char(10)存储'ab',仍然占用10字节。
  ②varchar  变长,varchar(10),最多占10字节;
             varcahr(10)存储'ab',占用2字节。
  ③text     长文本,可以存储几千几万个字节的数据
  ④char、varchar、text前面加n:存储Unicode字符,对中文友好。
    varchar(100):存储100个字母或者50个汉字,一个汉字占两个字节
	nvarchar(100):存储100个字母或者100个汉字。
*/

create table [Rank]
(--职级表
   --职级编号 primary:主键,唯一标识一行;identity:自动增长,初始值为1,增长步长也为1
   RankId int PRIMARY KEY identity(1,1),--设置为主键之后编号不能重复。
   --职级名称
   RankName nvarchar(50) not null,--nvarchar代表字符串,nvarchar(50)表示最多不能超过50个字符
   --职级描述
   RankRemark text
)

create table People
(--员工表
   --员工编号 primary:主键,唯一标识一行;identity:自动增长,初始值为1,增长步长也为1
   PeopleId int PRIMARY KEY identity(1,1),--设置为主键之后编号不能重复。
   --部门 references:引用外键,将其他表的主键作为这个表的字段(一列)
   DepartmentId int references Department(DepartmentId) ,
   --职级 加了references之后,添加外键字段时会自动检测输入的字段是否正确
   RankId int references [Rank](RankId),
   --员工姓名
   PeopleName nvarchar(50) not null,--nvarchar代表字符串,nvarchar(50)表示最多不能超过50个字符
   --员工性别 用default('男')设置默认情况下员工性别为男,
   --check(PeopleSex='男' or PeopleSex='女')约束性别只能是男或者女
   PeopleSex nvarchar(1) default('男') check(PeopleSex='男' or PeopleSex='女'),
   --员工生日 datetime类型能存储年月日时分秒,date类型只能存储年月日,smalldaetime只能存储最近的一段时间
   PeopleBirth smalldatetime not null,
   --员工薪资 decimal(12,2) 12:长度最长为12,2:精确到小数点后2位
   PeopleSalary decimal(12,2) check(PeopleSalary >= 1000 and PeopleSalary<=1000000) not null,
   --员工号码 unique表示每个PeoplePhone必须是唯一的 unique也是一个约束条件
   PeoplePhnoe varchar(20) unique not null,
   --员工住址
   PeopleAddress varchar(300),
   --添加时间 系统添加员工信息的时间
   PeopleAddTime smalldatetime default(getdate())
)

02_03-表结构和约束的维护

修改表的结构有三种情况:(1)添加列、(2)删除列、(3) 修改列。

(1)添加列

在员工表中添加员工邮箱PeopleMail 

--(1)添加列 alter table 表名 add 新列名 数据类型
     alter table People add PeopleMail varchar(30)

添加PeopleMail之前

sql代码,# 数据库SQL,数据库,sqlserver

添加PeopleMail之后

sql代码,# 数据库SQL,数据库,sqlserver

 (2)删除列

删除员工表中刚刚新加的PeopleMail列

--(2)删除列 alter table 表名 drop column 列名 
     alter table People drop column PeopleMail

删除PeopleMail列之后

sql代码,# 数据库SQL,数据库,sqlserver

 (3)修改列

--(3) 修改列 alter table 表名 alter column 列名 数据类型
     --修改People表中的PeopleAddress的长度300-->200
	 alter table People alter column PeopleAddress varchar(200)

注意:在做具体设计或者项目的时候,要尽量少的使用alter语句,因为当我们修改表的结构的时候很有可能整个软件或者系统都要跟着一起修改,会造成很大的麻烦。

维护约束

约束名查找

sql代码,# 数据库SQL,数据库,sqlserversql代码,# 数据库SQL,数据库,sqlserver

sql代码,# 数据库SQL,数据库,sqlserver

--修改表的结构--------------------------------------------
--(1)添加列 alter table 表名 add 新列名 数据类型
	 alter table People add PeopleMail varchar(30)--添加PeopleMail列
--(2)删除列 alter table 表名 drop column 列名 
     alter table People drop column PeopleMail--删除PeopleMail列
--(3) 修改列 alter table 表名 alter column 列名 数据类型
     --修改People表中的PeopleAddress的长度300-->200
	 alter table People alter column PeopleAddress varchar(200)
--删除添加约束--------------------------------------------
--(1)删除约束 (本质上也是修改表,修改表的约束 
    --alter table 表名 drop constraint 约束名  
    --删除PeopleSalary的约束
	 alter table People drop constraint CK_PeoPleSa_34C8D9D1
--(2)添加约束 
    --alter table 表名 add constraint 约束名 check(表达式)
	--添加check约束 添加工资约束 工资范围:1000~1000000  
	alter table People add constraint CK_PeoPleSa1 check(PeopleSalary >= 1000 and PeopleSalary<=1000000)
	--添加主键约束 primary key
	alter table 表名 add constraint 约束名 primary key 列名
	--添加唯一约束 unique
	alter table 表名 add constraint 约束名 unique 列名 
	--添加默认约束 default
	alter table 表名 add constraint 约束名 default 默认值 for 列名
	--添加外键 
	alter table 表名 add constraint 约束名 foreign key 列名  
	references 关联表名(列名) 

 03-插入数据

--插入数据
	--向部门表中插入数据  
	--完整语法 字段和具体的值一一对应
	insert into Department (DepartmentName,DepartmentRemark)
	values ('市场部','..........')
	insert into Department (DepartmentName,DepartmentRemark)
	values ('软件部','..........')
	insert into Department (DepartmentName,DepartmentRemark)
	values ('企划部','..........')
	--简写  最好不要这样写因为字段顺序如果换了,这样直接插入可能会出错
	insert into Department values ('硬件部','..........')
	--一次性插入多行数据
	insert into Department(DepartmentName,DepartmentRemark)
    select	'测试部','......'union
	select	'网络部','......'union
	select	'宣传部','......'union
	select	'公关部','......'
	select * from Department

	--向职级表中插入数据 
	insert into Rank1(RankName,RankRemark) 
	values ('初级','......')
	insert into Rank1(RankName,RankRemark) 
	values      ('高级','......')
	insert into Rank1(RankName,RankRemark) 
	values     ('中级','......')
	insert into Rank1(RankName,RankRemark) 
	values      ('初级','......')
	insert into Rank1(RankName,RankRemark) 
	values     ('高级','......')
	insert into Rank1(RankName,RankRemark) 
	values     ('高级','......')
	insert into Rank1(RankName,RankRemark) 
	values     ('中级','......')
	insert into Rank1(RankName,RankRemark) 
	values     ('初级','......')
	select * from Rank1
	
	--向员工表中插入数据
	insert into People(DepartmentId,RankId ,PeopleName,PeopleSex,PeopleBirth,PeopleSalary,PeoplePhone,PeopleAddress)
	values (8,1,'刘备','男','1988-8-8',100000,'13859038502','中国')
	select *from People

04-数据的修改和删除

	--数据库的修改和删除
	select * from Department
	select * from Rank1
	select * from People 
	--修改-------------------------------------------------------
	--语法: updete 表名 set  字段1=值1,字段2=值2 where 条件
	--在People中做工资调整
	update People set PeopleSalary=PeopleSalary+1000  --没有加where条件就会修改people表中的每一项PeopleSalary
	--给员工编号为14的员工加工资
	update People set PeopleSalary=PeopleSalary+2000 
	where PeopleId ='14'
	--已知软件部编号为2,给软件部工资低于35000的员工加到35000
	update People set PeopleSalary=35000 
	where DepartmentId='2' and PeopleSalary <35000 --或:or、||
	select DepartmentId,PeopleName,PeopleSalary
    from People
	where DepartmentId = '2'
	--多字段修改
	--修改刘备的工资为原来的2倍,并且把刘备的地址改成北京
	update People set PeopleSalary = 2*PeopleSalary,PeopleAddress='北京'
	where PeopleName = '刘备'
	select * from People 
	--删除-------------------------------------------------------
	--语法: delete from 表名 where 条件
	--删除员工表所有记录
	/*delete from People*/ --这一句就不执行了 举个例子
	--删除市场部(部门编号1)中工资大于1万的人
	delete from People where DepartmentId = '1' and PeopleSalary>10000
	--关于删除(drop、truncate、delete)
	/*
	   drop table People     --删除表对象,表和数据一起被删掉
	   truncate table People --删除数据(清空数据),表对象及表结构依然存在
	   delete table People   --删除所有数据,表对象及表结构依然存在

	   truncate和delete的区别
	   ①truncate清空所有数据,不能有条件;delete可以删除所有数据也可以删除符合条件的数据
	   ②自动编号:假设表中自动编号为1,2,3,4,5
	     使用truncate清空数据之后再添加数据,编号依然是1,2,3,4,5....
		 使用delete删除数据,删除的自动编号就永远不存在了,会在原来的编号后面续写6,7,8,9,10....
	*/

sql代码,# 数据库SQL,数据库,sqlserver

sql代码,# 数据库SQL,数据库,sqlserver

sql代码,# 数据库SQL,数据库,sqlserver

sql代码,# 数据库SQL,数据库,sqlserver

 sql代码,# 数据库SQL,数据库,sqlserversql代码,# 数据库SQL,数据库,sqlserver

 05-基本查询

	--基础查询
	--查询所有列、所有行
	select * from Department 
	select * from Rank1
	select * from People
	--查询指定列(姓名,性别,月薪,电话)
	select PeopleName,PeopleSex,PeopleSalary,PeoplePhone
	from People 
   --查询指定列 显示中文列名 注意:并不是将列名真的改成了中文的(姓名,性别,月薪,电话) 
	select PeopleName 姓名,PeopleSex 性别,PeopleSalary 月薪,PeoplePhone 电话
	from People 
	--查询员工所在城市
	select PeopleAddress
	from People 
	--查询员工所在城市(删除重复值:distinct)
	select distinct PeopleAddress
	from People 
	--假设准备加工资(上调20%),想查询出加工资后的员工数据
	select PeopleName,PeopleSex,PeopleSalary*1.2 加薪后的工资,PeopleSalary 原始工资
	from People

sql代码,# 数据库SQL,数据库,sqlserver

sql代码,# 数据库SQL,数据库,sqlserver

sql代码,# 数据库SQL,数据库,sqlserver

 06_01-条件查询一

SQL中的常用运算符

  常用运算符 含义
= 等于,比较是否相等及赋值
!= 比较不等于
> 大于
< 小于
>= 大于等于
<= 小于等于
IS NULL 比较是否为空
IS NOT NULL 比较是否不为空

in

比较是否在其中
like 模糊查询
BETWEEN...AND... 比较是否在两者之间
AND 逻辑与(两个条件同时成立时表达式成立)
OR 逻辑或(两个条件有一个成立时表达式成立)
NOT 逻辑非(条件成立,表达式则不成立;条件不成立,表达式则成立)
--条件查询
	select *from People
	--查询性别为女的员工信息
	select * from People where PeopleSex='女'
	--查询工资大于等于10000元的员工信息
	select * from people where PeopleSalary>= 10000
	--多条件|查询出性别为女且大于等于10000元的员工信息
	select * from People where PeopleSex='女' and PeopleSalary>= 10000
	--查询出月薪大于等于10000的员工或者月薪大于等于8000的女员工
	select * from People where PeopleSalary >= 10000 or (PeopleSalary>=8000 and PeopleSex='女')
    --查询出出生年月在1980-1-1之后,且月薪大于等于10000的女员工
	select * from People where PeopleBirth >='1980-1-1'and (PeopleSalary>=10000 and PeopleSex='女' )
	--查询月薪在10000-20000之间的员工信息
	select * from People where PeopleSalary >= 10000 and PeopleSalary <= 20000
	select * from People where PeopleSalary between 10000 and 20000 --用between and也可以
	--查询出地址在'成都'或者'北京'
	select * from People where PeopleAddress = '成都' or PeopleAddress = '北京'
	select * from People where PeopleAddress in ('成都','北京') --用in 
	--排序 asc升序(默认) desc降序
	--查询所有的员工信息,按工资排序,降序
	select * from People order by PeopleSalary desc
	--查询所有的员工信息,按名字长度排序,降序
	select * from People order by len(PeopleName) desc
	--查询出工资最高的五个人的信息 
	select top 5 * from People order by PeopleSalary desc
	--查询出工资最高的10%的员工的信息
	select top 10 percent * from People order by PeopleSalary desc
	--null:空值
	insert into People(DepartmentID,RankID,PeopleName,PeopleSex,PeopleBirth,PeopleSalary,PeoplePhone,PeopleAddTime)
	values(1,1,'花木兰','女','1995-3-2',30000,'`18393225556',GETDATE())
	select * from People
	--查询出没有填写地址的员工信息
	select * from People where PeopleAddress is null
	--查询出已经填写了地址的员工信息
	select * from People where PeopleAddress is not null

 06_02-条件查询二

	--查询出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) between 1980 and 1989 --year(PeopleBirth)把PeopleBirth的年份取出来
	--查询30到40岁之间,并且工资在15000~30000之间的员工信息
    select * from People where 
	year(getdate())-year(PeopleBirth) between 30 and 40  
	and 
	PeopleSalary  between 15000 and 30000
	--查询星座是巨蟹座的员工信息(6.22~7.22)
	select  * from People where
	month(PeopleBirth)=1 and day(PeopleBirth) >= 22--如果是6月要大于22
	or
	month(PeopleBirth)= 7 and day(PeopleBirth) <= 22--如果是7月要小于22
	--查询出工资比刘禅高的员工信息
	select * from People where PeopleSalary > 
	(select  PeopleSalary from People where PeopleName = '刘禅')
	--查询出和刘禅在同一个城市的员工信息
	select * from People where PeopleAddress > 
	(select  PeopleAddress from People where PeopleName = '刘禅')
   --查询出生肖是'鼠'的员工信息
   --鼠、牛、虎、兔、龙、蛇、马、羊、猴、鸡、狗、猪
   --4   5   6   7   8   9   10  11  0   1    2  3
   select * from People where year(PeopleBirth)%12=4
   --查询所有的员工信息,添加一列,显示生肖
   select *,
   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 *,
   case year(PeopleBirth)%12
       when 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 

sql代码,# 数据库SQL,数据库,sqlserver

 07-模糊查询

--模糊查询   like
/*
   模糊查询使用like关键字和通配符结合来实现,通配符的具体含义如下:
   %  :代表匹0个字符,1个字符或者多个字符
   _  :代表匹配有且只有1个字符
   [] :代表匹配范围内
   [^]:代表匹配不在范围内
*/

--(1)查询姓刘的员工信息
select * from People where PeopleName like '刘%'
--(2)查询名字中含有'尚'的员工信息
select * from People where PeopleName like '%尚%'
--(3)显示名字中含有'尚'或者'兰'的员工信息
select * from People where PeopleName like '%尚%' or PeopleName like '%兰%'
--(4)查询姓刘的员工,名字是2个字
select * from People where PeopleName like '刘_'
select SUBSTRING('hello word',3,4)
--SUBSTRING函数取字符串里的值,第一个参数代表要操作的字符,第二个参数代表从第几个字符串开始取,第三个参数代表取几个字符
select * from People where SUBSTRING(PeopleName,1,1)= '刘' and len(PeopleName) = 2
--(5)查询出名字最后一个字是'香',名字一共是三个字的员工信息
select * from People where PeopleName like '__香'
select * from People where SUBSTRING(PeopleName,3,1)= '香' and len(PeopleName) = 3
--(6)查询出电话号码开头为138的员工信息
select * from People where PeoplePhone like '138%'
--(7)查询出电话号码为192的,第4位是3或者8,最后一个号码是3的员工信息
select * from People where PeoplePhone like '1923%3' or PeoplePhone like '1928%3'
--(8)查询出电话号码为192的,第4位是2-5之间,最后一个号码不是5和6
select * from People where PeoplePhone like '192[2,3,4,5]%[^5,6]'
select * from People where PeoplePhone like '192[2-5]%[^5,6]'

sql代码,# 数据库SQL,数据库,sqlserver

sql代码,# 数据库SQL,数据库,sqlserver

08-聚集函数

SQL SERVER 中聚集函数主要有:

count:求数量

max:求最大值

min:求最小值

avg:求平均值

    --(1)求员工总人数
	select count(*)员工总人数 from People
	--(2)求最大值,求最高工资
	select max(PeopleSalary) 最高工资 from People
	--(3)求最小值,求最小工资
	select min(PeopleSalary) 最低工资 from People
	--(4)求和,求所有员工的工资总和
	select sum(PeopleSalary) 工资总和 from People
	--(5)求平均值,求所有员工的平均工资
	select avg(PeopleSalary)平均工资 from People

sql代码,# 数据库SQL,数据库,sqlserver

用AVG函数求所有员工的工资平均值

--(5)求平均值,求所有员工的平均工资
	select avg(PeopleSalary)平均工资 from People
	/*
	select round(a,b,c) from 表名
	round函数 a:要处理的数据 b:保留到小数点后b位 c:0就四舍五入,c是其他数字直接把后面的数值删掉
	如果要四舍五入,第三个参数可以省略,因为ground默认是0。
	*/
	select round(sum(PeopleSalary)/count(PeopleSalary),2,0)averageSalary from People
	select round(avg(PeopleSalary),2)平均工资 from People

sql代码,# 数据库SQL,数据库,sqlserver

	--(6)求数量、最大值、最小值、总和、平均值在一行显示
	select count(*) 人数,max(PeopleSalary)最高工资,min(PeopleSalary)最低工资,
	       sum(PeopleSalary) 工资总和, avg(PeopleSalary)平均工资 from People

sql代码,# 数据库SQL,数据库,sqlserver

    --在聚集函数的基础上加上条件查询
	--(7)查询出保定地区的员工人数、总工资、最高工资、最低工资和平均工资
	select count(*)员工人数,sum(PeopleSalary)总工资,max(PeopleSalary)最高工资,
	min(PeopleSalary)最低工资,avg(PeopleSalary)平均工资
	from People 
	where PeopleAddress = '保定'
	--(8)求出工资比平均工资高的人员信息
    select * from People where PeopleSalary >
	(select round(avg(PeopleSalary),2) 平均工资
	from People)

sql代码,# 数据库SQL,数据库,sqlserver

--(9)求数量,年龄最大值,年龄最小值,年龄总和,年龄平均值,在一行显示
	select *,year(getdate())-year(PeopleBirth) 年龄 from People --①通过year()求年龄
	select datediff(year,PeopleBirth,getdate()) from People     --②通过datediff()求时间差datediff(a,b,c) a:结果的单位,有year、month、day  时间差=c-b  
	
	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 
	

sql代码,# 数据库SQL,数据库,sqlserver

	--聚集函数
	/*
	   count:求数量 
	   max:求最大值
	   min:求最小值
	   sum :求和
	   avg:求平均值
	*/

	--(1)求员工总人数
	select count(*)员工总人数 from People
	--(2)求最大值,求最高工资
	select max(PeopleSalary) 最高工资 from People
	--(3)求最小值,求最小工资
	select min(PeopleSalary) 最低工资 from People
	--(4)求和,求所有员工的工资总和
	select sum(PeopleSalary) 工资总和 from People
	--(5)求平均值,求所有员工的平均工资
	select avg(PeopleSalary)平均工资 from People
	/*
	select round(a,b,c) from 表名
	round函数 a:要处理的数据 b:保留到小数点后b位 c:0就四舍五入,c是其他数字直接把后面的数值删掉
	如果要四舍五入,第三个参数可以省略,因为ground默认是0。
	*/
	select round(sum(PeopleSalary)/count(PeopleSalary),2,0)averageSalary from People
	select round(avg(PeopleSalary),2)平均工资 from People
	--(6)求数量、最大值、最小值、总和、平均值在一行显示
	select count(*) 人数,max(PeopleSalary)最高工资,min(PeopleSalary)最低工资,
	       sum(PeopleSalary) 工资总和, avg(PeopleSalary)平均工资 from People
    --在聚集函数的基础上加上条件查询
	--(7)查询出保定地区的员工人数、总工资、最高工资、最低工资和平均工资
	select count(*)员工人数,sum(PeopleSalary)总工资,max(PeopleSalary)最高工资,
	min(PeopleSalary)最低工资,avg(PeopleSalary)平均工资
	from People 
	where PeopleAddress = '保定'
	--(8)求出工资比平均工资高的人员信息
    select * from People where PeopleSalary >
	(select round(avg(PeopleSalary),2)
	from People)
	--(9)求数量,年龄最大值,年龄最小值,年龄总和,年龄平均值,在一行显示
	select *,year(getdate())-year(PeopleBirth) 年龄 from People --①通过year()求年龄
	select datediff(year,PeopleBirth,getdate()) from People     --②通过datediff()求时间差datediff(a,b,c) a:结果的单位,有year、month、day  时间差=c-b  
	 --year()
	select Count(*) 数量,
	Max(year(getdate())-year(PeopleBirth)) 年龄最大值,
	Min(year(getdate())-year(PeopleBirth)) 年龄最小值,
	sum(year(getdate())-year(PeopleBirth)) 年龄总和,
	avg(year(getdate())-year(PeopleBirth)) 年龄平均值
	from People 
	--datediff()
    select Count(*) 数量,
	Max(datediff(year,PeopleBirth,getdate())) 年龄最大值,
	Min(datediff(year,PeopleBirth,getdate())) 年龄最小值,
	sum(datediff(year,PeopleBirth,getdate())) 年龄总和,
	avg(datediff(year,PeopleBirth,getdate())) 年龄平均值
	from People 
	--(10)计算出月薪在10000以上的男性员工的人数、最大年龄,最小年龄和平均年龄
	select COUNT(*) 数量,
	Max(datediff(year,PeopleBirth,getdate())) 年龄最大值,
	Min(datediff(year,PeopleBirth,getdate())) 年龄最小值,
	avg(datediff(year,PeopleBirth,getdate())) 年龄平均值
	from People
	where PeopleSalary >=10000 and PeopleSex = '男'

	--(11)统计出所在地在'荆州'或在'安庆'的女员工的人数、最大年龄,最小年龄和平均年龄
	select COUNT(*) 数量,
	Max(datediff(year,PeopleBirth,getdate())) 年龄最大值,
	Min(datediff(year,PeopleBirth,getdate())) 年龄最小值,
	avg(datediff(year,PeopleBirth,getdate())) 年龄平均值
	from People
	where PeopleSex = '女' and PeopleAddress in('荆州','安庆') 
	--(12)求出年龄比平均年龄高的人员信息
	select * from People where year(getdate()-year(PeopleBirth))>
	(select avg(year(getdate())-year(PeopleBirth))from People)

09-分组查询

	--分组查询
	--(1)根据员工所在地区分组统计员工人数、员工工资总和、平均成绩、最高成绩和最低工资
	--方案一:使用union,union是把多个查询结果进行合并 (不推荐:①代码多;②必须要找到有那些地区才可以查询,很繁琐)
	--(此方案需要知道所有的地区,分别查询出所有地区的数据,然后使用union拼接起来。)
	  select '保定' 地区,count(*) 数量,MAX(PeopleSalary) 最高工资,MIN(PeopleSalary) 最低工资,SUM(PeopleSalary)工资总和,AVG(PeopleSalary) 平均工资
	  from People
	  where PeopleAddress = '保定' union
	  select '北京' 地区,count(*) 数量,MAX(PeopleSalary) 最高工资,MIN(PeopleSalary) 最低工资,SUM(PeopleSalary)工资总和,AVG(PeopleSalary) 平均工资
	  from People
	  where PeopleAddress = '北京'
	--方案二:group by分组
	  select PeopleAddress 地区, count(*) 员工人数,MAX(PeopleSalary) 最高工资,MIN(PeopleSalary) 最低工资,SUM(PeopleSalary)工资总和,AVG(PeopleSalary) 平均工资
	  from People
	  group by PeopleAddress
	--选择列表中的列只能是包含在聚集函数中的或者gruop by子句中,这里 PeopleName、PeopleId不可以加在选择列表里
	--(2)根据员工所在地区分组统计员工人数,员工工资总和,平均工资,最高工资和最低工资,1985年及以后出生的员工不参与统计
	  select PeopleAddress 地区, count(*) 员工人数,MAX(PeopleSalary) 最高工资,MIN(PeopleSalary) 最低工资,SUM(PeopleSalary)工资总和,AVG(PeopleSalary) 平均工资
	  from People
	  where PeopleBirth < '1985-1-1'
	  group by PeopleAddress
    --(3)根据根据员工所在地区分组统计员工人数,员工工资总和,平均工资,最高工资和最低工资,要求筛选出员工人数至少在2人以上的记录,并且1985年及以后出生的员工不参与统计
	  select PeopleAddress 地区, count(*) 员工人数,MAX(PeopleSalary) 最高工资,MIN(PeopleSalary) 最低工资,SUM(PeopleSalary)工资总和,AVG(PeopleSalary) 平均工资
	  from People
	  where PeopleBirth < '1985-1-1'--一般语句写在group by前面
	  group by PeopleAddress 
	  having count(*)>=2 --聚合函数条件写在group by后面,用having语句

sql代码,# 数据库SQL,数据库,sqlserver

10-多表查询一

    --多表查询
	select * from Department
	select * from People
	--笛卡尔乘积
	select * from People,Department
	--查询结果将Department所有记录和People表所有记录依次排列组合形成新的表
	--简单多表查询
	--查询员工信息,显示部门名称
	select * from People,Department
	where People.DepartmentId=Department.DepartmentId
	--查询员工信息,显示职级名称
	select * from People,Rank1
	where People.RankId=Rank1.RankId
	--查询员工信息,显示部门名称和显示职级名称
	select * from People,Department,Rank1
	where People.DepartmentId=Department.DepartmentId
	and People.RankId=Rank1.RankId

	--内连接查询
	--查询员工信息,显示部门名称
	select * from People 
	inner join Department on People.DepartmentId=Department.DepartmentId
	--查询员工信息,显示职级名称
	select * from People 
	inner join Rank1 on People.RankId=Rank1.RankId
	--查询员工信息,显示部门名称和显示职级名称
	select * from People 
	inner join Department on People.DepartmentId=Department.DepartmentId
	inner join Rank1 on People.RankId=Rank1.RankId

	--简单多表查询和内连接共同的特点:不符合主外键关系的数据不会被显示出来
	select * from People
	select * from Department 
	insert into People(DepartmentId,RankId,PeopleName,PeopleSex,PeopleBirth,PeopleSalary,PeoplePhone,PeopleAddress,PeopleAddTime )
	values (99,99,'张良','男','1975-8-9',8000,'13454432205','香港',getdate())
	--这条语句是不能插入到People表里面的,因为不符合主外键关系,DepartmentId和RankId不存在99号

    --外连接(左外连接、右外连接、全外连接)
	
	--左外连接:以左表为主表进行数据的显示,主外键关系找不到的数据用null取代
	--查询员工信息,显示部门名称
	select * from People 
	left join Department on People.DepartmentId=Department.DepartmentId
	--左连接 People在左边,显示所有的员工

	--查询员工信息,显示职级名称
	select * from People 
	left join Rank1 on People.RankId=Rank1.RankId
	--查询员工信息,显示部门名称和显示职级名称
	select * from People 
	left join Department on People.DepartmentId=Department.DepartmentId
	left join Rank1 on People.RankId=Rank1.RankId

	--右连:A left join B = B right join A
	--下面两个查询含义相同
	select * from People 
	left join Department on People.DepartmentId=Department.DepartmentId
   
	select * from Department
	right join People on People.DepartmentId=Department.DepartmentId
	--右连接 People在右边,显示所有的员工信息


	--全外连接:两张表的数据,无论是否符合关系,都要显示
	select * from People 
	full join Department on People.DepartmentId=Department.DepartmentId
	--所有的员工和所有的部门都要显示

11-多表查询二

欲知后事如何,且听下回分解。

持续更新......文章来源地址https://www.toymoban.com/news/detail-764581.html

到了这里,关于SQL SERVER数据库:SQL看这一篇就看够了(附详细代码及截图)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python SQL 数据库操作利器:SQLAlchemy 库详解(看这一篇文章就够了)

    引言: Python 是一门广受欢迎的编程语言,而 SQL 则是用于管理和操作数据库的标准查询语言。SQLAlchemy 是一个功能强大的 Python 库,它提供了一种与多种数据库进行交互的灵活方式。本文将介绍 SQLAlchemy 库,并以九个重要的要点详细解释其功能和用法。 SQLAlchemy 简介 SQLAlchem

    2024年02月07日
    浏览(66)
  • 精通线程池,看这一篇就够了

    当我们运用多线程技术处理任务时,需要不断通过new的方式创建线程,这样频繁创建和销毁线程,会造成cpu消耗过多。那么有没有什么办法 避免频繁创建线程 呢? 当然有,和我们以前学习过多连接池技术类似,线程池通过提前创建好线程保存在线程池中, 在任务要执行时取

    2023年04月17日
    浏览(95)
  • CSS基础——看这一篇就够了

    目录 一、CSS简介 1.CSS是什么? 2.CSS的作用 3.CSS的构成 二、CSS选择器 1.基础选择器 (1).标签选择器 (2)类选择器 (3)标签选择器 (4) 通配符选择器 2.复合选择器 (1)后代选择器(包含选择器) (2)子选择器 (3)并集选择器 (4)伪类选择器  三、基本属性 1.字体属性

    2024年02月09日
    浏览(70)
  • SourceTree使用看这一篇就够了

     你梦想有一天成为git大师,然而面对复杂的git命令,你感觉TMD这我能记得住吗?你曾经羡慕从命令行敲git命令,才会更加炫酷,然而时间一长,TMD命令我有忘了。那么今天我介绍的这款工具会让你从git命令中解救出来,这就是git可视化工具SourcTree。 事实上Git的功能十分强大

    2024年02月08日
    浏览(63)
  • Linux 命令大全(看这一篇就足够)

    目录 第一章:Linux目录结构 第一节:基本介绍 第二节:Linux具体目录结构 第二章:Linux常用命令 第一节:目录处理命令 2.1.1 命令格式 2.1.2 列出目录的内容:ls 命令 2.1.3 创建目录:mkdir 命令 2.1.4 切换工作目录:cd 命令 2.1.5 显示当前路径:pwd 命令  2.1.6 删除空目录:rmdir 命

    2024年02月03日
    浏览(46)
  • Docker Volume 看这一篇就够了

    默认情况下,在容器内创建的所有文件都存储在可写容器层上。这意味着: 当该容器不再存在时,数据不会持续存在,并且如果另一个进程需要数据,则可能很难将数据从容器中取出。 容器的可写层与运行容器的主机紧密耦合。您无法轻松地将数据移动到其他地方。 写入容

    2024年02月02日
    浏览(96)
  • ElasticSearch常见用法,看这一篇就够了

    2024送书福利正式起航 关注「哪吒编程」,提升Java技能 文末送3本《一本书讲透Elasticsearch:原理、进阶与工程实践》 大家好,我是哪吒。 ElasticSearch是一款由Java开发的开源搜索引擎,它以其出色的实时搜索、稳定可靠、快速安装和方便使用的特性,在Java开发社区中赢得了广

    2024年03月19日
    浏览(70)
  • 还不会二分查找?看这一篇就够了

    二分查找分为整数二分和浮点数二分,一般所说的二分查找都是指整数二分。 满足单调性的数组一定可以使用二分查找,但可以使用二分查找的数组不一定需要满足单调性。 不妨假设我们找到了条件 C 1 C_1 C 1 ​ ,它和它的 对立条件 C 2 C_2 C 2 ​ 能够将数组 a a a 一分为二,

    2024年01月19日
    浏览(51)
  • CAS自旋锁,看这一篇就够了

    前序 时隔多年,杰伦终于出了新专辑,《最伟大的作品》让我们穿越到1920年,见到了马格利特的绿苹果、大利的超现实、常玉画的大腿、莫奈的睡莲、徐志摩的诗… 他说“最伟大的作品”并不是自己的歌,而是这个世界上最伟大的艺术作品们。 为什么要写CAS自旋锁呢?最近

    2023年04月08日
    浏览(44)
  • 超图(HyperGraph)学习,看这一篇就够了

    最近事多,好久没更新了,随便写写(Ctrl+V)点 一、超图定义 通常图论中的图,一条edge只能连接2个vertex,在超图中,不限量 如何理解呢,就用我正在做的KT问题来看:7道题目-7个顶点;4种概念-4条超边,其中第1,2,3题都是考察概念1的,则构建一个包含了这仨的超边,以此类

    2024年02月02日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包