Oracle Sql考核

一.数据库初始化脚本:

Create TABLE HAND_CUSTOMERS
(
 CUSTOMERS_NO Varchar2(10),
 CUSTOMERS_NAME Varchar2(30),
 CUSTOMERS_GENDER Varchar2(3),
 CUSTOMERS_BIRTH_DATE Date
);
comment on TABLE HAND_CUSTOMERS is '顾客表';
comment on COLUMN HAND_CUSTOMERS.CUSTOMERS_NO is '客户编号';
comment on COLUMN HAND_CUSTOMERS.CUSTOMERS_NAME is '客户名称';
comment on COLUMN HAND_CUSTOMERS.CUSTOMERS_GENDER is '客户性别';
comment on COLUMN HAND_CUSTOMERS.CUSTOMERS_BIRTH_DATE is '客户出生日期';

 
Create TABLE HAND_SELLERS
(
 SELLER_NO Varchar2(10),
 SELLER_NAME Varchar2(30),
 MANAGER_NO  Varchar2(10)
);
comment on TABLE HAND_SELLERS is '销售员表';
comment on COLUMN HAND_SELLERS.SELLER_NO is '销售员编码';
comment on COLUMN HAND_SELLERS.SELLER_NAME is '销售员名称';
comment on COLUMN HAND_SELLERS.MANAGER_NO  is '销售员经理'; 


---
 
Create Table HAND_GOODS
(
 GOODS_NO Varchar2(10),
 GOODS_NAME Varchar2(30),
 GOODS_PRICE Number
);
comment on table HAND_GOODS is '商品表';
comment on column HAND_GOODS.GOODS_NO is '商品编码';
comment on column HAND_GOODS.GOODS_NAME is '商品名称';
comment on column HAND_GOODS.GOODS_PRICE is '商品单价';

----
Create Table HAND_SALES_RECORDS
(
 CUSTOMERS_NO Varchar2(10),
 SELLER_NO Varchar2(10),
 GOODS_NO Varchar2(10),
 SALES_QUANTY Number,
 SALES_DATE Date
);
comment on table HAND_SALES_RECORDS is '销售记录表';
comment on column HAND_SALES_RECORDS.CUSTOMERS_NO is '客户编号';
comment on column HAND_SALES_RECORDS.SELLER_NO is '销售员编码';
comment on column HAND_SALES_RECORDS.GOODS_NO is '商品编码';
comment on column HAND_SALES_RECORDS.SALES_QUANTY is '销售数量';
comment on column HAND_SALES_RECORDS.SALES_DATE is '销售记录';
  




------
INSERT INTO HAND_CUSTOMERS(CUSTOMERS_NO, CUSTOMERS_NAME, CUSTOMERS_GENDER, CUSTOMERS_BIRTH_DATE) values 
('C001', '张三', '', TO_DATE('1990/1/1','YYYY/MM/DD'));
INSERT INTO HAND_CUSTOMERS(CUSTOMERS_NO, CUSTOMERS_NAME, CUSTOMERS_GENDER, CUSTOMERS_BIRTH_DATE) values 
('C002', '李四', '', TO_DATE('1994/3/2','YYYY-MM-DD'));
INSERT INTO HAND_CUSTOMERS(CUSTOMERS_NO, CUSTOMERS_NAME, CUSTOMERS_GENDER, CUSTOMERS_BIRTH_DATE) values 
('C003', '吴鹏', '', TO_DATE('1996/2/19','YYYY-MM-DD'));
INSERT INTO HAND_CUSTOMERS(CUSTOMERS_NO, CUSTOMERS_NAME, CUSTOMERS_GENDER, CUSTOMERS_BIRTH_DATE) values 
('C004', '琴沁', '', TO_DATE('1997/1/4','YYYY-MM-DD'));
INSERT INTO HAND_CUSTOMERS(CUSTOMERS_NO, CUSTOMERS_NAME, CUSTOMERS_GENDER, CUSTOMERS_BIRTH_DATE) values 
('C005', '王丽', '', TO_DATE('1998/1/5','YYYY-MM-DD'));
INSERT INTO HAND_CUSTOMERS(CUSTOMERS_NO, CUSTOMERS_NAME, CUSTOMERS_GENDER, CUSTOMERS_BIRTH_DATE) values 
('C006', '李波', '', TO_DATE('1998/4/6','YYYY-MM-DD'));
INSERT INTO HAND_CUSTOMERS(CUSTOMERS_NO, CUSTOMERS_NAME, CUSTOMERS_GENDER, CUSTOMERS_BIRTH_DATE) values 
('C007', '刘玉', '', TO_DATE('1998/7/7','YYYY-MM-DD'));
INSERT INTO HAND_CUSTOMERS(CUSTOMERS_NO, CUSTOMERS_NAME, CUSTOMERS_GENDER, CUSTOMERS_BIRTH_DATE) values 
('C008', '萧蓉', '', TO_DATE('1998/8/21','YYYY-MM-DD'));
INSERT INTO HAND_CUSTOMERS(CUSTOMERS_NO, CUSTOMERS_NAME, CUSTOMERS_GENDER, CUSTOMERS_BIRTH_DATE) values 
('C009', '陈萧晓', '', TO_DATE('1994/12/1','YYYY-MM-DD'));
INSERT INTO HAND_CUSTOMERS(CUSTOMERS_NO, CUSTOMERS_NAME, CUSTOMERS_GENDER, CUSTOMERS_BIRTH_DATE) values 
('C010', '陈美', '', TO_DATE('1999/10/10','YYYY-MM-DD'));

------
INSERT INTO HAND_SELLERS(SELLER_NO, SELLER_NAME, MANAGER_NO ) values 
('X001', '销售A', '');
INSERT INTO HAND_SELLERS(SELLER_NO, SELLER_NAME, MANAGER_NO ) values 
('X002', '销售B', 'X001');
INSERT INTO HAND_SELLERS(SELLER_NO, SELLER_NAME, MANAGER_NO ) values 
('X003', '销售C', 'X001');
INSERT INTO HAND_SELLERS(SELLER_NO, SELLER_NAME, MANAGER_NO ) values 
('X004', '销售D', 'X003');
INSERT INTO HAND_SELLERS(SELLER_NO, SELLER_NAME, MANAGER_NO ) values 
('X005', '销售E', 'X003');
-------
INSERT INTO HAND_GOODS(GOODS_NO, GOODS_NAME, GOODS_PRICE) values 
('GOODS001', '商品A', 120);
INSERT INTO HAND_GOODS(GOODS_NO, GOODS_NAME, GOODS_PRICE) values 
('GOODS002', '商品B', 159);
INSERT INTO HAND_GOODS(GOODS_NO, GOODS_NAME, GOODS_PRICE) values 
('GOODS003', '商品C', 349);
INSERT INTO HAND_GOODS(GOODS_NO, GOODS_NAME, GOODS_PRICE) values 
('GOODS004', '商品D', 256);
INSERT INTO HAND_GOODS(GOODS_NO, GOODS_NAME, GOODS_PRICE) values 
('GOODS005', '商品E', 412);
INSERT INTO HAND_GOODS(GOODS_NO, GOODS_NAME, GOODS_PRICE) values 
('GOODS006', '商品F', 342);
INSERT INTO HAND_GOODS(GOODS_NO, GOODS_NAME, GOODS_PRICE) values 
('GOODS007', '商品G', 234);
INSERT INTO HAND_GOODS(GOODS_NO, GOODS_NAME, GOODS_PRICE) values 
('GOODS008', '商品H', 776);
INSERT INTO HAND_GOODS(GOODS_NO, GOODS_NAME, GOODS_PRICE) values 
('GOODS009', '商品I', 123);
INSERT INTO HAND_GOODS(GOODS_NO, GOODS_NAME, GOODS_PRICE) values 
('GOODS010', '商品J', null);
---
INSERT INTO HAND_SALES_RECORDS(CUSTOMERS_NO, SELLER_NO, GOODS_NO, SALES_QUANTY, SALES_DATE) values 
('C001', 'X001', 'GOODS001', 32, TO_DATE('2019/6/8','YYYY-MM-DD'));
INSERT INTO HAND_SALES_RECORDS(CUSTOMERS_NO, SELLER_NO, GOODS_NO, SALES_QUANTY, SALES_DATE) values 
('C002', 'X002', 'GOODS001', 39, TO_DATE('2019/6/18','YYYY-MM-DD'));
INSERT INTO HAND_SALES_RECORDS(CUSTOMERS_NO, SELLER_NO, GOODS_NO, SALES_QUANTY, SALES_DATE) values 
('C002', 'X003', 'GOODS003', 20, TO_DATE('2019/6/19','YYYY-MM-DD'));
INSERT INTO HAND_SALES_RECORDS(CUSTOMERS_NO, SELLER_NO, GOODS_NO, SALES_QUANTY, SALES_DATE) values 
('C004', 'X004', 'GOODS004', 4, TO_DATE('2019/6/11','YYYY-MM-DD'));
INSERT INTO HAND_SALES_RECORDS(CUSTOMERS_NO, SELLER_NO, GOODS_NO, SALES_QUANTY, SALES_DATE) values 
('C005', 'X005', 'GOODS005', 60, TO_DATE('2019/6/12','YYYY-MM-DD'));
INSERT INTO HAND_SALES_RECORDS(CUSTOMERS_NO, SELLER_NO, GOODS_NO, SALES_QUANTY, SALES_DATE) values 
('C006', 'X003', 'GOODS006', 30, TO_DATE('2019/6/13','YYYY-MM-DD'));
INSERT INTO HAND_SALES_RECORDS(CUSTOMERS_NO, SELLER_NO, GOODS_NO, SALES_QUANTY, SALES_DATE) values 
('C006', 'X002', 'GOODS007', 36, TO_DATE('2019/6/14','YYYY-MM-DD'));
INSERT INTO HAND_SALES_RECORDS(CUSTOMERS_NO, SELLER_NO, GOODS_NO, SALES_QUANTY, SALES_DATE) values 
('C004', 'X001', 'GOODS006', 40, TO_DATE('2019/6/15','YYYY-MM-DD'));
INSERT INTO HAND_SALES_RECORDS(CUSTOMERS_NO, SELLER_NO, GOODS_NO, SALES_QUANTY, SALES_DATE) values 
('C001', 'X003', 'GOODS001', 10, TO_DATE('2019/6/19','YYYY-MM-DD'));
INSERT INTO HAND_SALES_RECORDS(CUSTOMERS_NO, SELLER_NO, GOODS_NO, SALES_QUANTY, SALES_DATE) values 
('C002', 'X002', 'GOODS002', 41, TO_DATE('2019/4/11','YYYY-MM-DD'));
INSERT INTO HAND_SALES_RECORDS(CUSTOMERS_NO, SELLER_NO, GOODS_NO, SALES_QUANTY, SALES_DATE) values 
('C003', 'X003', 'GOODS003', 30, TO_DATE('2019/3/12','YYYY-MM-DD'));
INSERT INTO HAND_SALES_RECORDS(CUSTOMERS_NO, SELLER_NO, GOODS_NO, SALES_QUANTY, SALES_DATE) values 
('C003', 'X003', 'GOODS004', 60, TO_DATE('2019/6/11','YYYY-MM-DD'));
INSERT INTO HAND_SALES_RECORDS(CUSTOMERS_NO, SELLER_NO, GOODS_NO, SALES_QUANTY, SALES_DATE) values 
('C003', 'X002', 'GOODS005', 76, TO_DATE('2019/6/19','YYYY-MM-DD'));
INSERT INTO HAND_SALES_RECORDS(CUSTOMERS_NO, SELLER_NO, GOODS_NO, SALES_QUANTY, SALES_DATE) values 
('C003', 'X001', 'GOODS006', 68, TO_DATE('2019/6/25','YYYY-MM-DD'));

INSERT INTO HAND_SALES_RECORDS(CUSTOMERS_NO, SELLER_NO, GOODS_NO, SALES_QUANTY, SALES_DATE) values 
('C004', 'X005', 'GOODS005', 32, TO_DATE('2018/6/18','YYYY-MM-DD'));

COMMIT;
View Code

二.Sql语句题:

  1.条件:查询没有卖出过“商品B”的销售人员信息 显示:销售员编码,销售员名称,管理员编码,管理员名称 :

--1
SELECT hs.seller_no
,hs.seller_name
,hsm.seller_no
,hsm.seller_name
FROM hand_sellers hs
,hand_sellers hsm
WHERE hs.manager_no = hsm.seller_no(+)
AND NOT EXISTS (SELECT 1
FROM hand_sales_records hsr
,hand_goods hg
WHERE hsr.goods_no = hg.goods_no
AND hg.goods_name = '商品B'
AND hsr.seller_no = hs.seller_no);
--2
SELECT hs.seller_no
,hs.seller_name
,hsm.seller_no
,hsm.seller_name
FROM hand_sellers hs
,hand_sellers hsm
WHERE hs.manager_no = hsm.seller_no(+)
AND hs.seller_no NOT IN (SELECT hsr.seller_no
FROM hand_sales_records hsr
,hand_goods hg
WHERE hsr.goods_no = hg.goods_no
AND hg.goods_name = '商品B');
--考点:外连接、NOT EXISTS 和 NOT IN 的用法及区别     

    小结:

      1.in和exists:

        in是把外表和内表作hash连接(会用到外表上的索引),而exists是对外表作loop循环(用到内表上的索引),每次loop循环再对内表进行查询,如果查询的两个表大小相当,那么用in和exists差别不大;如果两个表中一个较小一个较大,则子查询表大的用exists,子查询表小的用in;

      2.not in和not exists:

        not in 逻辑上不完全等同于not exists。使用not in时,如果子查询中返回的任意一条记录含有空值,则查询将不返回任何记录。如果子查询字段有非空限制,这时可以使用not in,并且可以通过提示让它用hasg_aj或merge_aj连接。如果查询语句使用了not in,那么对内外表都进行全表扫描,没有用到索引;而not exists的子查询依然能用到表上的索引。所以无论哪个表大,用not exists都比not in 要快

      参照:https://blog.csdn.net/baidu_37107022/article/details/77278381

  2.条件:查询6 月中旬,所有顾客的消费情况。显示:顾客编号、顾客名称、顾客性别、销售商品、销售时间、销售数量排序:消费数量从高到低。说明:如果没有消费记录,销售商品、销售时间、销售数量留空

  

--1
SELECT hc.customers_no
,hc.customers_name
,hc.customers_gender
,hg.goods_name
,hsr.sales_date
,hsr.sales_quanty
FROM hand_sales_records hsr
,hand_goods hg
,hand_customers hc
WHERE hsr.goods_no = hg.goods_no(+)
AND hsr.customers_no(+) = hc.customers_no
--AND hsr.sales_date(+) BETWEEN to_date('2019-06-10', 'yyyy-mm-dd') AND
to_date('2019-06-20', 'yyyy-mm-dd')
AND to_char(hsr.sales_date(+), 'MM') = '06'
AND to_char(hsr.sales_date(+), 'DD') BETWEEN 10 AND 20
ORDER BY hsr.sales_quanty DESC;
--2
SELECT hc.customers_no
,hc.customers_name
,hc.customers_gender
,hg.goods_name
,hsr.sales_date
,hsr.sales_quanty
FROM hand_sales_records hsr
,hand_goods hg
,hand_customers hc
WHERE hsr.goods_no = hg.goods_no
AND hsr.customers_no = hc.customers_no
AND hsr.sales_date BETWEEN to_date('2019-06-10', 'yyyy-mm-dd') AND
to_date('2019-06-20', 'yyyy-mm-dd')
ORDER BY hsr.sales_quanty DESC;
--考点:外连接,日期函数

    小结:

        1.查两表关联列相等的数据用内连接。
      2.Col_L是Col_R的子集时用右外连接。
      3.Col_R是Col_L的子集时用左外连接。
      4.Col_R和Col_L彼此有交集但彼此互不为子集时候用全外。
      5.求差操作的时候用联合查询。

  3.条件:查询购买记录3条以上的顾客信息。 显示:顾客编号、顾客名称、顾客出生日期 :

--1
SELECT hc.customers_no
,hc.customers_name
,hc.customers_birth_date
FROM hand_customers hc
WHERE hc.customers_no IN (SELECT hsr.customers_no
FROM hand_sales_records hsr
GROUP BY hsr.customers_no HAVING COUNT(1) > 3);
--2
SELECT hc.customers_no
,hc.customers_name
,hc.customers_birth_date
FROM hand_customers hc
WHERE EXISTS (SELECT 1
FROM hand_sales_records hsr
WHERE hc.customers_no = hsr.customers_no
GROUP BY hsr.customers_no
HAVING COUNT(1) > 3);

    小结:  

      where是筛选行,having是筛选已经查询出来的字段。

  4.条件:查询顾客中姓氏为"张""李""刘"的顾客信息显示:顾客编号、顾客名称、顾客,出生日期。排序:顾客出生日期从近到远。说明:正则表达式。除正则表达式以外的其他方式:

  

--正则
SELECT hc.customers_no
,hc.customers_name
,hc.customers_birth_date
FROM hand_customers hc
WHERE regexp_like(hc.customers_name, '张.*|^李.*|^刘.*');
--Like
SELECT hc.customers_no
,hc.customers_name
,hc.customers_birth_date
FROM hand_customers hc
WHERE (hc.customers_name LIKE '张%' OR hc.customers_name LIKE '李%' OR
hc.customers_name LIKE '刘%');

   5.

猜你喜欢

转载自www.cnblogs.com/lyq-biu/p/11335679.html