sql基础

本文详细介绍了SQL查询的基础知识,包括单表查询和多表查询的语法格式,并提供了丰富的示例帮助理解如何使用SELECT、WHERE、GROUP BY等关键语句进行高效数据检索。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、检索数据


关键字 SELECT 、FROM 、AS 、TOP 、DISTINCT 、WHERE 、ORDER 、BY 、ASC 、DESC 、GROUP、HAVING


INNER 、JOIN 、ON 、LEFT 、RIGHT 、FULL


单表查询


格式一:SELECT listname FROM tablename


listname 列名或列名列表,使用逗号分隔各列。也可以用通配符(*)表示所有列。


tablename 表名或表名列表,使用逗号分隔各表。


Example1: SELECT * FROM 用户


Example2: SELECT 用户姓名 , 用户年龄 FROM 用户


按照SELECT语句中列出的列的次序检索数据。


Example3: SELECT 用户年龄 , 用户姓名 FROM 用户


用字符串连接符号(+)格式化数据类型为字符串的列,字符串用单引号('')包含。


Example4: SELECT 用户姓名+ '是' + 用户性别 + '性' FROM 用户


使用AS定义列的别名。


格式二:SELECT expression AS alias FROM tablename


expression:表达式,可以是字符串连接或聚合函数的结果等。


alias:列或表达式结果的别名。


Example5: SELECT 用户姓名+ '是' + 用户性别 + '性' AS 用户信息 FROM 用户


使用TOP限制返回的行数。


格式三:SELECT TOP number listname FROM tablename


number: 返回的行数,为数字。


Example6: SELECT TOP 3 * FROM 用户


使用DISTINCT返回不重复的数据。


格式四:SELECT DISTINCT listname FROM tablename


Example7: SELECT DISTINCT 操作 , 说明 FROM 用户收支


如果根据listname得到的数据中的一行与另一行完全相同,就删除其中的一个。listname中没有列出的数


据不进行比较。


使用WHERE 返回满足条件的数据。


格式五:SELECT listname FROM tablename WHERE condition


condition: 条件表达式,包括关系运算符,布尔运算符,函数等。


条件表达式在后面总结。


Example8: SELECT * FROM 用户 WHERE 用户年龄 > 30


使用ORDER BY … ASC | DESC 根据列进行排序


不指定 ASC 或 DESC 默认为ASC按升序排序


格式六: SELECT listname FROM tablename ORDER BY orderlist ASC[DESC]


SELECT listname FROM tablename ORDER BY orderlist


orderlist: 指定排序的列,可以为多个列


说明 在 ORDER BY 子句中不能使用 ntext、text 和 image 数据类型的列。


Example9: SELECT * FROM 用户 ORDER BY 用户年龄


Example10: SELECT * FROM 用户 ORDER BY 用户年龄 DESC


按多列排序规则:优先顺序按从左到右依次降低,根据第一个排序列分组,再在每个分组中进行第二个排


序列的排序,依次类推。如下例,先用 用户性别 排序 ,得到二个组,男组与女组,然后再在二个组内


分别用用户年龄 排序。如果前次排序得到的组大于本次排序得到的组,那么本次排序没有任何意义,如


Example11。


Example11: SELECT * FROM 用户 ORDER BY 用户性别 DESC ,用户年龄


Example12: SELECT * FROM 用户 ORDER BY 用户年龄 , 用户性别 DESC


在SELECT中使用聚合函数


Example13: SELECT AVG( 用户年龄 ) As 用户平均年龄 FROM 用户


AVG计算字段平均值


计算符合条件的列


Example14: SELECT AVG( 用户年龄 ) AS 用户平均年龄 FROM 用户 WHERE 用户性别 = '男'


使用GROUP BY 进行分组


格式七:SELECT listname FROM tablename GROUP BY group_by_expression


listname:包含聚合函数的列表列


group_by_expression:不在聚合函数中的列的列表


SQL要求,在聚合函数所在的查询中,任何列名要么加入聚合函数,要么包含在 GROUP BY中。


为了使用聚合函数,SQL必须对列进行分组,然后在每个组中使用聚合函数。


上面的两个例子中,实际上SQL在幕后秘密的建立了一个组,组的数据为


在Example13中,SELECT 用户年龄 FROM 用户


在Example14中,SELECT 用户年龄 FROM WHERE 用户性别 = '男'


然后再对组中的数据进行计算。


Example15: SELECT 用户性别 , AVG( 用户年龄 ) As 用户平均年龄 FROM 用户


这个例子会产生一个错误消息,用户姓名 列 在选择列表中是非法的,因为它不再聚合函数中,也没有


GROUP BY 字句。因为SQL尝试用其他列名匹配这个汇总值,但没有办法匹配。你可能想要分别得到性别为


男和女的用户的平均年龄。那么就要对用户性别进行分组,使SQL按照用户性别所分得组进行汇总。所谓


分组,就是对一列中相同的数据进行进行整合,有多少种相同的数据,就有多少个组,用户性别列的分组


,我们得到 男 组 与 女 组。然后SQL分别对这两个组进行汇总,我们就得到了男组的品均年龄与女组的


平均年龄。


Example16: SELECT 用户性别,AVG( 用户年龄 ) As 用户平均年龄 FROM 用户 GROUP BY 用户性别


我们还可以根据多个列分组,组的构成是根据 GROUP BY 后面列出现的顺序进行的。先根据第一个列分组


,在再每个分组中用第二的列进行分组,依次类推。如果第一个列可分为四组,第二个列可分为二组,则


最终的到八组。


Example17: SELECT 用户标识 , 操作 , SUM( 金额 ) As 金额总和 FROM 用户收支 GROUP BY 用户标识


, 操作


Example18: SELECT 用户标识 , 操作 , SUM( 金额 ) As 金额总和 FROM 用户收支 GROUP BY 操作 ,


用户标识


Example17和Example18的到的数据是一样的。


对唯一表识列,或分组不明确的列分组是没有意义的,如对用户IP.


SUM计算字段的和。


使用HAVING 为组指定条件


格式八:SELECT listname FROM tablename GROUP BY group_by_expression HAVING search_condition


search_condition:指定组应满足的搜索条件。


通过为作为一个整体的组指定条件(即 HAVING 子句),可限定查询中出现的组。在对数据进行分组和聚


合后,将用到 HAVING 子句中的条件。只有符合条件的组才出现在查询中。


Example19: SELECT 用户标识 , 操作 , SUM( 金额 ) As 金额总和 FROM 用户收支 GROUP BY 用户标识


, 操作 HAVING AVG(金额) > 1000


首先用 用户标识 列 分组,再对得到的组用 操作列 分组,然后选出每组中金额列的平均值 大与1000的


,最后对选出的组,进行 金额 列的汇总。


至此,检索数据的基本格式 为:


SELECT [DISTINCT][TOP n] select_list FROM tablename WHERE condition GROUP BY


group_by_expression HAVING search_condition


多表查询


一、内联接


格式一:SELECT listname FROM tablename WHERE condition


listname: 列名或列名列表,使用逗号分隔各列。也可以用通配符(*)表示所有列。


tablename: 表名或表名列表,使用逗号分隔各表。


condition: 联接条件。


Example20: SELECT 用户收支.收支标识 , 用户.用户姓名 , 用户收支.操作 ,用户收支.说明 ,用户收


支.金额 ,用户收支.日期 FROM 用户 , 用户收支 WHERE 用户.用户标识 = 用户收支.用户标识


格式二: SELECT listname FROM tablename1 INNER JOIN tablename2 ON condition


listname: 列名或列名列表,使用逗号分隔各列。也可以用通配符(*)表示所有列。


tablename1:表名1。


tablename2:表名2。


condition: 联接条件。


Example21: SELECT 用户收支.收支标识 , 用户.用户姓名 , 用户收支.操作 ,用户收支.说明 ,用户收


支.金额 ,用户收支.日期 FROM 用户 INNER JOIN 用户收支 ON 用户.用户标识 = 用户收支.用户标识


这种不返回所有表中的所有行,只返回满足联接条件的行的联接称为内联接。


二、外联接


格式一:SELECT listname FROM tablename1 LEFT JOIN tablename2 ON condition


格式二:SELECT listname FROM tablename1 RIGHT JOIN tablename2 ON condition


格式三:SELECT listname FROM table

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值