sql基础

一、检索数据


关键字 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第二天 1、查询客户表,统计每个机构2000年之前开户数、2000~2005开户数(含头不含尾)、2005~2010开户数(含头不含尾)、2010之后开户数 展示字段:机构号、2000年之前开户数、2000~2005年开户数、2005~2010年开户数、2010年之后开户数 2、查询客户表,按年份统计,每年、每个机构开户数占全年开户数的占比 展示字段:年份、机构号、开户数、开户占比百分比(百分比) 3、统计所有客户的客户号、存款账户数、2011.12.31日的存款余额、2011.12存款月日均、贷款账户数、2011.12.31日的贷款余额、2011.12贷款月日均 备注:null置为0 第三天 1、统计所有客户的2011.12.31日的存款余额、存款比上日余额、存款比上月余额、、存款比上年余额 备注:存款比上日余额 = 2011.12.31日的存款余额-2011.12.30日的存款余额 存款比上月余额 = 2011.12.31日的存款余额-2011.11.30日的存款余额 存款比上年余额 = 2011.12.31日的存款余额-2010.12.31日的存款余额 只有2011.12.31这个日期可以写死,其他日期要通过2011.12.31这个日期来生成。 2、统计所有2011年存款年日均大于100的客户号、客户名称、存款账户数、2011年年日均 第四天 1、统计所有2011年存款年日均和2011年贷款年日均都大于100的客户号、存款账户数、2011年存款年日均、贷款账户数、2011年贷款年日均 2、统计所有客户的客户号、 存款标志(有存款账户的客户置为1、没存款账户的客户置为0)、 贷款标志(有贷款借据的客户置为1、没贷款借据的客户置为0)、 存款质量分类(2011年存款年日均>=10000置为优质、2011年存款年日均>=1000<10000 置为良好、2011年存款年日均=10000置为优质、2011年贷款年日均>=1000<10000 置为良好、2011年贷款年日均<1000置为普通)、 2011年贷款年日均 第五天 1、根据《事件表.xlsx》来建表,然后将excel的数据导入到目标表 2、根据客户表、存款信息表、事件表,统计每个客户2017年的客户号、 交易账户数(客户下有多少个账户有交易就是多少)、 当年有交易的天数(如果2017年有5天有过交易,则有交易天数为5)、 当年有交易总月数(如果2017的1、3、5月有交易,则有交易总月数为3)、 最大的月交易总金额(按月统计交易金额,存放最大的月交易金额)、 最大月交易金额的月份(按月统计交易金额,存放交易金额最大的月份)、 年总交易金额、 年交易金额排名(按客户排名,如果总交易金额为0,则不参与排名,排名置为9999)、 年总手续费、 年总手续费排名(按客户排名,如果总手续费为0,则不参与排名,排名置为9999)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值