当前位置:首页 > IT技术 > 数据库 > 正文

SQL之查询
2022-04-25 23:13:54

1. SQL之模糊查询

例如查询姓名时,不用输入全名,仅仅输入其中的一部分

语法: select 列名 from 表名 where 列名 like 匹配串

其中 匹配串用英文的单引号括起来

四种匹配模式:

(1)% 匹配任意字符 (2) _ 匹配单个字符 (3)[ ] 在中括号中有多个字符,匹配其中的一个字符 (4)[ ^] 不在括号所有字符之内的单个字符

---首先,往表Dept(DeptId,DeptName)中插入数据,其中DeptId为主键和标识列,所以插入时,标识列不用手动输入
insert into Dept(DeptName)
values('部门1'),('部门2'),('部门3'),('部门4')--采用批量插入
---此时表格如图:

--1.% 匹配任意字符  
------三种形式:  '%ab%' 包含于   '%ab'以某字符/字符串结尾   'ab%'以某字符/字符串开头
select* from Dept where DeptName like '%1%'
select* from Dept where DeptName like '部门%'

--2.  _  匹配单个字符 :常用来限制表达式的字符长度
select* from Dept where DeptName like '部_4%'

--3. [ ] 在中括号中有多个字符,匹配其中的一个字符 字符可以全部写出,也可以写一个起点和终点,中间用横线连接,标识范围
select* from Dept where DeptName like '部门[123]%'
select* from Dept where DeptName like '部门[1-3]%'

--4. [^] 不在括号所有字符之内的单个字符
select* from Dept where DeptName like '部门[^123]%'
select* from Dept where DeptName like '部门[^1-3]%'

2. SQL之范围查询

 
---1. 通过 where子句的条件指定查询的范围
---(1)比较运算符
select * from Dept 
where DeptId<=5  
---(2)in  和 not in
select * from Dept 
where DeptId in (2,3,4)  

select * from Dept 
where DeptId not in (2,3,4)  

---后面跟子查询
select * from Dept 
where DeptId in (select DeptId from Dept where DeptId<5 ) 

---(3)between and 等价于 >= and <=
select * from Dept 
where DeptId  between 2 and 5 

---2. 查询前面多少条,或者 百分比
----(1)查询表的前面10行
select top 10 * from Dept
----(2) 查询表的前面占比整张表总行数的50%行
select top 50 percent * from Dept

3. 聚合函数

(1)对一组值执行计算并返回单一的值

---------已知在Dept表中共有8条记录(行)
select count(*) from Dept---结果8

select count(1) from Dept---结果8
--因为表中没有列名为1的,所以count(1) 是伪造列,我们统计总记录数用count(1) ,比count(*)效率高

结果如图:

无列名
1 8

(2)5种聚合函数

count(列名) 统计一列中值的个数

sum(列名) 统计一列中值的和

avg(列名) 统计一列中值的平均

max(列名) 统计一列中值的 最大值

min(列名) 统计一列中值的 最小值

---------已知在Dept表中共有8条记录(行)

select sum(DeptId) from Dept ---36

select avg(DeptId) from Dept ---4

select max(DeptId) from Dept ---8

select min(DeptId) from Dept ---1

4. 分组查询

group by 与聚合函数联合使用,根据一个列或者多个列对查询结果集合进行分组。

select ....where....group by ...order by...

---往表Stu(UserId,UserName,UserPwd,CreateTime,DeptId,Age)中插入数据,批量插入数据;其中UserId是主键和标识列,无需手动插入
insert into Stu
values('dio','abc',getdate(),1,11),
('xiao','abc',getdate(),1,11),
('xili','ab',getdate(),2,15),
('liao','ac',getdate(),3,18),
('aa','abcd',getdate(),2,19),
('bb','abcde',getdate(),4,22),
('cc','abcef',getdate(),1,13)

---查询每一个部门下有多少个用户???
select DeptId ,count(1)用户数            ----此处可用count(UserId)
from  Stu
group by DeptId

结果如下图:

DeptId 用户数
1 1 3
2 2 2
3 3 1
4 4 1
  1. 若还想要对分组过后的结果进行筛选,在group by 语句后面加上 having
select DeptId ,count(UserId)用户数
from  Stu
where Age<=18
group by DeptId
having DeptId>1
DeptId 用户数
1 2 1
2 3 1
  1. order by 语句对结果按照某一列或多列进行排序显示

    select DeptId ,count(UserId)用户数
    from  Stu
    group by DeptId
    having DeptId>1
    ------order by Age desc  此处报错:ORDER BY 子句中的列 "Stu.Age" 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。
    order by DeptId desc
    

    强调:select后面出现的列名,必须包含在group by之后,或者包含在聚合函数之中

DeptId 用户数
1 4 1
2 3 1
3 2 2

5. 连接查询

连接查询就是根据两个或多个表之间的关系,从这些表中查询数据。实现多表查询;

分为内连接,外连接,全连接,交叉连接

1. 内连接 :

(1)使用比较运算符 = > >= < <= <> 进行表间的比较,查询与条件相匹配的数据。

(2)多数使用等值连接 = 其余的称作非等值连接

(3)结果:相匹配的数据查询出来,若没有匹配上,就没有结果

(4) 显式写法: inner join 表名 on 连接条件 ; 隐式写法:from 表名1,表名2 where ...

表Stu:

UserId UserName UserPwd CreateTime DeptId Age
1 dio abc 2022-04-19 15:22:47.100 1 11
2 xiao abc 2022-04-19 15:22:47.100 1 11
3 xili ab 2022-04-19 15:22:47.100 2 15
4 liao ac 2022-04-19 15:22:47.100 3 18
5 aa abcd 2022-04-19 15:22:47.100 2 19
6 bb abcde 2022-04-19 15:22:47.100 4 22
7 cc abcef 2022-04-19 15:22:47.100 1 13

表Dept :

DeptId DeptName
1 部门1
2 部门2
3 部门3
4 部门4
5 部门1
6 部门2
7 部门3
8 部门4
--表  Stu(UserId,UserName,UserPwd,CreateTime,DeptId,Age) 和 表 Dept(DeptId,DeptName)建立联系
select UserId,UserName,u.DeptId,DeptName
from Stu u ---给表起别名
inner join Dept d on u.DeptId = d.DeptId----等值连接
where Age>18
---先建立连接,再写where条件语句!!!

-- DeptId在两个表中都有,DeptId是Stu的外键,是表Dept是主键,实现了关联
--我们也可以在上述的on后面人为地建立关联条件

---上述写法称为显式写法,还可以隐式写法:(比较多地使用!!!!!)
select UserId,UserName,u.DeptId,DeptName
from Stu u , Dept d  
where u.DeptId = d.DeptId and Age>18

结果如下表:

UserId UserName DeptId DeptName
1 5 aa 2 部门2
2 6 bb 4 部门4

2. 外连接

(1)分类:左外连接(左连接),右外连接(右连接),全外连接(全连接)

(1)左连接 : 左表 left join 右表 on 关联条件

返回左表的所有行,右表有的列若没有匹配上,右表这个列值在左表的显示出null

select *
from Dept d  left join Stu u on  u.DeptId = d.DeptId
--左表是Dept 右表Stu 
DeptId DeptName UserId UserName UserPwd CreateTime DeptId Age
1 1 部门1 1 dio abc 2022-04-19 15:22:47.100 1 11
2 1 部门1 2 xiao abc 2022-04-19 15:22:47.100 1 11
3 1 部门1 3 xili ab 2022-04-19 15:22:47.100 2 15
4 2 部门2 4 liao ac 2022-04-19 15:22:47.100 3 18
5 2 部门2 5 aa abcd 2022-04-19 15:22:47.100 2 19
6 3 部门3 6 bb abcde 2022-04-19 15:22:47.100 4 22
7 4 部门4 7 cc abcef 2022-04-19 15:22:47.100 1 13
8 5 部门5 NILL NILL NILL NILL NILL NILL
9 6 部门6 NILL NILL NILL NILL NILL NILL
10 7 部门7 NILL NILL NILL NILL NILL NILL
11 8 部门8 NILL NILL NILL NILL NILL NILL

(2)右连接 : 左表 right join 右表 on 关联条件

返回右表的所有行,左表有的列若没有匹配上,左表这个列值在右表的显示出null

select *
from Dept d  right join Stu u on  u.DeptId = d.DeptId
--左表是Dept 右表Stu  返回右表中的所有行
DeptId DeptName UserId UserName UserPwd CreateTime DeptId Age
1 1 部门1 1 dio abc 2022-04-19 15:22:47.100 1 11
2 1 部门1 2 xiao abc 2022-04-19 15:22:47.100 1 11
3 1 部门1 3 xili ab 2022-04-19 15:22:47.100 2 15
4 2 部门2 4 liao ac 2022-04-19 15:22:47.100 3 18
5 2 部门2 5 aa abcd 2022-04-19 15:22:47.100 2 19
6 3 部门3 6 bb abcde 2022-04-19 15:22:47.100 4 22
7 4 部门4 7 cc abcef 2022-04-19 15:22:47.100 1 13

(3) 全连接 full join

返回左表和右表中的所有行,当某一行在另一个表中没有匹配,则另一个表中的列写null

select *
from Stu u 
full join Dept d on  u.DeptId = d.DeptId

3. 交叉连接 cross join

也称笛卡尔积 ,若不带where 子句时,返回被连接的行数是两个表的行数之积, 就是两个表的笛卡尔积

select *
from Stu u 
cross join Dept d  ---返回7*8=56 行

若带where 子句时,就等价于内连接

select *
from Stu u /
cross join Dept d    
where u.DeptId = d.DeptId
DeptId DeptName UserId UserName UserPwd CreateTime DeptId Age
1 1 部门1 1 dio abc 2022-04-19 15:22:47.100 1 11
2 1 部门1 2 xiao abc 2022-04-19 15:22:47.100 1 11
3 1 部门1 3 xili ab 2022-04-19 15:22:47.100 2 15
4 2 部门2 4 liao ac 2022-04-19 15:22:47.100 3 18
5 2 部门2 5 aa abcd 2022-04-19 15:22:47.100 2 19
6 3 部门3 6 bb abcde 2022-04-19 15:22:47.100 4 22
7 4 部门4 7 cc abcef 2022-04-19 15:22:47.100 1 13

本文摘自 :https://www.cnblogs.com/

开通会员,享受整站包年服务立即开通 >