DQL(查询语句)

news/2025/3/16 14:53:17/文章来源:https://www.cnblogs.com/vvyyds/p/18353496

简单查询

查询一个字段

select 字段名 from 表名;

查询多个字段

select 字段名1,字段名2,...,字段名  from 表名;

查询全部字段

①在查询多个字段中,将所有的字段名写入

②select * from 表名;————效率低,可读性差,因为将星号转化为所有字段名需要耗费一定时间,所以在实际开发中不建议使用

给查询的列起别名

select 字段名 as/空格 别名 from 表名;

对于别名中带有空格的,或者别名是中文的,要用单引号或者双引号将别名引起来

PS:只是将显示的查询结果列名显示为别名,不修改原表的列名(select永远只有查询的功能,没有修改的功能)

在所有的数据库中,字符串统一使用单一号括起来,双引号在oracle中用不了,但是在mysql中能用

字段进行数学运算

select 字段名  数学运算式

比如 select sal *12 as ‘年薪’ from 表名

条件查询

定义

不是将表中的所有数据都查出来,而是查询出来符合条件的

格式:select ... from 表名 where 条件;

条件符号

= 等于

<>或者!= 不等于

< 小于

<= 小于等于

> 大于

>= 大于等于

between ... and ... 两个值之间,等同于 >= and <=

is null   用来查询值为空,写 = null 查不出来

is not null  查询不为空的

and 并且

or 或者

in 包含,相当于多个or(not in 不在这个范围  内)———— select device_id,gender,age,university,gpa from user_profile where university in ("复旦大学","山东大学","北京大学");

not not可以取非,主要用在is 或者in 中

and和or的优先级问题

and的优先级大于or的

如果想写 A>10,且B>10或者B<5

select 字段名 from 表名 where  A>10 and B>10 or B<5   意思为,A>10且B>10,或者B<5的,将前边两个条件结合在了一起

正确写法为:select 字段名 from 表名 where  A>10 and (B>10 or B<5)

将or的条件用括号括起来

如果在开发中不确定优先级,加小括号就行了

in的用法

in不是一个区间,in相当于多个or

select 字段名 from 表名 where A in(4,6,9)

表示表中A=4或者A=6或者A=9的个例

not in即,不是这几个值的,相当于 != or != or !=

模糊查询

模糊符号

like like称为模糊查询,支持%或下划线匹配

%  匹配任意个字符

下划线  一个下划线只匹配一个字符

例子

找出名字中含有o的  select name from 表名 where name like ‘%o%’

找出名字中以k结尾的  select name from 表名 where name like ‘%k’

找出名字中以z开头的  select name from 表名 where name like ‘z%’

找出名字中第二个字母是A的  select name from 表名 where name like ‘_A%’

找出名字中第三个字母是R的  select name from 表名 where name like ‘__R%’

找出名字中有下划线的  select name from 表名 where name like ‘%\_%’    用转义字符即可,将mysql符号下划线变为字符下划线

排序

order by 关键字

单条件排序

比如 select name,id from 表名 order by id  默认是升序,例子中是将id升序查询出

降序要在by 表头后加desc,比如 select name,id from 表名 order by id desc,即可将id降序排列查出

除了默认的升序,也可以在by 表头后加上asc,即升序排列,比如select name,id from 表名 order by id asc

多条件排序

比如,按照A升序排序,如果A相同,则按照B的升序排序

select 字段名 from 表名 order by A asc,B asc;

A在前,起主导作用,如果A相同,才会启用B升序排序

根据字段的位置进行排序

select 字段名 from 表名 order by 2;

即按照表的第二列进行升序(默认是升序)排序

因为列的顺序可能会变化,所以不建议在开发中不建议这么写,只是有这个写法了解即可

条件和排序综合

select ... from ... where ... order by ...;

顺序不能变

排序总是在最后

数据处理函数

定义

数据处理函数又被称为单行处理函数

一个输入对应一个输出

与其相对的是多行处理函数(多个输入对应一个输出)

函数

lower 转换小写

upper 转换大写

substr 取子串(substr(被截取的字符串,起始下标,截取的长度))  ————比如select substr(zhaopian,5,3) as daxie from weixiugong;  是从第5个字符开始,往后取三个字符

                      查询首字母为A的姓名     select name from 表名 where substr(name,1,1) = 'A'  ,等同于  select name from 表名 where name like ‘A%’

length 取长度——————length(字段名)

concat  字符串拼接——————concat(‘a’,‘b’),返回ab

trim 去空格

str_to_date 将字符串转换成日期

date_format 格式化日期

format 设置千分位

round 四舍五入——————round(字段名,四舍五入保留几位小数) 负数就往前继续数位数然后四舍五入

rand() 生成随机数

ifnull 可以将null转换成一个具体值——————ifnull(字段名,将null转换为几进行处理)

case..when..then..else..end 类似于if——else

SELECTSTUDENT_NAME,(CASE WHEN score < 60 THEN '不及格'WHEN score >= 60 AND score < 80 THEN '及格'WHEN score >= 80 THEN '优秀'ELSE '异常' END) AS REMARK
FROMTABLE

分组函数(多行处理函数)

定义

输入多行,输出一行

分组函数在使用的时候必须先进行分组,然后才能用

如果没分组,整张表默认为一组

分组函数不能够直接使用在where子句中

函数

其实都不会将NULL计入

count 计数    ————NULL不计入

sum 求和     ————NULL不计入

avg 平均值    ————NULL不计入分母

max 最大值

min 最小值

分组查询

定义

在实际应用中,可能有需求,需要先进行分组,再对每一组数据进行操作

格式:select from group by

执行顺序

select ... from ... group by ... order by ...  ————执行顺序为from,where,group by,select,order by

因为select在执行时候,group by,即分组函数已经分完组了,而select xx from xx where xx>xx(max)这种,不可用,因为在执行where时还没有分组,但是在where中用到了分组函数

在一条select语句当中,如果有group by语句的话,select 后面只能跟:参加分组的字段,以及分组函数,其它的一律不能跟。————在oracle中严格这个标准,其他报错

执行顺序2

from——where——group by——having——select——order by

PS 

比如,寻找每个部门,不同职位的最高薪资

select deptno,job,max(sal)from emp group by deptho,job

这样是先按部门分组,在同一个部门中,再按职位分组

having

having 对select,查询完之后的数据可以进一步过滤

 having 和 where优先选择where,除非where实在做不了的, 比如,大于小于平均薪资

distinct

去重作用

格式:select distanct 字段... from ... ;

只能放到select 后边,表名的前边

比如select distinct xx,xx,xx...

而select xx,distinct xx ...会报错

但是可以 select count(distinct xx,xx,xx...) from...

连接查询(多表查询)

定义

从一张表单独查询叫单表查询

从多个表中联合起来查询是连接查询,从一个表中取A属性,从另一个表取B属性

分类

根据语法的年代分类:SQL92,1992年时候出现的语法

          SQL99,1999年出现的语法

          下面是SQL99的学习

根据表连接的方式分类:内连接,又分为等值连接,非等值连接,自连接————完成能够匹配上条件的数据,多张表之间没有主次关系

           外连接,又分为左外连接,右外连接————将一张表看作主表,将此表的数据全部查询出来,捎带着关联查询另一个表,有主次关系

           全连接

笛卡尔积现象

定义

当两张表进行连接查询时,没有任何条件的限制会发生的现象

最终查询结果条数,是两张表条数的乘积,这种现象叫笛卡尔积现象

匹配模式

将A表的一条记录,遍历B表另一条记录,相当于for循环的两层遍历

加上筛选条件后,匹配次数不变,仍然是两层遍历

如何避免

连接时加条件,满足这个条件的记录会被筛选出来

select a,b from A,B where A.a = B.b ;

内连接

语法

SQL92语法:select A.a,B.b from A ,B where A.a = B.b and 其他条件

缺点:结构不清晰,表的连接条件和后期进一步筛选的条件,都放到了where后面

SQL99语法:select A.a,B.b from A  join B on A.a = B.b where 其他条件

优点:表连接的条件的独立的,放在on后边,如果需要进一步的筛选,再在后边加where

PS

在join的前边有个隐藏的inner,inner代表内连接

内连接之自连接

将某一个表,改两个别名,使其可以看成两个相同的表,然后再进行内连接

外连接

语法

right outer join 右外连接

left outer join 左外连接

select A.a,B.b from A   left/right  join B on A.a = B.b;

outer同样可以省略——right join,left join,区分内外连接看是否有l eft或right

PS

主表全部打印,次表按条件打印,没有则为NULL

两张以上的表怎么连接

select ...

from a

join b

on  a和b的连接条件

 

join c

on  a和c的连接条件

join d

on  a和d的连接条件

PS:一条sql语句中,内连接和外连接可以混合,都可以出现

子查询

定义

select 语句中嵌套select语句,被嵌套的select语句称为子查询

可以出现的位置

select ..(select) ..

from ..(select)..

where ..(select)..

where中的子查询

 比如查询某字段大于其最小值的,如果先查询最小值,再查询大于最小值的,就分成两句了 ,所以可以在where中写  where sal>(select min(sal) from xx);

from中的子查询

将子查询的查询结果当作一张临时表,再从表中查

select中的子查询

了解即可

一般可以替换为连接查询

union

定义

用来连接多个表,比如select ... union select ...,就将两次查询的结果连接成了一个表

优点

union的效率高,对于表连接来说,每连接一次新表,则匹配的次数满足笛卡尔积,但是union可以减少匹配的次数,在匹配次数的情况下,还可以完成两个结果集的拼接。

PS

union在进行结果合并时,要求两个结果集的列数相同

在MySQL中,列和列的数据类型不要求相同,但是Oracle严格要求

limit

定义

将查询结果集的一部分取出来,通常使用在分页查询

顺序

写在order by(排序)的后边,在order by之后执行,也就是,先排序,再取出前k个

格式

limit k,取出结果中前k个数据

limit m,n,从第m条开始,取n条数据,长度为n—————下标从0开始

分页

举例:每页显示3条记录

第1页:limit 0,3

第2页:limit 3,3

第3页:limit 6,3

第4页:limit 9,3

那么,每页显示pageSiz e条记录

第pageNo页:limit (pageNo-1) × pageSize,pageSize

总结

select ...

from ...

where ...

group by ...

having ...

order by ...

limit ...

执行顺序为,from——where——group by——having——select——order by——limit

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/899805.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PTA

​ 题目描述 小轿车中有一个系统随时监测四个车轮的胎压,如果四轮胎压不是很平衡,则可能对行车造成严重的影响。让我们把四个车轮 —— 左前轮、右前轮、右后轮、左后轮 —— 顺次编号为 1、2、3、4。本题就请你编写一个监测程序,随时监测四轮的胎压,并给出正确的报警信息。…

第二章

TempStr = input("请输入带有符号的温度值:") if isinstance(TempStr, str) and TempStr[-1] in [F, f]:C = int((float(TempStr[0:-1]) - 32) / 1.8)print(f"转换后的温度是{C}C") elif isinstance(TempStr, str) and TempStr[-1] in [C, c]:F = int(1.8…

window11家庭版 WSL上安装CentOS7

环境 Windows11家庭版 1. 安装WSL配置 1.1 Win命令模式开启虚拟化步骤点击查看代码 # 启用适用于 Linux 的 Windows 子系统:打开powershell并输入: dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart# 启用虚拟化:以管理员打…

探秘Transformer系列之(14)--- 残差网络和归一化

从零开始解析Transformer,目标是:(1) 解析Transformer如何运作,以及为何如此运作,让新同学可以入门;(2) 力争融入一些比较新的或者有特色的论文或者理念,让老鸟也可以有所收获。探秘Transformer系列之(14)--- 残差网络和归一化 目录探秘Transformer系列之(14)--- 残差…

省选联考2024游记

搬运自 洛谷博客 ,文章写于 2024.03.05“总有地上的生灵,敢于直面雷霆的威光。”全文共1169字。 Day -105 2023/11/18 noip考完人就崩了,第二题甚至都没写出正解,只有压线省一,大哭。 也基本注定这回是进不了省队了。 Day -5 2024/2/26 周一 开始停课 Day -4 2024/2/27 周…

day30 正则三剑客---awk

awk是什么 再谈三剑客grep,擅长单纯的查找或匹配文本内容 sed,更适合编辑、处理匹配到的文本内容 awk,更适合格式化文本内容,对文本进行复杂处理后、更友好的显示三个命令称之为Linux的三剑客 awk学完后的能力 以下部分内容需要结合shell编程对文本行数据提取数据字段 模式…

树上查分学习笔记+做题记录

树上查分 点的查分求路径 \(u-v\) 上的点被经过的次数. \(cnt[x]\) 表示点 \(x\) 被经过的次数. 核心代码:cnt[u]++; cnt[v]++; cnt[lca(u,v)]--; cnt[father[lca(u,v)]]--;A. 运输压力解法 树上查分板子题啊 #include <bits/stdc++.h> using namespace std; const int N…

ActAgent开发之基于http请求引用链路模版发起对话

下载deepeek 首先本地安装ollama,这是一款支持mac,windows和linus系统的大模型管理工具。下载好后打开终端,执行命令ollama pull deepseek-r1:7b,可以在网上找想要下载的开源大模型,我这里下载的是deepseek-r1的7b模型。执行完后可以用ollama list查看是否下载成功,然后可…

缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)

说在前面 在40岁老架构师 尼恩的读者交流群(50+)中,最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的redis一致性面试题,类似如下:如何保障 MySQL 和 Redis 的数据一致性? 如何保障 MySQL 和 Cache 的数据一…

牛逼,这款开源聊天应用竟能一键召唤多个AI助手,跨平台通话神器!

`JiwuChat`是一款基于Tauri2和Nuxt3构建的轻量化多平台即时通讯工具,仅约8MB体积却集成了**AI群聊机器人**、**WebRTC音视频通话**、**屏幕共享**等前沿功能。一套代码适配Windows/macOS/Linux/Android/iOS/Web六大平台,堪称开发者学习跨端开发的绝佳样板!嗨,大家好,我是小…

day29_正则三剑客--sed

关于学正则单个正则字符还认识组合到一起就晕了,怎么办?本质还是对单个字符没理解.认识*认识.*组合到就一起就蒙了,为什么?还是没想明白.的意义,*的意义正则表达式,从左向右,逐步理解单个字符的意义怎么做? 1.思维脑图写没写? 2.每一个正则表达式的符号,自己有没有动…