oracle综合练习

综合练习

##商品表
create table product(
id number(6) primary key,
name varchar2(20),
price number(6,1),
type varchar2(6)
);

insert into product values(1, '冰箱', 1500.0, '家电');
insert into product values(2, '苹果', 3.0, '水果');
insert into product values(3, '李子', 7.0, '水果');
insert into product values(4, '电视', 6000.0, '家电');
insert into product values(5, '台灯', 20.0, '家电');

##顾客表
create table customer(
acid number(6) primary key,
acname varchar2(20),
acaddress varchar2(30)
);
insert into customer values(1, '张三', '北京');
insert into customer values(2, '李四', '上海');
insert into customer values(3, '王五', '天津');

##定单表
create table orders(
acid number(6) references customer(acid),
id number(6) references product(id),
amount number(3),
constraint pk primary key(acid, id)
);
insert into orders values(1,1,12);
insert into orders values(3,1,1);
insert into orders values(2,2,3);
insert into orders values(1,3,1);
insert into orders values(1,2,4);
insert into orders values(3,5,4);

##求取买过李子的顾客名称及地址的查询语句
select c.acname, c.acaddress from orders o, customer c
where o.acid = c.acid(+) 
and o.id = (select id from product where name = '李子');

##求取既买过李子双买过苹果的顾客名称
select distinct c.acname from orders o, customer c
where o.acid = c.acid(+) 
and o.id in (select id from product where name = '李子' or name = '苹果');

##求取每个顾客在购买水果和家电上分别花了多少钱(要求查询结果为每个顾客一行)
select sum(price*amount) from orders o, product p where o.id = p.id(+)
group by acid;


水果表:
CREATE TABLE fruits
(
  f_id  char(3),  
  s_id  number(4),
  f_name varchar2(20),
  f_price number(4,1)
) ;

水果数据:INSERT INTO fruits (f_id, s_id, f_name, f_price)
VALUES('a1', 101,'apple',5.2),
('b1',101,'blackberry', 10.2),
('bs1',102,'orange', 11.2),
('bs2',105,'melon',8.2),
('t1',102,'banana', 10.3),
('t2',102,'grape', 5.3),  
('o2',103,'coconut', 9.2),
('c0',101,'cherry', 3.2),
('a2',103, 'apricot',2.2),
('l2',104,'lemon', 6.4),
('b2',104,'berry', 7.6),
('m1',106,'mango', 15.6),
('m2',105,'xbabay', 2.6),
('t4',107,'xbababa', 3.6),
('m3',105,'xxtt', 11.6),
('b5',107,'xxxx', 3.6);


顾客表:CREATE TABLE customers
(
  c_id   number(7),   
  c_name   varchar2(50),
  c_address varchar2(50),
  c_city   varchar2(50), 
  c_zip    varchar2(50), 
  c_contact varchar2(50),
  c_email  varchar2(250)
);

顾客数据:INSERT INTO customers(c_id, c_name, c_address, c_city, c_zip,  c_contact, c_email) 
VALUES(10001, 'RedHook', '200 Street ', 'Tianjin',  '300000',  'LiMing', '[email protected]'),
(10002, 'Stars', '333 Fromage Lane', 'Dalian', '116000',  'Zhangbo','[email protected]'),
(10003, 'Netbhood', '1 Sunny Place', 'Qingdao',  '266000', 'LuoCong', NULL),
(10004, 'JOTO', '829 Riverside Drive', 'Haikou',  '570000',  'YangShan', '[email protected]');

供应商表:CREATE TABLE suppliers
(
  s_id  number(6),    
  s_name  varchar2(50),
  s_city   varchar2(50), 
  s_zip   varchar2(50), 
  s_call   char(50)
); 

供应商数据:INSERT INTO suppliers(s_id, s_name,s_city,  s_zip, s_call)
VALUES(101,'FastFruit Inc.','Tianjin','300000','48075'),
(102,'LT Supplies','Chongqing','400000','44333'),
(103,'ACME','Shanghai','200000','90046'),
(104,'FNK Inc.','Zhongshan','528437','11111'),
(105,'Good Set','Taiyuang','030000', '22222'),
(106,'Just Eat Ours','Beijing','010', '45678'),
(107,'DK Inc.','Zhengzhou','450000', '33332');

订单条目表:
CREATE TABLE orderitems
(
  o_num   number(6),   
  o_item  number(6),  
  f_id    char(3),
  quantity   number(4),
  item_price number(8, 2)
) ;

订单条目数据:INSERT INTO orderitems(o_num, o_item, f_id, quantity, item_price)
VALUES(30001, 1, 'a1', 10, 5.2),
(30001, 2, 'b2', 3, 7.6),
(30001, 3, 'bs1', 5, 11.2),
(30001, 4, 'bs2', 15, 9.2),
(30002, 1, 'b3', 2, 20.0),
(30003, 1, 'c0', 100, 10),
(30004, 1, 'o2', 50, 2.50),
(30005, 1, 'c0', 5, 10),
(30005, 2, 'b1', 10, 8.99),
(30005, 3, 'a2', 10, 2.2),
(30005, 4, 'm1', 5, 14.99);

订单表:CREATE TABLE orders
(
  o_num  number(6),
  o_date date,
  c_id  number(7) 
) ;

订单数据:
INSERT INTO orders(o_num, o_date, c_id)
VALUES(30001, to_date('2008-09-01', 'yyyy-mm-dd'), 10001);
INSERT INTO orders(o_num, o_date, c_id)
VALUES(30002, to_date('2008-09-12','yyyy-mm-dd'), 10003);
INSERT INTO orders(o_num, o_date, c_id)
VALUES(30003, to_date('2008-09-30','yyyy-mm-dd'), 10004);
INSERT INTO orders(o_num, o_date, c_id)
VALUES(30004,to_date( '2008-10-03','yyyy-mm-dd'), 10005);
INSERT INTO orders(o_num, o_date, c_id)
VALUES(30005, to_date('2008-10-08','yyyy-mm-dd'), 10001);

【例7.1】从fruits表中检索所有字段的数据
	select * from fruits;

【例7.2】查询当前表中f_name列所有水果名称,输入如下语句:
	select f_name from fruits;

【例7.3】例如,从fruits表中获取f_name和f_price两列,输入如下语句:
	select f_name, f_price from fruits;

【例7.4】查询价格为10.2元的水果的名称,输入如下语句:
	select f_name, f_price from fruits;

【例7.5】查找名称为“apple”的水果的价格,输入如下语句:
	select f_name, f_price from fruits where f_name = 'apple';

【例7.6】查询价格小于10的水果的名称,输入如下语句:
	select f_name, f_price from fruits where f_price < 10;

in 关键字查询

【例7.7】s_id为101和102的记录,输入如下语句:
	select * from fruits where s_id in (101, 102);

【例7.8】查询所有s_id不等于101也不等于102的记录,输入如下语句:
	select * from fruits where s_id not in (101, 102);

between ...and 查询

【例7.9】查询价格在2.00元到10.5元之间水果名称和价格
	select * from fruits where f_price between 2.00 and 10.5;

【例7.10】查询价格在2.00元到10.5元之外的水果名称和价格
	select * from fruits where f_price not between 2.00 and 10.5;

【例7.11】查找所有以‘b’字母开头的水果,输入如下语句:
	select * from fruits where f_name like 'b%';

【例7.12】在fruits表中,查询f_name中包含字母‘g’的记录
	select * from fruits where f_name like '%g%';

【例7.13】查询以‘b’开头,并以‘y’结尾的水果的名称
	select * from fruits where f_name like 'b%y';

【例7.14】在fruits表中,查询以字母‘y’结尾,且‘y’前面只有4个字母的记录
	selcet * from fruits where f_name like '____y';

null 

【例7.15】查询customers表中c_email为空的记录的c_id、c_name和c_email字段值:
	select c_id, c_name, c_email from customers where c_email is null;

【例7.16】查询customers表中c_email不为空的记录的c_id、c_name和c_email字段值
	select c_id, c_name, c_email from customers where c_email is not null;

and 多条件查询 

【例7.17】在fruits表中查询s_id = ‘101’,并且f_price大于5的记录价格和名称
	select f_name, f_price from fruits where s_id = '101' and f_price > 5;

【例7.18】在fruits表中查询s_id = ‘101’或者’102’,并且f_price大于5,并且f_name=’apple’的记录价格和名称
	select f_name, f_price from fruits where s_id in(101, 102) and f_price > 5 and f_name = 'apple';

带or 多条件查询 

【例7.19】查询s_id=101或者s_id=102的水果的f_price和f_name,SQL语句如下:
	select f_name, f_name from fruits where s_id = 101 or s_id = 102;

【例7.21】查询fruits表中s_id字段的值,并返回s_id字段值不得重复
	select distinct s_id from fruits;

order by 排序查询 

【例7.22】查询fruits表的f_name字段值,并对其进行排序
	select f_name from fruits order by f_name asc;

【例7.23】查询fruits表中的f_name和f_price字段,先按f_name排序,再按f_price排序
	select f_name, f_price from fruits order by f_name asc, f_price asc;

ASC 和 DESC 按照指定方向进行排序

【例7.24】查询fruits表中的f_name和f_price字段,对结果按f_price降序方式排序
	select f_name, f_price from fruits order by f_price desc;

【例7.25】查询fruits表,先按f_price降序排序,再按f_name字段升序排序,SQL语句如下:
	select * from fruits order by f_price desc, f_name asc;

分组查询 group by 

【例7.26】根据s_id对fruits表中的数据进行分组
	select s_id,count(s_id) from fruits group by s_id;

【例7.29】根据s_id对fruits表中的数据进行分组,并显示记录数量
	select s_id,count(s_id) from fruits group by s_id;

【例7.30】根据s_id和f_name字段对fruits表中的数据进行分组, SQL语句如下,
	select s_id, f_name, count(s_id) from fruits group by s_id f_name;

【例7.31】查询订单价格大于100的订单号和总订单价格
	select o_num, sum(item_price * quantity) from orderitems group by o_num having sum(item_price * quantity) > 100;

【例7.32】显示fruits表查询结果的前4行,输入如下语句:
	select * from fruits where rownum <= 5;

【例7.34】查询customers表中总的行数
	select count(*) from customers;

【例7.35】查询customers表中有电子邮箱的顾客的总数,输入如下语句:
	select count(c_email) from customers;

【例7.36】在orderitems表中,使用COUNT()函数统计不同订单号中订购的水果种类
	select o_num, count(*) from orderitems group by o_num;

【例7.37】在orderitems表中查询30005号订单一共购买的水果总量,输入如下语句:
	SELECT SUM(quantity) AS items_total FROM orderitems WHERE o_num = 30005;

【例7.38】在orderitems表中,使用SUM()函数统计不同订单号中订购的水果总量
	SELECT o_num, SUM(quantity) AS items_total FROM orderitems GROUP BY o_num;

【例7.39】在fruits表中,查询s_id=103的供应商的水果价格的平均值,SQL语句如下:
	SELECT AVG(f_price) AS avg_price FROM fruits WHERE s_id = 103;

【例7.40】在fruits表中,查询每一个供应商的水果价格的平均值,SQL语句如下:
	SELECT s_id,AVG(f_price) AS avg_price FROM fruits GROUP BY s_id;

【例7.41】在fruits表中查找市场上价格最高的水果,SQL语句如下:
	SELECT MAX(f_price) AS max_price FROM fruits;

【例7.42】在fruits表中查找不同供应商提供的价格最高的水果
	SELECT s_id, MAX(f_price) AS max_price FROM fruits GROUP BY s_id;

【例7.43】在fruits表中查找f_name的最大值,SQL语句如下
	SELECT MAX(f_name) from fruits;

【例7.44】在fruits表中查找市场上价格最低的水果,SQL语句如下:
	SELECT MIN(f_price) AS min_price FROM fruits;

【例7.45】在fruits表中查找不同供应商提供的价格最低的水果
	SELECT s_id, MIN(f_price) AS min_price	FROM fruits GROUP BY s_id;

【例7.46】在fruits表和suppliers表之间使用内连接查询,查询之前,查看两个表的结构,
	SELECT suppliers.s_id, s_name,f_name, f_price
	FROM fruits ,suppliers
	WHERE fruits.s_id = suppliers.s_id;
【例7.47】在fruits表和suppliers表之间使用INNER JOIN语法进行内连接查询
	SELECT suppliers.s_id, s_name,f_name, f_price
	FROM fruits, suppliers
	where fruits.s_id = suppliers.s_id;

 自连接查询
【例7.48】查询供应f_id=’a1’的水果供应商提供的其他水果种类
	SELECT f1.f_id, f1.f_name
	FROM fruits AS f1, fruits AS f2
	WHERE f1.s_id = f2.s_id AND f2.f_id = 'a1';

 外连接查询

【例7.49】在customers表和orders表中,查询所有客户,包括没有订单的客户,SQL语法如下,
	SELECT customers.c_id, orders.o_num
	FROM customers,orders
	where customers.c_id = orders.c_id(+);

【例7.50】在customers表和orders表中,查询所有订单,包括没有客户的订单
	SELECT customers.c_id, orders.o_num
	from customers, orders
	ON customers.c_id(+) = orders.c_id;

【例7.51】在customers表和orders表中,使用INNER JOIN语法查询customers表中ID为10001的客户的订单信息
	自己完成
【例7.52】在fruits表和suppliers表之间使用INNER JOIN语法进行内连接查询,并对查询结果排序
	自己完成
子查询

定义两个表tb1和tb2
CREATE table tbl1 ( num1 INT NOT NULL);
CREATE table tbl2 ( num2 INT NOT NULL);
向两个表中插入数据,
INSERT INTO tbl1 values(1), (5), (13), (27);
INSERT INTO tbl2 values(6), (14), (11), (20);

带any查询
【例7.53】返回tbl2表的所有 num2 列,然后将 tbl1 中的 num1 的值与之进行比较,只要大于 num2的任何值为符合查询条件的结果。
	SELECT num1 FROM tbl1 WHERE num1 > ANY (SELECT num2 FROM tbl2);

带all 查询
【例7.54】返回tbl1表的中比tbl2表num2 列所有值都大的值
	SELECT num1 FROM tbl1 WHERE num1 > ALL (SELECT num2 FROM tbl2);

exists 查询

【例7.55】查询表suppliers表中是否存在s_id=107的供应商,如果存在则查询fruits表中的记录
	SELECT * from fruits
	WHERE EXISTS
	(SELECT s_name FROM suppliers WHERE s_id = 107);

【例7.56】查询表suppliers表中是否存在s_id=107的供应商,如果存在则查询fruits表中的f_price大于10.20的记录
	SELECT * from fruits
	WHERE f_price>10.20 AND EXISTS
	(SELECT s_name FROM suppliers WHERE s_id = 107);


【例7.57】查询表suppliers表中是否存在s_id=107的供应商,如果不存在则查询fruits表中的记录
	SELECT * from fruits
	WHERE NOT EXISTS
	(SELECT s_name FROM suppliers WHERE s_id = 107);

带in的关键字的子查询

【例7.58】在orderitems表中查询订购f_id为c0的订单号,并根据订单号查询具有订单号的客户c_id
	SELECT c_id FROM orders WHERE o_num IN
	(SELECT o_num  FROM orderitems WHERE f_id = 'c0');

【例7.59】与前一个例子语句类似,但是在SELECT语句中使用NOT IN操作符
	SELECT c_id FROM orders WHERE o_num NOT IN
	(SELECT o_num  FROM orderitems WHERE f_id = 'c0');

带比较运算符的子查询

【例7.60】在suppliers表中查询s_city等于Tianjin的供应商s_id,然后在fruits表中查询所有该供应商提供的水果的种类
	SELECT s_id, f_name FROM fruits
	WHERE s_id =
	(SELECT s1.s_id from suppliers AS s1 WHERE s1.s_city = 'Tianjin');

【例7.61】在suppliers表中查询s_city等于Tianjin的供应商s_id,然后在fruits表中查询所有非该供应商提供的水果的种类,SQL语句如下,
	SELECT s_id, f_name FROM fruits
	WHERE s_id <>
	(SELECT s1.s_id from suppliers AS s1 WHERE s1.s_city = 'Tianjin');

合并查询结果 (UNION)

【例7.62】查询所有价格小于9的水果的列表,查询s_id等于101和103所有的水果种类,使用UNION连接查询结果
SELECT s_id, f_name, f_price 
FROM fruits
WHERE f_price < 9.0
UNION
SELECT s_id, f_name, f_price 
FROM fruits
WHERE s_id IN(101,103);

为表和字段取别名

【例7.64】为orders表取别名o,查询订30001订单的下单日期
SELECT * from orders AS o 
WHERE o.o_num = 30001;
【例7.65】为customers和orders表分别取别名,并进行连接查询
SELECT c.c_id, o.o_num
FROM customers AS c ,AS o
ON c.c_id = o.c_id(+);

为字段取别名

【例7.66】查询fruits表,为f_name取别名fruit_name,f_price取别名fruit_price,为fruits表取别名f1,查询表中f_price < 8的水果的名称
SELECT f1.f_name AS fruit_name, f1.f_price AS fruit_price
FROM fruits AS f1
WHERE f1.f_price < 8;

猜你喜欢

转载自blog.csdn.net/fengqing5578/article/details/80620042