SQL基础面试题及答案.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

SQL基础面试题及答案

1.请写出创建“用户表(user)”的SQL语句,要求包含用户ID、用户名、手机号、注册时间字段,且满足:用户ID为主键、用户名非空、手机号唯一

CREATETABLE`user`(

`user_id`INTPRIMARYKEYAUTO_INCREMENTCOMMENT用户ID(自增主键),

`username`VARCHAR(50)NOTNULLCOMMENT用户名,

`phone`CHAR(11)UNIQUECOMMENT手机号(唯一约束),

`register_time`DATETIMEDEFAULTCURRENT_TIMESTAMPCOMMENT注册时间(默认取当前时间)

)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COMMENT=用户表;

2.现有“订单表(order)”,字段包括order_id(订单ID)、user_id(用户ID)、order_amount(订单金额)、order_time(下单时间),请写出SQL查询“2024年3月1日至2024年3月31日期间,下单金额大于500元的订单,要求显示订单ID、用户名、订单金额、下单时间”(需关联用户表)

SELECT

o.order_id,

u.username,

o.order_amount,

o.order_time

FROM

`order`o

INNERJOIN

`user`uONo.user_id=u.user_id--关联用户表获取用户名

WHERE

o.order_timeBETWEEN2024-03-0100:00:00AND2024-03-3123:59:59--时间范围

ANDo.order_amount500;--金额条件

说明:用INNERJOIN确保只查有对应用户的订单;BETWEEN包含边界时间,需补全时分秒避免漏查当天数据。

3.还是基于“用户表”和“订单表”,请查询“每个用户的总下单金额”,要求显示用户名和总金额,若用户没有下单则总金额显示0

SELECT

u.username,

IFNULL(SUM(o.order_amount),0)AStotal_amount--无订单时显示0

FROM

`user`u

LEFTJOIN

`order`oONu.user_id=o.user_id--左连接保留所有用户

GROUPBY

u.user_id,u.username--按用户分组(主键user_id唯一,可确保分组唯一)

ORDERBY

total_amountDESC;--按总金额倒序(可选,提升可读性)

关键:用LEFTJOIN保留未下单用户,IFNULL处理SUM空值,GROUPBY需包含非聚合字段(username)。

4.请解释WHERE和HAVING的区别,并用例子说明

区别:

执行时机:WHERE在分组(GROUPBY)前过滤数据,HAVING在分组后过滤分组结果;

作用对象:WHERE过滤行数据,HAVING过滤分组数据;

支持字段:WHERE不能使用聚合函数,HAVING可以使用聚合函数。

例子:查询“2024年下单次数大于3次,且总金额超过2000元的用户”

SELECT

u.user_id,

u.username,

COUNT(o.order_id)ASorder_count,--下单次数

SUM(o.order_amount)AStotal_amount--总金额

FROM

`user`u

LEFTJOIN

`order`oONu.user_id=o.user_id

WHERE

o.order_time=2024-01-0100:00:00--先过滤2024年的订单(WHERE分组前用)

GROUPBY

u.user_id,u.username

HAVING

COUNT(o.order_id)3--分组后过滤下单次数(HAVING用聚合函数)

ANDSUM(o.order_amount)2000;--分组后过滤总金额

5.请写出两种查询“有下单记录的用户ID”的SQL方法(要求去重)

方法1:用DISTINCT+关联查询

SELECT

文档评论(0)

151****9429 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档