2.SQL查询语句的操作和练习

本篇文章旨在帮助大家熟练掌握SQL SELECT语句,能够运用该语句完成各种查询。

入门查询1

此处给出参考数据库和表的定义和创建的代码:
<1>.首先先创建一个仓库管理的数据库,再创建以下约束的表格:

USE 仓库管理
CREATE TABLE 仓库
(仓库号 char(8)PRIMARY KEY,
城市 Varchar(40),
面积 int)
CREATE TABLE 职工
(仓库号 char(8) REFERENCES 仓库,
职工号 char(8) PRIMARY KEY,
工资 int )
CREATE TABLE 供应商
(供应商号 char(8) PRIMARY KEY,
供应商名 Varchar(40),
地址 Varchar(40))
CREATE TABLE 订购单
(职工号 char(8) REFERENCES 职工,
供应商号 char(8) REFERENCES 供应商,
订购单号 char(8) PRIMARY KEY,
订购日期 datetime )

<2>.之后再对数据库中的表格插入一些数据,为了方便起见,这里给出笔者的样例.

USE 仓库管理
INSERT 仓库 VALUES ('WH1','北京',370)
INSERT 仓库 VALUES ('WH2','上海',500)
INSERT 仓库 VALUES ('WH3','广州',200)
INSERT 仓库 VALUES ('WH4','武汉',400)
USE 仓库管理
INSERT 职工 VALUES ('WH2','E1',1220)
INSERT 职工 VALUES ('WH1','E3',1210)
INSERT 职工 VALUES ('WH2','E4',1250)
INSERT 职工 VALUES ('WH3','E6',1230)
INSERT 职工 VALUES ('WH1','E7',1250)
USE 仓库管理
INSERT 供应商 VALUES ('S3','振华电子厂','西安')
INSERT 供应商 VALUES ('S4','华通电子公司','北京')
INSERT 供应商 VALUES ('S6','607厂','郑州')
INSERT 供应商 VALUES ('S7','爱华电子厂','北京')
USE 仓库管理
INSERT 订购单 VALUES ('E3','S7','OR67','2002/06/23')
INSERT 订购单 VALUES ('E1','S4','OR73','2002/07/28')
INSERT 订购单 VALUES ('E7','S4','OR76','2002/05/25')
INSERT 订购单 VALUES ('E6',NULL,'OR77',NULL)
INSERT 订购单 VALUES ('E3','S4','OR79','2002/06/13')
INSERT 订购单 VALUES ('E1',NULL,'OR80',NULL)
INSERT 订购单 VALUES ('E3',NULL,'OR90',NULL)
INSERT 订购单 VALUES ('E3','S3','OR91','2002/07/13')

<3>.之后再做以下查询练习:

(1)检索在北京的供应商的名称。

USE 仓库管理
SELECT 供应商名 
FROM 供应商 
WHERE 地址='北京'

(2)检索发给供应商s6的订购单号。


SELECT 订购单号 
FROM 订购单
WHERE 供应商号='S6'

(3)检索出职工E6发给供应商S6的订购单信息。

SELECT * 
FROM 订购单
WHERE 供应商号='S6' AND 职工号='E3'

(4)检索出向供应商S3发过订购单的职工的职工号和仓库号。

SELECT 职工.职工号,职工.仓库号 
FROM 职工,订购单
WHERE 订购单.职工号=职工.职工号 AND 订购单.供应商号='S3'

(5)检索出目前与S3供应商没有联系的职工信息。

SELECT *
FROM 职工
WHERE 职工号 !=(SELECT 职工号 FROM 订购单 WHERE 供应商号='S3')

(6)检索出目前没有任何订购单的供应商信息。

SELECT 供应商.供应商号,供应商名,地址
FROM 供应商 LEFT JOIN 订购单
ON 供应商.供应商号 =订购单.供应商号
WHERE 订购单号 IS null

(7)检索出和职工E1、E3都有联系的北京的供应商信息。

SELECT 供应商.供应商号,供应商名,地址
FROM 供应商 FULL JOIN 订购单 
ON 供应商.供应商号 =订购单.供应商号 
WHERE 职工号='E1' AND 地址='北京' AND 供应商.供应商号 
IN
(SELECT 供应商号 FROM 订购单 WHERE 职工号='E3')

(8)检索出目前和华通电子公司有业务联系的每个职工的工资。

SELECT 职工号, 工资
FROM 职工
WHERE 职工号 IN
(SELECT 职工号 FROM 订购单 WHERE 供应商号 IN
(SELECT 供应商号 FROM  供应商 WHERE 供应商名='华通电子公司') )

(9)检索出与工资在1220元以下的职工没有联系的供应商的名称。

USE 仓库管理
SELECT 供应商名
FROM 供应商
WHERE 供应商号 NOT IN
(SELECT 供应商号 FROM 订购单 WHERE 供应商号 IS NOT NULL AND 职工号 IN
(SELECT 职工号 FROM 职工 WHERE 工资<1220))

(10)检索出向S4供应商发出订购单的仓库所在的城市。


USE 仓库管理
SELECT 城市
FROM 仓库
WHERE 仓库号 IN 
(SELECT 仓库号 FROM 职工 WHERE 职工号 IN
(SELECT 职工号 FROM 订购单 WHERE 供应商号='S4'))

(11)检索出在上海工作并向S6供应商发出了订购单的职工号。

USE 仓库管理
SELECT 职工号
FROM 仓库 JOIN 职工
ON 仓库.仓库号=职工.仓库号
WHERE 城市='上海' AND 
职工号 IN 
(SELECT 职工号 FROM 订购单 WHERE 供应商号='S6')

(12)检索出在广州工作并只向S6供应商发出了订购单的职工号。

USE 仓库管理
SELECT 职工号
FROM 仓库 JOIN 职工
ON 仓库.仓库号=职工.仓库号
WHERE 城市='广州' AND 
职工号 IN 
(SELECT 职工号 FROM 订购单 WHERE 供应商号='S6'
 GROUP BY 职工号
 HAVING COUNT(*)=1 )

(13)检索出由工资多于1230元的职工向北京的供应商发出的订购单号。

USE 仓库管理
SELECT 订购单号
FROM 订购单 JOIN 供应商
ON 订购单.供应商号=供应商.供应商号
WHERE 地址='北京' AND 
职工号 IN 
(SELECT 职工号 FROM 职工 WHERE 工资>=1230)

(14)检索出仓库的个数。

USE 仓库管理
SELECT COUNT(*)
FROM 仓库

(15)检索出有最大面积的仓库信息。

USE 仓库管理
SELECT *
FROM 仓库
WHERE 面积=(SELECT MAX(面积)FROM 仓库)

(16)检索出所有仓库的平均面积。

USE 仓库管理
SELECT AVG(面积)
FROM 仓库

(17)检索出向S4供应商发出订购单的仓库的平均面积。

USE 仓库管理
SELECT AVG(面积)
FROM 仓库 
WHERE 仓库号 IN
(SELECT 仓库号
FROM 职工 JOIN 订购单
ON 订购单.职工号=职工.职工号
WHERE 供应商号='S4'
 )

(18)检索出每个城市的供应商个数。

USE 仓库管理
SELECT 地址,COUNT(*) AS 个数
FROM 供应商
GROUP BY 地址

(19)检索出每个仓库中工资多于1220元的职工的个数。


USE 仓库管理
SELECT 仓库号,COUNT(*) AS 个数
FROM 职工
WHERE 工资>1220
GROUP BY 仓库号

(20)检索出和面积最小的仓库有联系的供应商的个数。

USE 仓库管理
SELECT COUNT(*) AS 个数
FROM 供应商
WHERE 供应商号 IN
(SELECT 供应商号 FROM 订购单 WHERE 职工号 IN
(SELECT 职工号 FROM 职工 JOIN 仓库 ON 职工.仓库号=仓库.仓库号
WHERE 面积 = (SELECT MIN(面积) FROM 仓库)))

(21)检索出工资低于本仓库平均工资的职工信息。

USE 仓库管理
SELECT *
FROM 职工 S1
WHERE 工资<(SELECT AVG(工资) FROM 职工 S2 WHERE S1.仓库号=S2.仓库号 )

入门查询2

为了更加牢固的掌握SQL的查询语句,
我们基于产品销售类数据库,作新的查询:

在创建表前,先创建一个产品销售类数据库!!!

<1>.表定义

CREATE TABLE 客户
(客户号 char(8) PRIMARY KEY ,
客户名称 Varchar(40),
联系人 Varchar(40),
地址 Varchar(40),
邮政编码 char(8) ,
电话号码 char(11))
CREATE TABLE 产品
(产品号 char(8) PRIMARY KEY ,
产品名称 Varchar(40),
规格说明 Varchar(40),
单价 money)


CREATE TABLE 订购单
(客户号 char(8) REFERENCES 客户,
订单号 char(8) PRIMARY KEY,
订购日期 datetime
)
CREATE TABLE 订购单明细
(订单号 char(8) REFERENCES 订购单,
序号 int,
产品号 char(8) REFERENCES 产品,
数量 int,
PRIMARY KEY(订单号,产品号))

<2>.插入数据

USE 产品销售
INSERT 客户 VALUES ('0001','面包房','李三','麦岛','266071','85903214')
INSERT 客户 VALUES ('0002','香香食品厂','刘明明','郑州路','266042','84023569')
INSERT 客户 VALUES ('0003','美味食品厂','王宇','香港路','266064','85883214')
INSERT 客户 VALUES ('0004','天天食品厂','马明明','云霄路','266061','85877413')

USE 产品销售
INSERT 产品 VALUES ('C001','面包','NRT','5.8')
INSERT 产品 VALUES ('C002','酸牛奶','SSR','6.8')
INSERT 产品 VALUES ('C003','矿泉水','RYYT','2.0')
INSERT 产品 VALUES ('C004','火腿','TTU','15.2')
INSERT 产品 VALUES ('C005','矿泉水','PPE','1.0')
INSERT 产品 VALUES ('C006','火腿','TT32','10.6')
INSERT 产品 VALUES ('C007','酸牛奶','ST','12.6')
INSERT 产品 VALUES ('C008','瓜子','XX','5.7')

USE 产品销售
INSERT 订购单 VALUES ('0001','D001','2008-04-20')
INSERT 订购单 VALUES ('0001','D002','2008-04-20')
INSERT 订购单 VALUES ('0002','D003','2008-04-05')
INSERT 订购单 VALUES ('0002','D004','2008-04-05')
INSERT 订购单 VALUES ('0002','D005','2008-04-10')

USE 产品销售
INSERT 订购单明细 VALUES ('D001',1,'C001',100)
INSERT 订购单明细 VALUES ('D002',2,'C001',200)
INSERT 订购单明细 VALUES ('D003',3,'C003',50)
INSERT 订购单明细 VALUES ('D004',4,'C005',100)
INSERT 订购单明细 VALUES ('D004',5,'C002',200)
INSERT 订购单明细 VALUES ('D005',6,'C008',100)

作以下查询练习

(1)查询客户表中的所有记录。

USE 产品销售
SELECT *
FROM 客户

(2)从订购单表中查询客户号信息(哪些客户有订购单)。

USE 产品销售
SELECT *
FROM 客户
WHERE 客户号 IN
(SELECT 客户号 FROM 订购单)

(3)查询单价在x元以上(含)的产品信息。

USE 产品销售
SELECT *
FROM 产品
WHERE 单价>=5.8

(4)查询单价在x元以上(不含)的某产品(按产品名称查询)的信息。

USE 产品销售
SELECT *
FROM 产品
WHERE 单价>=5.8 AND 产品名称='火腿'

(5)查询单价在x元以上(不含)的某两种产品(按产品名称查询)的信息。

USE 产品销售
SELECT *
FROM 产品
WHERE 单价>=5.8 AND (产品名称='火腿'OR 产品名称='酸牛奶')

(6)查询有某年某月订购单的客户名称、联系人、电话号码和订单号信息。

USE 产品销售
SELECT 订单号,订购日期,客户.客户名称,客户.联系人,客户.电话号码
FROM 订购单 JOIN 客户
ON 订购单.客户号=客户.客户号
WHERE YEAR(订购日期)='2008' AND MONTH(订购日期)='4'

(7)查询有某产品(按产品名称)订货的客户的名称、联系人和电话号码信息。

USE 产品销售
SELECT 客户名称,联系人,电话号码
FROM 客户
WHERE 客户号 IN 
(SELECT 客户号 FROM 订购单 WHERE 订单号 IN
(SELECT 订单号 FROM 订购单明细 WHERE 产品号 IN
(SELECT 产品号 FROM 产品 WHERE 产品名称='矿泉水')))

(8)查询有某产品(按产品名称)订购需求的订购单明细记录。

USE 产品销售
SELECT *
FROM 订购单明细
WHERE 产品号 IN
(SELECT 产品号 FROM 产品 WHERE 产品名称='矿泉水')

(9)查询所有订购数量(即订购单明细中每个订购项目的数量)都在x以上的订购单的信息。

USE 产品销售
SELECT *
FROM 订购单明细
WHERE 数量>100

(10)找出和某产品(按产品规格)同等价位的所有的产品信息。

USE 产品销售
SELECT *
FROM 产品
WHERE  单价 IN (SELECT 单价 FROM 产品 WHERE 规格说明='TTU')

(11)查询单价范围在x元到y元范围内的产品信息(使用BETWEEN…AND)。

USE 产品销售
SELECT *
FROM 产品
WHERE 单价 BETWEEN 5 AND 12

(12)从客户表中查询出客户名称中有“xx”二字的客户信息(使用LEKE运算符)。

USE 产品销售
SELECT *
FROM 客户
WHERE 客户名称   LIKE '__食品_'

(13)从客户表中查询出客户名称中没有“xx”二字的客户信息(使用NOT LEKE运算符)。

USE 产品销售
SELECT *
FROM 客户
WHERE 客户名称   NOT LIKE '__食品_'

(14)按产品的单价升序列出全部产品信息。

USE 产品销售
SELECT *
FROM 产品
ORDER BY 单价 ASC

(15)先按产品名称排序,再按单价排序列出全部产品信息。

USE 产品销售
SELECT *
FROM 产品
ORDER BY 产品名称 DESC ,单价 ASC

(16)从产品表查询共用几种产品。

USE 产品销售
SELECT COUNT(DISTINCT 产品名称)
FROM 产品

(17)从订购明细表中查询某产品(按产品名称)的订购总数。

USE 产品销售
SELECT SUM(数量)
FROM 订购单明细
WHERE 产品号 IN
(SELECT 产品号 FROM 产品 WHERE 产品名称 ='矿泉水')

(18)计算某产品(按产品名称)所有订购的总金额。

USE 产品销售
SELECT SUM(数量*单价)
FROM 订购单明细 JOIN 产品
ON 订购单明细.产品号=产品.产品号
WHERE 订购单明细.产品号 IN
(SELECT 产品号 FROM 产品 WHERE 产品名称 ='矿泉水')

(19)求所有订购单的平均金额,在查询结果中列出订购单的个数和平均金额。

USE 产品销售
SELECT COUNT(*) AS 订购单个数,AVG(数量*单价) AS 平均金额
FROM 订购单明细 JOIN 产品
ON 订购单明细.产品号=产品.产品号

(20)求每个订购单订购的项目数和总金额。

USE 产品销售
SELECT COUNT(*) AS 订购单个数,SUM(数量*单价)AS 总金额
FROM 订购单明细 JOIN 产品
ON 订购单明细.产品号=产品.产品号
GROUP BY 订单号

(21)求每个客户包含了某产品(按产品名称)订购的订单号及其最高金额和最低金额。

USE 产品销售
SELECT 订购单明细.订单号
FROM 订购单明细 JOIN 订购单
ON 订购单明细.订单号=订购单.订单号
WHERE 产品号 IN (SELECT 产品号 FROM 产品 WHERE 产品名称='矿泉水')

(22)求至少有两个订购项目的订购单的平均金额。

USE 产品销售
SELECT 订单号,AVG(数量*单价) AS 平均金额
FROM 订购单明细 JOIN 产品
ON 订购单明细.产品号=产品.产品号
GROUP BY 订单号
HAVING COUNT(*)>=2

(23)找出尚未最后确定订购单(即订购日期为空值的记录)的有关客户信息(客户的名称、联系人和电话号码)和订单号。

USE 产品销售
SELECT 订单号,客户.客户名称,客户.联系人,客户.电话号码
FROM 订购单 JOIN 客户
ON 订购单.客户号=客户.客户号
WHERE 订购日期 IS NULL

(24)找出在某年某月某日之后签订的订购单的客户信息(客户的名称、联系人和电话号码)、订单号和订购日期。

USE 产品销售
SELECT 订单号,订购日期,客户.客户名称,客户.联系人,客户.电话号码
FROM 订购单 JOIN 客户
ON 订购单.客户号=客户.客户号
WHERE 订购日期 >'2008-04-05'

(25)列出每类产品(相同名称)具有最高单价的产品信息(产品号、名称、规格说明和单价,提示:本题使用内外层互相关嵌套查询)。

USE 产品销售
SELECT *
FROM 产品 S1
WHERE 单价=(SELECT MAX(单价) FROM 产品 S2
WHERE S1.产品名称=S2.产品名称  
GROUP BY 产品名称)

(26)去顶哪些客户目前没有订购单。

USE 产品销售
SELECT *
FROM 客户
WHERE 客户号 NOT IN (SELECT 客户号 FROM 订购单)

(27)查询目前有订购单的客户的信息。

USE 产品销售
SELECT *
FROM 客户
WHERE 客户号 IN (SELECT 客户号 FROM 订购单)

(28)查询符合条件的某产品(按产品名称)信息,产品的单价达到了任意一款某产品(按产品名称)单价的一般(使用ANY或SOME量词)。

USE 产品销售
SELECT *
FROM 产品
WHERE 单价 > ANY(SELECT 0.5*单价 FROM 产品 WHERE 产品名称='火腿')

(29)查询符合条件的某产品(按产品名称)信息,产品的单价大于任何一款某产品(按产品名称)的单价(使用ALL量词)。

USE 产品销售
SELECT *
FROM 产品
WHERE 单价 > ALL(SELECT 单价 FROM 产品 WHERE 产品名称='瓜子')
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值