SQL之查询

article/2025/10/23 0:18:13

因为同一SQL语句,不同厂商有不同的实现方式,因此同一SQL语句不一定在所有的数据库编辑器上能够正确运行,这里采用的是华为的openGauss。

基本格式为:

SELECT	desired attributes
FROM	one or more tables
WHERE	condition about tuples of the tables

数据库的表格示例如下:

Beers(name, manf)

Bars(name, addr, license)

Drinkers(name, addr, phone)

Likes(drinker, beer)

Sells(bar, beer, price)

Frequents(drinker, bar)

如:找出HardRock酒吧卖的Bud啤酒的价格

SELECT price
FROM Sells
WHERE bar = 'HardRock' AND beer = 'Bud';

1.LIKE匹配

<Attribute> LIKE <pattern> or <Attribute> NOT LIKE <pattern>

其中pattern有

% = “any string”
_ = “any character.”

如:查询位于上海的酒吧

SELECT name
FROM Bars
WHERE addr LIKE '%上海%';

如:查询啤酒名为两个字符的啤酒

SELECT *
FROM Beers
WHERE name LIKE '__';

2.查询NULL值

对于数据库中某些值可能没有赋值,则默认为NULL,如果要查询出这些NULL值,则

如:查询喝啤酒的人的地址为NULL的人

SELECT *
FROM Drinkers
WHERE addr is NULL;

注:任何值与NULL值相比较结果都是UNKNOWN

3.查询结果排序

排序用到ORDER BY,升序asc,降序desc,默认为升序。

如:查询3DArtBar酒吧,按照价格的降序排列

SELECT *
FROM Sells
WHERE bar='3DArtBar'
ORDER BY price DESC;  --结果按照价格降序排列

注:可以按照多个属性进行排列,即首先根据第一个属性进行排列,第一个属性一样,则按照第二个属性进行排列,以此类推。

4.逻辑与或非

1.查询Lynn Conway喜欢的啤酒并且价格大于40的啤酒

(SELECT beer FROM Likes
WHERE drinker='Lynn Conway')
INTERSECT  --与操作
(SELECT beer FROM Sells
WHERE price>40);

2.查询Lynn Conway喜欢的啤酒或价格大于40的啤酒

(SELECT beer FROM Likes
WHERE drinker='Lynn Conway')
UNION  --或操作
(SELECT beer FROM Sells
WHERE price>40);

3.查询Lynn Conway喜欢的啤酒并且价格大于40的啤酒

(SELECT beer FROM Likes
WHERE drinker='Lynn Conway')
EXCEPT  --非操作
(SELECT beer FROM Sells
WHERE price<=40);

5.子查询

如:查询被至少一个经常光顾HardRock酒吧的人喜欢的啤酒

SELECT beer
FROM Likes, (SELECT drinkerFROM FrequentsWHERE bar = 'HardRock')HD  --HD即为一个子查询
WHERE Likes.drinker = HD.drinker;

子查询除了可以放在FROM语句中,也可以放在WHERE语句中

如:查询卖Bud啤酒并且啤酒价格等于3DArtBar酒吧卖的嘉士伯啤酒的价格的酒吧

SELECT bar
FROM Sells
WHERE beer = 'Bud' ANDprice = (SELECT priceFROM SellsWHERE bar = '3DArtBar'AND beer = '嘉士伯');

6.IN

基本格式:

<tuple> IN (<subquery>)
--相反操作
<tuple> NOT IN (<subquery>)

IN语句用在WHERE语句中

如:查询Tony Hoare喜欢的啤酒的生产商

SELECT * FROM Beers
WHERE name IN (SELECT beerFROM LikesWHERE drinker = 'Tony Hoare');

区别

SELECT a
FROM R, S
WHERE R.b = S.b;SELECT a
FROM R
WHERE b IN (SELECT b FROM S);

针对以上两种查询语句的区别:查询结果都是正确的,能够得到相同的结果;主要是查询的过程的不同,第一种方式的过程为首先从R中取出一个b属性的值,然后从S中依次遍历S中的b,判断是否相等,里面共有两层循环;第二种方式的过程为首先将S中的所有b取出来构成一个元组,然后从R中取出一个b属性的值,再判断从R取出的那个b是否与这个元组中的某一个值相等,里面只有一层循环。因此第二种的效率更高一点。

7.EXISTS

基本格式为:

EXISTS(<subquery>)
--相反操作
NOT EXISTS(<subquery>)

如:查询Tony Hoare喜欢的啤酒名及其生产商

SELECT * FROM Beers
WHERE EXISTS (SELECT * FROM LikesWHERE drinker = 'Tony Hoare' AND Likes.beer = Beers.name);

注意:EXISTS后跟的子查询中的SELECT语句中要查询的内容可以任意,即上例中的*号可改成drinker或者beer,都没问题,因为子查询返回的是一个bool值,即True或False。

8.ANY

基本格式为:

x = ANY(<subquery>)

如:查询和另一种啤酒在同一酒吧卖出的价格一样的啤酒

SELECT bar, beer, price FROM Sells S
WHERE price = ANY (SELECT price FROM SellsWHERE S.beer <> beer AND S.bar= bar);

注意:IN和ANY可以等价。

9.ALL

基本格式为:

x <> ALL(<subquery>)

如:查询售价最高的啤酒

SELECT beer
FROM Sells
WHERE price >= ALL(SELECT price FROM Sells);

10.DISTINCT去重

因为正常的SQL查询操作的查询结果都有可能会导致一个信息出现多次,如下列操作,假设有3中以上的啤酒价格是一样的,则该价格会重复出现。

SELECT price
FROM Sells;

这是因为为了提高查询的效率,SQL默认只把符合条件的信息提取出来,而不进行去重操作,如果需要去重可以加上DISTINCT关键字。

SELECT DISTINCT price
FROM Sells;

11.JOIN

1.自然连接(natural join)

自然连接将表中具有相同名称的列自动进行匹配,自然连接不必指定任何同等连接条件也不能认为指定哪些列需要被匹配,自然连接得到的结果表中,两表中名称相同的列只出现一次。

SELECT * 
FROM Likes NATURAL JOIN Sells;

总共显示4列,相同的一列为beer。以下使用openGauss实现

在这里插入图片描述

2.内连接(inner join)

内连接查询能将左表和右表中能关联起来的数据连接后返回,返回的结果就是两个表中所有相匹配的数据。

SELECT * 
FROM Likes INNER JOIN sells ON likes.beer = sells.beer;

在这里插入图片描述

3.外连接(outer join)

内连接是要显示两张表的内存,而外连接不要求如此,外连接可以依据连接表保留左表,右表或全部表的行为而分为左外连接右外连接和全连接。

select * from TableA as A left(right/full) join TableB as B on A.PA = B.PK;

在这里插入图片描述

4.交叉连接(cross join)

又称笛卡尔连接,交叉连接返回两个集合的笛卡尔积。

SELECT * 
FROM Likes CROSS JOIN Sells;

总共显示5列。如下图所示,行显示的是21*50=1050行,列显示的是2+3=5列。

在这里插入图片描述

12.聚合函数

聚合函数有SUM、AVG、COUNT、MAX、MIN等。

1.MAX()

如:找出价格最高的啤酒

SELECT MAX(price)
FROM Sells;

2.MIN()

使用方法同上

3.AVG()

如:找出Bud啤酒的平均价格

SELECT AVG(price)
FROM Sells
WHERE beer = 'Bud';

4.COUNT()

如:查询在上海的酒吧数量

SELECT COUNT(*) 	--Bar
FROM Bars
WHERE addr LIKE '%上海%';

如:查询Bud啤酒不同价格的数量

SELECT COUNT(DISTINCT price)
FROM Sells
WHERE beer = 'Bud';

13.GROUP BY

如:查询每一种啤酒的平均价格

SELECT beer, AVG(price)
FROM Sells
GROUP BY beer;

注意:如上例所示,SELECT语句中price用了聚合函数,而beer没有用,因此必须对beer进行GROUP BY,否则会报错,即如果SELECT语句中有一个元素使用了聚合函数,则SELECT中的其他元素要么也用聚合函数,要么就放入GROUP BY语句中;上例的实现为首先对beer进行分类,然后再对每个类别中的price求平均。

HAVING

HAVING语句用在GROUP BY后面,实现对数据的筛选。

如:查询生产商为嘉士伯或者被至少三个酒吧销售的啤酒的平均价格

SELECT beer, AVG(price)
FROM Sells
GROUP BY beer
HAVING COUNT(bar) >= 3 
OR beer IN (SELECT nameFROM BeersWHERE manf = '嘉士伯');

HAVING和WHERE的区别

作用对象不同:WHERE语句作用于表和视图;而HAVING作用于组

作用时间不同:WHERE在分组和聚集计算之前选取输入行,即它控制了哪些行进行聚集计算;而HAVING在分组和聚集计算之后选取分组的行。因此WHERE语句不能包含聚合函数,而HAVING一般总是包含聚合函数(因为如果HAVING语句中不用聚合函数,那就和WHERE函数没有区别)。


http://chatgpt.dhexx.cn/article/JKIKRYBt.shtml

相关文章

SQL查询与操作

1.单表查询 SQL 数据查询主要由 SELECT 语句完成&#xff0c;SELECT 语句是SQL 的核心。单表查询就是利用 SELECT语句仅从一个表/视图中查询数据。其语法如下: SELECT [DISTINCT]*{ 字段名 1&#xff0c;字段名 2&#xff0c; 字段名 3,… FROM 表名 [WHERE 条件表达式 1] [GR…

sql的查询

sql的查询 &#xff08;1&#xff09;什么是排序 order by&#xff08;2&#xff09;如何排序 》》数据库的查询(排序:order by) SELECT * FROM 表名 ORDER BY 排序字段 ASC(升序)|DESC(降序);&#xff08;3&#xff09;特点 指定列 指定升序或者降序 order by 排序只对数字和…

SQL 数据查询

前言&#xff0c;数据库中有5个表&#xff0c;student&#xff0c;sc,course,tc,teacher;(sql server里面不区分大小写) student sc tc course teacher 1. 查询软件工程学院&#xff08;SE&#xff09;学生的学…

SQL数据查询

目录 1、求各系学生的平均成绩&#xff0c;并把结果存入新建的数据库表中&#xff08;请自己创建一个表存放结果&#xff09; 2、统计每门课程的选修学生人数及各门课程的平均成绩 3、找出各系年龄最大的学生&#xff0c;显示其学号、姓名&#xff1b;&#xff08;利用相关子…

数据库:SQL数据查询(详细、全面)

以下题目中加粗字体为重点哦~ 一、查询指定列、全部列 1.查询全体学生的学号和姓名 SELECT SNO, SN FROM S 2.查询全部列 SELECT * FROM S 二、查询经过计算的值 3. 查询全体学生的姓名、出生年份 SELECT SN, 2020-AGE FROM S 4. 查村全体学生的姓名、出生年份和系名&#xff…

2022留学生落户上海成本大概是怎样的?

现在留学生落户上海整体来说除了对于社保没有要求的落户方式&#xff0c;那么对于普通的留学生落户来说&#xff0c;就得有社保和个税的要求了&#xff0c;那么这里面的成本是有多少呢&#xff0c;下面来看看这里面的情况&#xff1a; 留学生落户上海根据判断自己的社保基数及累…

非上海户籍人员在上海买房需要啥条件?

和你一起终身学习&#xff0c;这里是程序员Android 非沪籍想在上海买房说实话有点难&#xff0c;毕竟每平米大几万的房价不是盖的&#xff0c;既然您点进来看了&#xff0c;说明你有这个想法&#xff0c;有想法就行&#xff0c;虽然我们不一定能买得起&#xff0c;但不能阻挡我…

上海落户计算机水平毕业研究生,2021上海积分落户应届毕业生直接落户上海

原标题&#xff1a;2021上海积分落户应届毕业生直接落户上海 ——上海落户积分120分&#xff0c;不是研究生毕业就有100分吗&#xff1f;研究生毕业就有100分&#xff0c;正常读书年龄肯定很小就有30分了啊&#xff0c;不是直接就可以落户了吗&#xff1f;为什么大家都在说很难…

上海居住证转户口证攻略

2019独角兽企业重金招聘Python工程师标准>>> 一、居转户条件&#xff1a; 1.居住证满7年&#xff0c;社保满7年&#xff0c;税单满7年 2.最近3年连续社保是上海平均值2倍以上&#xff08;或者具备中级以上职称&#xff09; 3.自有产权房 二、居转户材料&#x…

2019非上海生源高校应届生落户指南

流程 一、计算积分基本要素导向要素用人单位要素 二、准备申请材料三、审核--证明信四、证明信-个人户口本落户社区公共户落户家庭户或者单位集体户口落户家庭户落户单位集体户口 博主从五月份准备落户申请材料&#xff0c;到十月中旬拿到上海个人户口本&#xff0c;历时五个月…

上海程序员落户攻略

上海居住证落户简称 “居转户” &#xff0c; 本文主要写给在上海打拼的程序员们&#xff0c;告诉大家比写代码更重要的一件事情是落户。讲述一些关于上海居住证落户的一些政策和一些建议。 很多人以为居转户&#xff0c;只要上海居住证满7年就可以转了&#xff0c;殊不知&…

上海落户计算机水平毕业研究生,2020年上海落户有哪些新规定?附研究生落户分值表!...

相信对于不少的年轻人来说&#xff0c;上海都是他们向往的城市&#xff0c;很多毕业生都在毕业后都希望可以留在上海&#xff0c;如果能够落户就再好不过了。下面小编就给大家说说2020年上海落户有哪些新规定&#xff0c;研究生如何落户&#xff0c;想了解的快来看看吧。 一、2…

2017年上海最新落户政策重磅出炉!你达标了吗?(明年就毕业了希望一切顺利)

2017年最新非上海户籍的应届毕业生落户标准公布&#xff0c; 应届毕业生落户标准分为72分&#xff01; 具体申请可根据2017《上海市居住证》和 居住证积分指南、申请本市户籍办法。 想想当初选择来魔都读书生活&#xff0c; 每天起早贪黑究竟为了什么&#xff1f; 很多人的“小…

【个人亲历】上海市人才引进落户最详细的流程记录说明

目录 一、材料准备 二、网上审核 2.1、预审上报 2.2、线下提供证明材料 2.3、初审、审核 2.4、公示 三、落户证明领取和准迁证查询 3.1、线下领取落户证明 3.2、准迁证查询 附&#xff1a;应用汇总&#xff1a; 从2022年6月领导通知我够资格人才引进落户以及2022…

2022留学生落户上海怎么办理社区公共户?

很多留学生会担心的一个问题是个人和直系亲属在沪无房产&#xff0c;且单位也无集体户怎么办呢? 其实无须担心&#xff0c;这种情况下可以按公安机关规定申请挂靠 社区公共户!简单而言 &#xff0c;就是租房在哪&#xff0c;就落户在相应的派出所。 落户通过后&#xff0c;留…

重磅!上海出落户新政:双一流应届硕士可直接落户!

点击上方“3D视觉工坊”&#xff0c;选择“星标” 干货第一时间送达 编辑丨科研大匠 9月23日&#xff0c;据上海学生就业创业服务网&#xff0c;上海市高校招生和就业工作联席会议制定的《2020年非上海生源应届普通高校毕业生进沪就业申请本市户籍评分办法》&#xff08;以下简…

上海落户条件—海归落户上海

上海落户条件—海归落户上海 国际留学生落户上海 2020年底&#xff0c;上海市政府发布上海落户2020新政改革&#xff0c;明确指出“基于国家户籍制度改革的新趋势&#xff0c;以及上海所面临的人才不足和各地人才竞争形势&#xff0c;对上海居住证转户籍人口提出一个基本的政策…

留学回国人员申办上海常住户口实施细则

留学回国人员申办上海常住户口实施细则 &#xff08;政策有效期至2025年11月30日&#xff09; 第一条 目的和依据 为贯彻落实人才强市战略&#xff0c;加大海外人才引进力度&#xff0c;规范留学回国人员申办上海常住户口工作&#xff0c;根据《公安部、人力资源和社会保障部关…

微信appid、openid、unionid的区别和关联

微信小程序的appid、openid、unionid appidopenidunionid三者关系 appid application identification (简称appid) 翻译一下就是某个应用的标识(id) 比如说在一个公众号主体下 你不仅可以拥有h5网站,小程序,小游戏,企业微信等等,这些都有一个单独的appid openid 每一个应用下…

获取openId

小程序—获取openId&#xff08;用来标识用户唯一&#xff09; 在需要的页面.js下 getopenid(){wx.cloud.callFunction({name:getOpenId,//注意名字是自己当前云函数中的openID的目录名success(res){console.log("获取云函数成功",res);},fail(res){console.log(&qu…