数据库基础-基础、设计与实现 Marcia干洗店项目练习
2019-04-05 09:56:17
customer表
invoice表
invoice_item表
一、建表和插入数据
/********************************************************************************/ /* */ /* Kroenke and Auer - Database Processing (14th Edition) ch 2 */ /* */ /* Marcia's Dry Cleaning [MDC] Project Create Tables */ /* */ /* These are the MySQL 5.6 SQL code solutions */ /* Note: MySQL does not support auto_increment with a step besides 1. */ /* Thus, customerIDs are inserted manually 100, 105, 110, etc. */ /********************************************************************************/ CREATE TABLE CUSTOMER( CustomerID Int NOT NULL auto_increment, FirstName Char(25) NOT NULL, LastName Char(25) NOT NULL, Phone Char(12) NOT NULL, Email varchar(100) NULL, CONSTRAINT CustomerPK PRIMARY KEY(CustomerID) ); CREATE TABLE INVOICE( InvoiceNumber Int NOT NULL auto_increment, CustomerNumber Int NOT NULL, DateIn Date NOT NULL, DateOut Date NULL, TotalAmount Numeric(8,2) NULL, CONSTRAINT InvoicePK PRIMARY KEY (InvoiceNumber), CONSTRAINT Invoice_Cust_FK FOREIGN KEY(CustomerNumber) REFERENCES CUSTOMER(CustomerID) ); ALTER TABLE invoice AUTO_INCREMENT = 20150001; CREATE TABLE INVOICE_ITEM( InvoiceNumber Int NOT NULL, ItemNumber Int NOT NULL, Item Char(50) NOT NULL, Quantity Int NOT NULL DEFAULT 1, UnitPrice Numeric(8,2) NULL, CONSTRAINT InvoiceItemPK PRIMARY KEY(InvoiceNumber, ItemNumber), CONSTRAINT Invoice_Item_FK FOREIGN KEY(InvoiceNumber) REFERENCES INVOICE(InvoiceNumber) ON UPDATE CASCADE ON DELETE CASCADE ); /********************************************************************************/
插入数据
/******************************************************************************/ /* */ /* Kroenke and Auer - Database Processing (14th Edition) Chapter 2 */ /* */ /* Marcia's Dry Cleaing (MDC) Database - Insert Data */ /* These are the MySQL 5.6 SQL code solutions */ /******************************************************************************/ INSERT INTO CUSTOMER VALUES( 1, 'Nikki', 'Kaccaton', '723-543-1233', 'Nikki.Kaccaton@somewhere.com'); INSERT INTO CUSTOMER VALUES( 2, 'Brenda', 'Catnazaro', '723-543-2344', 'Brenda.Catnazaro@somewhere.com'); INSERT INTO CUSTOMER VALUES( 3, 'Bruce', 'LeCat', '723-543-3455', 'Bruce.LeCat@somewhere.com'); INSERT INTO CUSTOMER VALUES( 4, 'Betsy', 'Miller', '725-654-3211', 'Betsy.Miller@somewhere.com'); INSERT INTO CUSTOMER VALUES( 5, 'George', 'Miller', '725-654-4322', 'George.Miller@somewhere.com'); INSERT INTO CUSTOMER VALUES( 6, 'Kathy', 'Miller', '723-514-9877', 'Kathy.Miller@somewhere.com'); INSERT INTO CUSTOMER VALUES( 7, 'Betsy', 'Miller', '723-514-8766', 'Betsy.Miller@elsewhere.com'); /* */ INSERT INTO INVOICE VALUES( 2015001,1,'2015-10-04','2015-10-06',158.50); INSERT INTO INVOICE VALUES( 2015002,2,'2015-10-04','2015-10-06',25.00); INSERT INTO INVOICE VALUES( 2015003,1,'2015-10-06','2015-10-08',49.00); INSERT INTO INVOICE VALUES( 2015004,4,'2015-10-06','2015-10-08',17.50); INSERT INTO INVOICE VALUES( 2015005,6,'2015-10-07','2015-10-11',12.00); INSERT INTO INVOICE VALUES( 2015006,3,'2015-10-11','2015-10-13',152.50); INSERT INTO INVOICE VALUES( 2015007,3,'2015-10-11','2015-10-13',7.00); INSERT INTO INVOICE VALUES( 2015008,7,'2015-10-12','2015-10-14',140.50); INSERT INTO INVOICE VALUES( 2015009,5,'2015-10-12','2015-10-14',27.00); /* */ INSERT INTO INVOICE_ITEM VALUES(2015001, 1, 'Blouse', 2, 3.50); INSERT INTO INVOICE_ITEM VALUES(2015001, 2, 'Dress Shirt', 5, 2.50); INSERT INTO INVOICE_ITEM VALUES(2015001, 3, 'Formal Gown', 2, 10.00); INSERT INTO INVOICE_ITEM VALUES(2015001, 4, 'Slacks-Mens', 10, 5.00); INSERT INTO INVOICE_ITEM VALUES(2015001, 5, 'Slacks-Womens', 10, 6.00); INSERT INTO INVOICE_ITEM VALUES(2015001, 6, 'Suit-Mens', 1, 9.00); INSERT INTO INVOICE_ITEM VALUES(2015002, 1, 'Dress Shirt', 10, 2.50); INSERT INTO INVOICE_ITEM VALUES(2015003, 1, 'Slacks-Mens', 5, 5.00); INSERT INTO INVOICE_ITEM VALUES(2015003, 2, 'Slacks-Womens', 4, 6.00); INSERT INTO INVOICE_ITEM VALUES(2015004, 1, 'Dress Shirt', 7, 2.50); INSERT INTO INVOICE_ITEM VALUES(2015005, 1, 'Blouse', 2, 3.50); INSERT INTO INVOICE_ITEM VALUES(2015005, 2, 'Dress Shirt', 2, 2.50); INSERT INTO INVOICE_ITEM VALUES(2015006, 1, 'Blouse', 5, 3.50); INSERT INTO INVOICE_ITEM VALUES(2015006, 2, 'Dress Shirt', 10, 2.50); INSERT INTO INVOICE_ITEM VALUES(2015006, 3, 'Slacks-Mens', 10, 5.00); INSERT INTO INVOICE_ITEM VALUES(2015006, 4, 'Slacks-Womens', 10, 6.00); INSERT INTO INVOICE_ITEM VALUES(2015007, 1, 'Blouse', 2, 3.50); INSERT INTO INVOICE_ITEM VALUES(2015008, 1, 'Blouse', 3, 3.50); INSERT INTO INVOICE_ITEM VALUES(2015008, 2, 'Dress Shirt', 12, 2.50); INSERT INTO INVOICE_ITEM VALUES(2015008, 3, 'Slacks-Mens', 8, 5.00); INSERT INTO INVOICE_ITEM VALUES(2015008, 4, 'Slacks-Womens', 10, 6.00); INSERT INTO INVOICE_ITEM VALUES(2015009, 1, 'Suit-Mens', 3, 9.00); /* */
题目:
-- A.显示张表中的所有数据
select * from CUSTOMER; select * from INVOICE; select * from INVOICE_ITEM;
-- B.列出每个客户的LastName,FirstName和Phone
select LastName, FirstName, Phone from CUSTOMER;
-- C.列出所有名为'Nikki'客户的LastName, FirstName和Phone
select LastName, FirstName, Phone from CUSTOMER where FirstName = 'Nikki';
-- D.列出所有超出100元的订单LastName, FirstName, Phone, DataIn和DateOut
select CUSTOMER.LastName, CUSTOMER.FirstName, CUSTOMER.Phone, INVOICE.DateIn, INVOICE.DateOut from CUSTOMER, INVOICE where CUSTOMER.CustomerID = INVOICE.CustomerNumber and INVOICE.TotalAmount > 100;
-- E.列出所有名字以'B'开始的客户的LastName,FirstName和Phone
select LastName, FirstName, Phone from CUSTOMER where FirstName like 'B%';
-- F.列出所有姓氏包含字符'cat'的客户的LastName, FirstName和Phone
select LastName, FirstName, Phone from CUSTOMER where LastName like '%cat%';
-- G.列出所有电话号码第二位和第三位分别是2和3的客户的LastName, FirstName和Phone
select LastName, FirstName, Phone from CUSTOMER where Phone like '_23%';
-- H.确定最大和最小的TotalAmount
select max(TotalAmount) as maxamount, min(TotalAmount) as minamount from INVOICE;
-- I确定平均的TotalAmount
select avg(TotalAmount) as avgTotalAmount from INVOICE;
-- J.计算客户数
select count(*) from CUSTOMER;
-- M.使用子查询, 给出拥有单一订单总价超过100元的客户LastName, FirstName, Phone。结果按照LastName升序排列, 再按照FirstName降序。
select CUSTOMER.LastName, CUSTOMER.FirstName, CUSTOMER.Phone from CUSTOMER where CUSTOMER.CustomerID in (select CustomerNumber from INVOICE where TotalAmount > 100 group by CustomerNumber having count(*) = 1) order by CUSTOMER.LastName, CUSTOMER.FirstName asc;
-- N.使用联接, 但不使用JOIN ON语法, 给出拥有单一订单总价超过100元的客户LastName, FirstName, Phone。结果按照LastName升序排列, 再按照FirstName降序。
select CUSTOMER.LastName, CUSTOMER.FirstName, CUSTOMER.Phone from CUSTOMER, INVOICE where CUSTOMER.CustomerID = INVOICE.CustomerNumber and INVOICE.TotalAmount > 100 group by CUSTOMER.CustomerID having count(*) = 1 order by CUSTOMER.LastName, CUSTOMER.FirstName asc;
-- O.使用JOIN ON语法, 给出拥有单一订单总价超过100元的客户LastName, FirstName, Phone。结果按照LastName升序排列, 再按照FirstName降序。
select CUSTOMER.LastName, CUSTOMER.FirstName, CUSTOMER.Phone from CUSTOMER inner join INVOICE on ( CUSTOMER.CustomerID = INVOICE.CustomerNumber and INVOICE.TotalAmount > 100 ) group by CUSTOMER.CustomerID having count(*) = 1 order by CUSTOMER.LastName asc, CUSTOMER.FirstName desc;
-- P.使用子查询, 给出拥有包含物品'Dress Shirt'的订单的客户LastName, FirstName, Phone。
-- 结果按照LastName升序排列, 再按照FirstName降序
select CUSTOMER.LastName, CUSTOMER.FirstName, CUSTOMER.Phone from CUSTOMER where CUSTOMER.CustomerID in ( select INVOICE.CustomerNumber from INVOICE where INVOICE.InvoiceNumber in (select INVOICE_ITEM.InvoiceNumber from INVOICE_ITEM where Item in ('Dress Shirt')) ) order by CUSTOMER.LastName asc, CUSTOMER.FirstName desc;
-- Q.使用联接,但不使用JOIN ON语法, 给出拥有包含物品'Dress Shirt'的订单的客户LastName, FirstName, Phone。
-- 结果按照LastName升序排列, 再按照FirstName降序
select CUSTOMER.LastName, CUSTOMER.FirstName, CUSTOMER.Phone from CUSTOMER, INVOICE, INVOICE_ITEM where CUSTOMER.CustomerID = INVOICE.CustomerNumber and INVOICE.InvoiceNumber = INVOICE_ITEM.InvoiceNumber and INVOICE_ITEM.Item = 'Dress Shirt' order by CUSTOMER.LastName asc, CUSTOMER.FirstName desc;
-- T.给出拥有包含物品'Dress Shirt'的订单的客户LastName, FirstName, Phone和TotalAmount。同时也列出其他客户的LastName, FirstName, Phone
-- 结果按照LastName升序排列, 再按照FirstName降序
select CUSTOMER.LastName, CUSTOMER.FirstName, CUSTOMER.Phone, a.TotalAmount from CUSTOMER left join (select INVOICE.CustomerNumber, INVOICE.TotalAmount from INVOICE where INVOICE.InvoiceNumber in (select INVOICE_ITEM.InvoiceNumber from INVOICE_ITEM where Item in ('Dress Shirt')) ) as a on CUSTOMER.CustomerID = a.CustomerNumber order by CUSTOMER.LastName asc, CUSTOMER.FirstName desc;
问题:计算不同名同姓的客户数?
select count(*) from ( select count(*) as n from CUSTOMER group by CUSTOMER.FirstName, CUSTOMER.LastName having count(*) = 1 ) t;