MY SQL 实验四:

一、实验目的

通过该实验掌握较复杂的SQL 查询数据库方法,包括嵌套查询,相关与不相关子查询,连接的多种方法等。

二、实验原理

数据库查询是数据库的核心操作。SQL语言提供了SELECT语句进行数据库的查询。

SELECT[ALL|DISTINCT]<目标列表达式〉[,<目标列表达式〉]...

FROM<表名或视图名〉[,<表名或视图名〉]...

[WHERE<条件表达式>]

[GROUP BY<列名1〉[HAVING<条件表达式>]]

[ORDERBY<列名2〉[ASC|DESC]]

三、实验条件

windows7 操作系统, mysql5.6 数据库服务器,可视化管理平台:Mysql Workbench5.2 。

四、实验内容和方法

(一) 建立实验数据库

根据上一次实验用脚本TradeDBSQL.txt创建数据库Trade.

(二) 安装及使用Mysql Workbench (如果没有安装Mysql Workbench 可按以前的实验方法在命令窗口进行)

MySQL Workbench 综合了SQL 开发,服务器管理及数据库设计等功能的综合性可视化平台。MySQL Workbench为数据库管理员、程序开发者和系统规划师提供可视化设计、模型建立、以及数据库管理功能。

将老师提供的压缩包(免安装版),放置在e:根目录下,解压缩 -> 双击MySQLWorkbench.exe -> 将出现一个界面。

界面包括三个部分:

  1. SQL Development (用于连接现有的数据库,运行SQL脚本,管理数据库对象等)

  2. Data Modeling (用于数据库的建模设计,将来涉及)

  3. Server Administration (管理数据库服务器,导入导出数据库,及用户安全性等)

本次实验采用第一部分SQL Development

1.建立与数据库服务器的连接,连接名con1

  1. 点击 'New Connection' 按钮,跳出配置窗口

  2. 在Connection Name 命名 连接名例如con1,其他都按默认的方式,password部分:点击Store in Vault..,在跳出的窗口中的password输入密码,无就按回车。

  3. 在Default Schema:中可以保持空,或者直接输入缺省数据库名,例如Trade

  4. 按 Test Connection 测试是否连接成功。如果成功,按ok按钮。

  1. 进入数据库服务器

在连接名con1上按鼠标右键有两个重要选项: 1.Query Database (连接数据库);2.Start Command Line Client (进入命令行窗口,与以前的实验一样)。

1)点击'Query Database'进入可视化窗口,显示已有的数据库清单。

2)在右边的'Query"的窗口,可以输入sql 语句,运行查询结果。

3)输入use Trade; 按执行按钮,将数据库切换到trade中。

4)输入查询语句,例如 select * from orders; 将在下方窗口出现查询结果,可以将查询结果导出到外部文件中(点击Export按钮)

(三) 高级查询方法

1.自连接

一张表可以拆分为多张表,并且用别名表示。

例如 查找员工上级(经理)的姓名 (参考教科书例子 查询每一门课的间接先修课(即先修课的先修课))

SELECT

CONCAT(y.LastName , ' ', y.FirstName) AS `经理`,

CONCAT(x.LastName, ' ', x.FirstName) AS `员工`

FROM

employees x, employees y

where x.ReportsTo = y.employeeID

order by y.employeeID;

其中CONCAT为字符串函数,连接字符串.

  1. 交叉连接 cross join , 笛卡尔积

比较下列两个查询结果

  1. select * from products cross join Categories;

  2. select * from products,Categories;

  1. 内连接, inner join , 等值连接

比较下列两个查询结果

select * from products inner join Categories on products.CategoryID=Categories.CategoryID;

select * from products , Categories where products.CategoryID=Categories.CategoryID

  1. 外连接,左、右连

查询没有下过定单的客户名称

select customers.companyname,orderID

from customers left join orders on customers.customerID=orders.customerID

where orderID is null;

写出等价的右连查询(提示right join)

  1. any, all 谓词

类别2各个产品的库存量与类别1各个产品的库存量比较

select productName from Products where categoryID='2' and UnitsinStock >=any (select unitsinStock from Products where categoryID='1');

执行此查询语句,说明">=any"谓词修饰符的含义。

分别用下列谓词修饰符,代替 ">=any" 并说明比较结果。

> ANY 大于子查询结果中的某个值

> ALL 大于子查询结果中的所有值

< ANY 小于子查询结果中的某个值

< ALL 小于子查询结果中的所有值

>= ANY 大于等于子查询结果中的某个值

>= ALL 大于等于子查询结果中的所有值

<= ANY 小于等于子查询结果中的某个值

<= ALL 小于等于子查询结果中的所有值

= ANY 等于子查询结果中的某个值

=ALL 等于子查询结果中的所有值(通常没有实际意义)

!=(或<>)ANY 不等于子查询结果中的某个值

!=(或<>)ALL 不等于子查询结果中的任何一个值

6.理解下列查询的意义,写出具体的查询要求

1)

SELECT DISTINCT

Customers.CustomerID,

Customers.CompanyName,

Customers.City

FROM Customers

JOIN Orders ON Customers.CustomerID = Orders.CustomerID

WHERE Orders.OrderDate BETWEEN '1997-01-01' And '1997-12-31';

查询发货日期从1997-01-01到1997-12-31的客户ID,公司名称,客户城市.

2)

SELECT

OrderDetails.OrderID,

Sum(ROUND(OrderDetails.UnitPrice*Quantity*(1-Discount))) AS 订购额

FROM OrderDetails

GROUP BY OrderDetails.OrderID limit 2\G;

根据订单ID查询该ID下的订购总额,并以订单额命名.

3)

select orders.customerID,count(orderdetails.productID)

from orders,orderdetails

where orders.orderID=orderdetails.orderID

group by orders.customerID

having count(orderdetails.productID)>20

order by orders.customerID;

根据客户ID查询客户ID,客户订单总量大于20的所有客户ID和该客户订单总量

select suppliers.CompanyName,Customers.CompanyName,suppliers.city,customers.city

from suppliers,customers

where suppliers.city=customers.city;

查询运货商公司的城市=客户公司城市的运货商城市名称和城市,客户公司名称和城市

7.思考题

1)查找至少订购了订单ID为10251订购的全部产品的订单ID

第一种:select OrderDetails.OrderID , count(distinct OrderDetails.ProductID) from Products,OrderDetails

where OrderDetails.ProductID=Products.ProductID and OrderDetails.OrderID='10251'

group by OrderDetails.OrderID

having count(distinct OrderDetails.ProductID)>= (select count(distinct ProductID) from OrderDetails where OrderID='10251' );

第二种:SELECT DISTINCT OrderID

FROM OrderDetails OrderDetailsx

WHERE NOT EXISTS

(SELECT *

FROM OrderDetails OrderDetailsy

WHERE OrderDetailsy.OrderID = '10251' AND

NOT EXISTS

(SELECT *

FROM OrderDetails OrderDetailsz

WHERE OrderDetailsz.OrderID=OrderDetailsx.OrderID AND

OrderDetailsz.ProductID=OrderDetailsy.ProductID));

提示:

参考教材"查询至少选修了学生200215122选修的全部课程的学生号码。"

SELECT DISTINCT Sno

FROM SC SCX

WHERE NOT EXISTS

(SELECT *

FROM SC SCY

WHERE SCY.Sno = '200215122' AND

NOT EXISTS

(SELECT *

FROM SC SCZ

WHERE SCZ.Sno=SCX.Sno AND

SCZ.Cno=SCY.Cno));

等价SQL

select x.sno, count(distinct x.cno) from sc x,sc y

where x.cno=y.cno and y.sno='200215122'

group by x.sno

having count(distinct x.cno)>= (select count(distinct cno) from sc where sno='200215122' );

2)查找1996年8月份,订购量最大的公司名称及所在的城市。

select Suppliers.CompanyName,Suppliers.City,Products.ProductID,sum(round(OrderDetails.Quantity)) from OrderDetails,Products,Suppliers, Orders where Products.ProductID=OrderDetails.ProductID and Suppliers.SupplierID=Products.SupplierID and year(Orders.OrderDate)=1996 and month(Orders.OrderDate)=8 group by OrderDetails.ProductID order by sum(round(OrderDetails.Quantity)) desc;

3)查找1996年销售最好的产品名称及相关产品的供应商名称。

select Products.ProductName,Suppliers.CompanyName,sum(UnitsOnOrder+ReorderLevel) from Products,Suppliers,Orders,OrderDetails where Products.SupplierID=Suppliers.SupplierID and OrderDetails.ProductID=Products.ProductID and year(Orders.OrderDate)=1996 group by Products.ProductID order by sum(UnitsOnOrder+ReorderLevel) desc;

相关推荐
工业甲酰苯胺1 小时前
MySQL 主从复制之多线程复制
android·mysql·adb
Yang-Never3 天前
ADB->ADB宏控开关控制
adb
LKID体3 天前
mysql的my.cnf配置文件参数说明
数据库·mysql·adb
液态不合群4 天前
Mysql篇-语句执行计划详解(explain)
android·mysql·adb
无名前端小白5 天前
常用Adb 命令
adb
C_eeking5 天前
Ubuntu23.10下解决C语言调用mysql.h问题
c语言·mysql·adb
木古古185 天前
Ubuntu22.04 安装mysql8 无法修改端口及配置的问题 坑啊~~~~
adb
AlbertS5 天前
Windows下使用adb实现在模拟器中ping
android·windows·adb·ping·模拟器
冷白白6 天前
【MySQL】函数
android·数据库·mysql·adb
GOTXX7 天前
【MySQL】ubantu 系统 MySQL的安装与免密码登录的配置
linux·数据库·mysql·adb·ubantu