SQL之查询
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 |
- 若还想要对分组过后的结果进行筛选,在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 |
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 |
SQL之查询的更多相关文章
- Linq to SQL 语法查询(链接查询,子查询 & in操作 & join,分组统计等)
Linq to SQL 语法查询(链接查询,子查询 & in操作 & join,分组统计等) 子查询 描述:查询订单数超过5的顾客信息 查询句法: var 子查询 = from c i ...
- SQL联合查询:子表任一记录与主表联合查询
今天有网友群里提了这样一个关于SQL联合查询的需求: 一.有热心网友的方案: 二.我的方案: select * from ( select a.*,(select top 1 Id from B as ...
- SQL 提高查询效率
1.关于SQL查询效率,100w数据,查询只要1秒,与您分享: 机器情况p4: 2.4内存: 1 Gos: windows 2003数据库: ms sql server 2000目的: 查询性能测试, ...
- sql语句查询
1. sql语句查询某位数字或者某几位数字开头的数据,字段类型为数字类: %’: 2. sql搜索以4开头和含有李字的数据: select * from wlzbpre_user where real ...
- SQL联合查询(内联、左联、右联、全联)的语法(转)
最近在做一个比较复杂的业务,涉及的表较多,于是在网上找了一些sql联合查询的例子进行研究使用. 概述: 联合查询效率较高,举例子来说明联合查询:内联inner join .左联left outer j ...
- phpcmsv9自定义sql语句查询模型实现
在phpcmsv9中,自定义sql语句查询可不太好实现,传入sql语句查询很容易被内部转入生成一系列莫名其妙的sql语句,比如最佳前缀等等,直接造成sql语句查询错误,在此也提供两种解决办法,1修改底 ...
- [转]一个用户SQL慢查询分析,原因及优化
来源:http://blog.rds.aliyun.com/2014/05/23/%E4%B8%80%E4%B8%AA%E7%94%A8%E6%88%B7sql%E6%85%A2%E6%9F%A5%E ...
- 怎样用SQL语句查询一个数据库中的所有表?
怎样用SQL语句查询一个数据库中的所有表? --读取库中的所有表名 select name from sysobjects where xtype='u'--读取指定表的所有列名select nam ...
- SQL组合查询的存储过程写法
最进一个项目 里面有个查询的功能,它是进行组合查询的, 而且用的是存储过程写.写这样的存储过程,需要注意单引号的使用,请看本人下面的例子,假如你以后写的话 记得注意写就行: create proc s ...
- 通过Spark SQL关联查询两个HDFS上的文件操作
order_created.txt 订单编号 订单创建时间 -- :: -- :: -- :: -- :: -- :: order_picked.txt 订单编号 订单提取时间 -- :: ...
随机推荐
- Spring MVC文件上传下载
Spring MVC文件上传下载 单文件上传 底层是使用Apache fileupload 组件完成上传,Spring MVC对这种方式进行封装. pom.xml <dependency> ...
- 使用phpexcel导出excel和phpword导出word--简单使用
<?php namespace app\index\controller; //离线环境不能使用composer安装,只能下载包文件,然后放在vendor下,代码中require使用 requi ...
- Java设计模式之抽象工厂(02)
对工厂方法进行抽象.当增加新的产品时,不用改动工厂类.而是集成已有的工厂接口或者抽象工厂,创建新的工厂.这就是对扩展开发,对修改封闭. 1 package Pak; 2 3 public abstra ...
- knife4j 整合springboot
1.添加依赖 <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife ...
- Java课后总结2
特殊之处:有两个名称一摸一样的方法square(),但是两种方法的返回值的数据类型以及参数的数据类型都是不同的,一个为int一个为double. 运行结果:The square of integer ...
- Word06 黑客技术office真题
1.课程的讲解之前,先来对题目进行分析,首先需要在考生文件夹下,将Wrod素材.docx文件另存为Word.docx,后续操作均基于此文件,否则不得分. 2.这一步非常的简单,打开下载素材文件,在[文 ...
- threadlocal应用
public class DataSourceSelector { /** * 线程threadlocal */ private static ThreadLocal<String> db ...
- C++ 手动实现双向链表(作业版)
双向链表,并实现增删查改等功能 首先定义节点类,类成员包含当前节点的值, 指向下一个节点的指针和指向上一个节点的指针 //节点定义 template <typename T> class ...
- get 和 post 请求在缓存方面的区别
get 请求类似于查找的过程,用户获取数据,可以不用每次都与数据库连接,所以可以 使用缓存. post 不同,post 做的一般是修改和删除的工作,所以必须与数据库交互,所以不能使用 缓存.因此 ge ...
- 点击div实现选中效果
先上一份效果图.原来的checked多选框还是存在的,我只不过隐藏了,让他的整个div的范围都是可以点击的,右上角三个点是可以删除当前元素,左下角的播放按钮可以点击播放语音,主要是利用z-index把 ...