SQL练习

空扰寡人 提交于 2019-11-26 19:12:26

/题目1
创建 Person表 找到存在重复邮箱的信息
/

CREATE TABLE Person(
id INT,Email VARCHAR(20) )

INSERT INTO Person(id,Email) VALUES(1,'163@qq.com');
INSERT INTO Person(id,Email) VALUES(8,'161@qq.com');
INSERT INTO Person(id,Email) VALUES(3,'162@qq.com');
INSERT INTO Person(id,Email) VALUES(4,'161@qq.com');
INSERT INTO Person(id,Email) VALUES(5,'163@qq.com');
INSERT INTO Person(id,Email) VALUES(6,'163@qq.com');
INSERT INTO Person(id,Email) VALUES(7,'163@qq.com');

SELECT * FROM Person GROUP BY Email HAVING COUNT(*)>1;

/*题目2
找到国家面积超过300平方公里 人口超过2500万
*/

/*

name continent area population gdp

±----------------±-----------±-----------±-------------±--------------+

Afghanistan Asia 652230 25500100 20343000
Albania Europe 28748 2831741 12960000
Algeria Africa 2381741 37100000 188681000
Andorra Europe 468 78115 3712000
Angola Africa 1246700 20609294 100990000

±----------------±-----------±-----------±-------------±--------------+
*/

 CREATE TABLE World(
 name1 VARCHAR(20),
 continent VARCHAR(20),
 area1 VARCHAR(20),
 population VARCHAR(20),
 gdp VARCHAR(20))

 INSERT INTO World(name1,continent,area1,population,gdp) VALUES('Afghanistan','Asia ','652230','25500100','20343000');
 INSERT INTO World(name1,continent,area1,population,gdp) VALUES('Albania','Europe ','28748','283174','12960000');
 INSERT INTO World(name1,continent,area1,population,gdp) VALUES('Algeria','Africa ','2381741','371000000','18868000');
 INSERT INTO World(name1,continent,area1,population,gdp) VALUES('Andorra','Europe ','498','78115','3712000');
 INSERT INTO World(name1,continent,area1,population,gdp) VALUES('Angola','Africa ','1246700','20609294','100990000');
  SELECT *FROM world WHERE CAST(area1 AS SIGNED)>300000 AND CAST(population AS SIGNED)> 250000;

 SELECT CAST('652230' AS SIGNED);  /*CAST(value as type)*/

/*
point 保存了一些点在x轴上的坐标 坐标都是整数 找到最近两个点之间的距离

*/

CREATE TABLE point1(point1
 x1 INT
);
INSERT INTO point1(x1) VALUES(-1);
INSERT INTO point1(x1) VALUES(0);
INSERT INTO point1(x1) VALUES(1);
INSERT INTO point1(x1) VALUES(3);

SELECT p2.x1-p1.x1 FROM point1 p1 LEFT JOIN point1 p2 ON p1.x1<>p2.x1  ORDER BY (p2.x1- p1.x1) DESC

/*

找出所有影片描述为非 boring (不无聊) 的并且 id 为奇数 的影片,结果请按等级 rating 排列。

±--------±----------±-------------±----------+

| id | movie | description | rating |

±--------±----------±-------------±----------+

| 1 | War | great 3D | 8.9 |

| 2 | Science | fiction | 8.5 |

| 3 | irish | boring | 6.2 |

| 4 | Ice song | Fantacy | 8.6 |

| 5 | House card| Interesting| 9.1 |

±--------±----------±-------------±----------+
*/

CREATE TABLE movie(
id INT,
movie VARCHAR(20),
description VARCHAR(20),
rating DOUBLE
)
INSERT INTO movie(id,movie,description,rating) VALUES (1,'war','great3D',8.9),
          (2,'Science','fiction',8.5),(3,'irsih','boring',6.2),(4,'Ice song','Fantacy',8.6),(5,'Houser card','Interesting',9.1);
          
SELECT *FROM movie WHERE description = 'boring' AND id MOD 2 =1;

/*
在表 order 中找到订单数最多客户对应的 customer_number 。

数据保证订单数最多的顾客恰好只有一位。

表 orders 定义如下:

| Column | Type |

|-------------------|-----------|

| order_number (PK) | int |

| customer_number | int |

| order_date | date |

| required_date | date |

| shipped_date | date |

| status | char(15) |

| comment | char(200) |

样例输入

| order_number | customer_number | order_date | required_date | shipped_date | status | comment |

|--------------|-----------------|------------|---------------|--------------|--------|---------|

| 1 | 1 | 2017-04-09 | 2017-04-13 | 2017-04-12 | Closed | |

| 2 | 2 | 2017-04-15 | 2017-04-20 | 2017-04-18 | Closed | |

| 3 | 3 | 2017-04-16 | 2017-04-25 | 2017-04-20 | Closed | |

| 4 | 3 | 2017-04-18 | 2017-04-28 | 2017-04-25 | Closed | |

*/

CREATE TABLE orders (
 order_number INT PRIMARY KEY,
 customer_number INT,
 order_date DATE,
 required_date DATE,
 shipped_date DATE,
 status1 CHAR(15),
 comment1 CHAR(200)
)
INSERT INTO 
orders(order_number,customer_number,order_date,required_date,shipped_date,status1,comment1)
VALUES
(1,1,'2017-04-09','2017-04-13','2017-04-12','Closed','comment1'),
(2,1,'2017-04-09','2017-04-13','2017-04-12','Closed','comment1'),
(3,3,'2017-04-09','2017-04-13','2017-04-12','Closed','comment1'),
(4,3,'2017-04-09','2017-04-13','2017-04-12','Closed','comment1'),
(5,3,'2017-04-09','2017-04-13','2017-04-12','Closed','comment1');
SELECT MAX(p1.customer_number)FROM (SELECT customer_number FROM orders GROUP BY(customer_number) HAVING COUNT(customer_number)) p1

/*
表1: Person

±------------±--------+

| 列名 | 类型 |

±------------±--------+

| PersonId | int |

| FirstName | varchar |

| LastName | varchar |

±------------±--------+

PersonId 是上表主键*/

CREATE TABLE Person1(
personid INT,
firstname VARCHAR(10),
lastname VARCHAR(10)
)
INSERT INTO Person1(PersonId,firstname,lastname) VALUES
(1,'li1','wang1'),
(2,'li1','wang1'),
(3,'li1','wang1'),
(4,'li1','wang1')
CREATE TABLE Address(
addressid INT,
personid INT,
citv VARCHAR(10),
state VARCHAR(10)
)
INSERT INTO address(addressid,personid,citv,state)VALUES
(2,1,'dizi1','com'),
(2,2,'dizi2','com'),
(2,3,'dizi3','com'),
(2,5,'dizi4','com'),
(2,6,'dizi5','com')

/*

表2: Address

±------------±--------+

| 列名 | 类型 |

±------------±--------+

| AddressId | int |

| PersonId | int |

| City | varchar |

| State | varchar |

±------------±--------+

AddressId 是上表主键

编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:

FirstName, LastName, City, State

*/

SELECT * FROM person1 LEFT JOIN address ON person1.personid=address.personid

/*
给定一个 salary 表,如下所示,有 m = 男性 和 f = 女性 的值。

交换所有的 f 和 m 值(例如,将所有 f 值更改为 m,反之亦然)。

要求只使用一个更新(Update)语句,并且没有中间的临时表。

注意,您必只能写一个 Update 语句,请不要编写任何 Select 语句。

例如:

| id | sex

*/

CREATE TABLE salary(
id INT,
sex CHAR(2)
);
INSERT INTO salary(id,sex) VALUES
(1,'m'),
(2,'f'),
(3,'f'),
(4,'f'),
(5,'m')
UPDATE salary 
SET sex= 
CASE 
WHEN(sex='f')
THEN 'm'
WHEN(sex='m')
THEN 'f'
ELSE sex END;

/*
给定表 customer ,里面保存了所有客户信息和他们的推荐人。

±-----±-----±----------+

| id | name | referee_id|

±-----±-----±----------+

| 1 | Will | NULL |

| 2 | Jane | NULL |

| 3 | Alex | 2 |

| 4 | Bill | NULL |

| 5 | Zack | 1 |

| 6 | Mark | 2 |

±-----±-----±----------+

写一个查询语句,返回一个编号列表,列表中编号的推荐人的编号都 不是 2。

对于上面的示例数据,结果为:

±-----+

| name |

±-----+

| Will |

| Jane |

| Bill |

| Zack |

±-----+

答案:

*/


/*

ActorDirector 表:

±------------±--------+

| Column Name | Type |

±------------±--------+

| actor_id | int |

| director_id | int |

| timestamp | int |

±------------±--------+

timestamp 是这张表的主键.

写一条SQL查询语句获取合作过至少三次的演员和导演的 id 对 (actor_id, director_id)

示例:

ActorDirector 表:

±------------±------------±------------+

| actor_id | director_id | timestamp |

±------------±------------±------------+

| 1 | 1 | 0 |

| 1 | 1 | 1 |

| 1 | 1 | 2 |

| 1 | 2 | 3 |

| 1 | 2 | 4 |

| 2 | 1 | 5 |

| 2 | 1 | 6 |

±------------±------------±------------+
*/

CREATE TABLE actordirector
(actor INT,
director INT,
timestamp1 INT)
INSERT INTO actordirector(actor,director,timestamp1)
VALUES(1,1,0),
(1,1,1),
(1,1,2),
(1,2,3),
(1,2,4),
(2,1,5),
(2,1,6)
INSERT INTO actordirector(actor,director,timestamp1) VALUES(1,1,0)

CREATE TABLE result
(actor INT,
director INT);
INSERT INTO result(actor,director)VALUES 
(1,1) 

SELECT * FROM (SELECT actor,director FROM actordirector WHERE actor = director) p1 GROUP BY actor HAVING COUNT(*)>2 

Result 表:

±------------±------------+

| actor_id | director_id |

±------------±------------+

| 1 | 1 |

±------------±------------+

唯一的 id 对是 (1, 1),他们恰好合作了 3 次。
*/

/*

选出所有 bonus < 1000 的员工的 name 及其 bonus。

Employee 表单

±------±-------±----------±-------+

| empId | name | supervisor| salary |

±------±-------±----------±-------+

| 1 | John | 3 | 1000 |

| 2 | Dan | 3 | 2000 |

| 3 | Brad | null | 4000 |

| 4 | Thomas | 3 | 4000 |

±------±-------±----------±-------+

empId 是这张表单的主关键字*/

CREATE TABLE employee 
( empid INT,
name1 VARCHAR(20),
supervisor INT,
salary INT);

INSERT INTO employee(empid,name1,supervisor,salary) VALUES
(1,'John',3,1000),
(2,'Dan',3,2000),
(3,'Brad',0,4000),
(4,'Thomas',3,4000)
ALTER TABLE employee ADD PRIMARY KEY(empid)

------

SELECT *FROM employee LEFT JOIN bonus ON employee.empid = bonus.empid WHERE bonus.bonus<2000

/*

Bonus 表单

±------±------+

| empId | bonus |

±------±------+

| 2 | 500 |

| 4 | 2000 |

±------±------+

empId 是这张表单的主关键字*/

CREATE TABLE bonus(
empid INT,
bonus INT
);
INSERT INTO bonus(empid,bonus) VALUES(2,500),
(4,2000)

/*

输出示例:

±------±------+

| name | bonus |

±------±------+

| John | null |

| Dan | 500 |

| Brad | null |

±------±------+

/
/

Employee 表包含所有员工,他们的经理也属于员工。每个员工都有一个 Id,此外还有一列对应员工的经理的 Id。

±—±------±-------±----------+

| Id | Name | Salary | ManagerId |

±—±------±-------±----------+

| 1 | Joe | 70000 | 3 |

| 2 | Henry | 80000 | 4 |

| 3 | Sam | 60000 | NULL |

| 4 | Max | 90000 | NULL |

±—±------±-------±----------+

给定 Employee 表,编写一个 SQL 查询,该查询可以获取收入超过他们经理的员工的姓名。在上面的表格中,Joe 是唯一一个收入超过他的经理的员工。

±---------+

| Employee |

±---------+

| Joe |

±---------+

*/

CREATE TABLE employee1(
id INT ,
name1 VARCHAR(8),
salary INT,
manageid INT)
INSERT INTO employee1(id,name1,salary,manageid) VALUES
(1,'Joe',70000,3),
(2,'Henry',80000,4),
(3,'sam',60000,NULL),
(4,'Max',90000,NULL)
SELECT *FROM employee1 e1 LEFT JOIN employee1 e2 ON e1.manageid = e2.id WHERE e1.salary>e2.salary

/*

某网站包含两个表,Customers 表和 Orders 表。编写一个 SQL 查询,找出所有从不订购任何东西的客户。

Customers 表:

±—±------+

| Id | Name |

±—±------+

| 1 | Joe |

| 2 | Henry |

| 3 | Sam |

| 4 | Max |

±—±------+
*/

CREATE TABLE customers 
(
id INT,
name1 VARCHAR(20)
);
INSERT INTO customers(id,name1)
VALUES(1,'joe'),
(2,'Henry'),
(3,'Sam'),
(4,'max')
CREATE TABLE orders1(
id INT,
customerid INT
);
INSERT INTO orders1(id,customerid)
VALUES(1,3),(2,1)

SELECT *FROM customers LEFT JOIN orders1 ON orders1.customerid= customers.id WHERE customerid IS NULL
/*

Orders 表:

±—±-----------+

| Id | CustomerId |

±—±-----------+

| 1 | 3 |

| 2 | 1 |

±—±-----------+

例如给定上述表格,你的查询应返回:

±----------+

| Customers |

±----------+

| Henry |

| Max |

±----------+

答案:

/
/

一个小学生 Tim 的作业是判断三条线段是否能形成一个三角形。

然而,这个作业非常繁重,因为有几百组线段需要判断。

假设表 table 保存了所有三条线段的三元组 x, y, z ,你能帮 Tim 写一个查询语句,来判断每个三元组是否可以组成一个三角形吗?

| x | y | z |

|----|----|----|

| 13 | 15 | 30 |

| 10 | 20 | 15 |

对于如上样例数据,你的查询语句应该返回如下结果:

| x | y | z | triangle |

|----|----|----|----------|

| 13 | 15 | 30 | No |

| 10 | 20 | 15 | Yes |
*/

CREATE TABLE sjx (
X INT,
Y INT,
z INT);
INSERT INTO sjx(X,Y,z)
VALUES(13,15,30),
(10,20,15)
SELECT * ,a FROM sjx 

WHEN(X+Y>z AND X+z>Y AND z+Y>X)



SELECT *,IF( X+Y>z AND X+z>Y AND Y+z>X , 'Yes','No') AS triangle
FROM sjx

/*

描述

给定 3 个表: salesperson, company, orders。

输出所有表 salesperson 中,没有向公司 ‘RED’ 销售任何东西的销售员。

解释

输入

表: salesperson

±---------±-----±-------±----------------±----------+

| sales_id | name | salary | commission_rate | hire_date |

±---------±-----±-------±----------------±----------+

| 1 | John | 100000 | 6 | 4/1/2006 |

| 2 | Amy | 120000 | 5 | 5/1/2010 |

| 3 | Mark | 65000 | 12 | 12/25/2008|

| 4 | Pam | 25000 | 25 | 1/1/2005 |

| 5 | Alex | 50000 | 10 | 2/3/2007 |

±---------±-----±-------±----------------±----------+

表 salesperson 存储了所有销售员的信息。每个销售员都有一个销售员编号 sales_id 和他的名字 name 。

表: company

±--------±-------±-----------+

| com_id | name | city |

±--------±-------±-----------+

| 1 | RED | Boston |

| 2 | ORANGE | New York |

| 3 | YELLOW | Boston |

| 4 | GREEN | Austin |

±--------±-------±-----------+

表 company 存储了所有公司的信息。每个公司都有一个公司编号 com_id 和它的名字 name 。

表: orders

±---------±-----------±--------±---------±-------+

| order_id | order_date | com_id | sales_id | amount |

±---------±-----------±--------±---------±-------+

| 1 | 1/1/2014 | 3 | 4 | 100000 |

| 2 | 2/1/2014 | 4 | 5 | 5000 |

| 3 | 3/1/2014 | 1 | 1 | 50000 |

| 4 | 4/1/2014 | 1 | 4 | 25000 |

±---------±---------±--------±---------±-------+

表 orders 存储了所有的销售数据,包括销售员编号 sales_id 和公司编号 com_id 。

输出

±-----+

| name |

±-----+

| Amy |

| Mark |

| Alex |

±-----+

解释

根据表 orders 中的订单 ‘3’ 和 ‘4’ ,容易看出只有 ‘John’ 和 ‘Pam’ 两个销售员曾经向公司 ‘RED’ 销售过。

所以我们需要输出表 salesperson 中所有其他人的名字。*/

CREATE TABLE salespaerson(
salesid INT ,
name1 VARCHAR(20),
commissioin_rate INT 
);
INSERT INTO salespaerson(salesid,name1,commissioin_rate) VALUES
(1,'John',6),
(2,'Amy',5),
(3,'Mark',12),
(4,'pam',25),
(5,'alex',10)

CREATE TABLE company
(
  com_id INT ,
  name1 VARCHAR(10),
  city VARCHAR(10)
);
INSERT INTO company(com_id,name1,city)
 VALUES(1,'red','boston'),
 (2,'orange','New York'),
 (3,'yellow','Boston'),
 (4,'gereen','Austin')

 CREATE TABLE orders2(
 order_id INT ,
 com_id INT ,
 sales_id INT
 );
 INSERT INTO orders2(order_id ,com_id,sales_id)
 VALUES(1,3,4),
 (2,4,5),
 (3,1,1),
 (4,1,4)
 SELECT *FROM 
 salespaerson LEFT JOIN orders2 ON salespaerson.salesid=orders2.sales_id 
 INNER JOIN company ON orders2.com_id=company.com_id WHERE company.name1!='red';
/*

删除重复邮箱
*/

SELECT * FROM person
DELETE FROM person WHERE id NOT IN (
SELECT id FROM
(SELECT id FROM person GROUP BY (email))p
)

/*
给定一个 Weather 表,编写一个 SQL 查询,来查找与之前(昨天的)日期相比温度更高的所有日期的 Id。

±--------±-----------------±-----------------+

| Id(INT) | RecordDate(DATE) | Temperature(INT) |

±--------±-----------------±-----------------+

| 1 | 2015-01-01 | 10 |

| 2 | 2015-01-02 | 25 |

| 3 | 2015-01-03 | 20 |

| 4 | 2015-01-04 | 30 |

±--------±-----------------±-----------------+
*/

 CREATE TABLE weather(
 id INT,
 T INT);
 INSERT INTO weather(id,T) VALUES(1,10),(2,25),(3,3weather0)
 INSERT INTO weather(id,t) VALUES(4,30)

 SELECT w2.id FROM weather w LEFT JOIN weather w2 ON w.id +1 =w2.id WHERE w2.T>w.T

/*

表 my_numbers 的 num 字段包含很多数字,其中包括很多重复的数字。

你能写一个 SQL 查询语句,找到只出现过一次的数字中,最大的一个数字吗?

±–+

|num|

±–+

| 8 |

| 8 |

| 3 |

| 3 |

| 1 |

| 4 |

| 5 |

| 6 |
*/

CREATE TABLE nums(
num INT)
INSERT INTO nums(num) VALUES(8),
(3),
(3),
(1),
(4),
(5),
(6);
INSERT INTO nums(num) VALUES(8);
SELECT *FROM nums GROUP BY num HAVING COUNT(*)=1 ORDER BY num DESC LIMIT 1;
SELECT MAX(num) FROM (SELECT *FROM nums GROUP BY num HAVING COUNT(*)=1) p;

/*
有一个courses 表 ,有: student (学生) 和 class (课程)。

请列出所有超过或等于5名学生的课。

例如,表:

±--------±-----------+

| student | class |

±--------±-----------+

| A | Math |

| B | English |

| C | Math |

| D | Biology |

| E | Math |

| F | Computer |

| G | Math |

| H | Math |

| I | Math |

*/

CREATE TABLE cources(
student CHAR(2),
class CHAR(10)
)
INSERT INTO cources(student,class)
VALUES
('A','Math'),
('B','English'),
('C','Math'),
('D','biglogy'),
('E','Computer'),
('G','Math'),
('H','Math')

SELECT class FROM cources GROUP BY class HAVING COUNT(*)>=4 	

/*
在 Facebook 或者 Twitter 这样的社交应用中,人们经常会发好友申请也会收到其他人的好友申请。现在给如下两个表:

表: friend_request

| sender_id | send_to_id |request_date|

|-----------|------------|------------|

| 1 | 2 | 2016_06-01 |

| 1 | 3 | 2016_06-01 |

| 1 | 4 | 2016_06-01 |

| 2 | 3 | 2016_06-02 |

| 3 | 4 | 2016-06-09 |

表: request_accepted

| requester_id | accepter_id |accept_date |

|--------------|-------------|------------|

| 1 | 2 | 2016_06-03 |

| 1 | 3 | 2016-06-08 |

| 2 | 3 | 2016-06-08 |

| 3 | 4 | 2016-06-09 |

| 3 | 4 | 2016-06-10 |

写一个查询语句,求出好友申请的通过率,用 2 位小数表示。通过率由接受好友申请的数目除以申请总数。

对于上面的样例数据,你的查询语句应该返回如下结果。

|accept_rate|

|-----------|

| 0.80|

注意:

通过的好友申请不一定都在表 friend_request 中。在这种情况下,你只需要统计总的被通过的申请数(不管它们在不在原来的申请中),并将它除以申请总数,得到通过率

一个好友申请发送者有可能会给接受者发几条好友申请,也有可能一个好友申请会被通过好几次。这种情况下,重复的好友申请只统计一次。

如果一个好友申请都没有,通过率为 0.00 。

解释: 总共有 5 个申请,其中 4 个是不重复且被通过的好友申请,所以成功率是 0.80 。

答案:

*/

CREATE TABLE  friend
( sendid INT,
 sendtoid INT);

INSERT INTO friend(sendid,sendtoid)
VALUES(1,2),
(1,3),
(1,4),
(2,3),
(3,4)
 CREATE TABLE request
 ( requestid INT,
 accepid INT);

INSERT INTO request(requestid,accepid) VALUES
(1,2),
(1,3),
(2,3),
(3,4),
(3,4)

SELECT (SELECT COUNT(*) FROM (SELECT * FROM (
SELECT *FROM (SELECT * FROM  request LEFT JOIN friend ON request.requestid = friend.sendid) q 
WHERE accepid = sendtoid) o GROUP BY requestid,accepid) b )/
(SELECT COUNT(*) FROM friend)  AS gailv
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!