Q6-sql代写
时间:2023-06-15
id first_name last_name department_id
1 John Doe 1
2 Jane Smith 2
3 Jane Johnson 1
4 John Brown 3
5 Leo Q 6
department_id department_name
1 HR
2 IT
3 Finance
SQL
具体SQL代码
Employee Table:
Department table:
Select
从数据表中查询数据。可以选择查询一个或多个列,或者使用*来查询所有列。
SELECT first_name, last_name FROM employees;
SELECT * FROM employees;
1
2
?
?
?
?
Al
ex
?
?
From
指定从哪个table选取
Where
用于过滤查询结果,只返回满足特定条件的记录。
可以使用比较运算符(如=、<>、>、<、>=、<=)来定义条件
或者between and
正则表达式(Like): % _
ORDER BY
ORDER BY子句用于对查询结果进行排序。可以根据一个或多个列进行升序从小到大
(ASC)或降序从大到小(DESC)排序
GROUP BY
GROUP BY子句用于对查询结果进行分组,以便对每个组应用聚合函数。
常见的聚合函数包括COUNT、SUM、AVG、MIN和MAX
SELECT first_name, last_name FROM employees WHERE salary > 5000;1
SELECT first_name, last_name, salary FROM employees ORDER BY salary
DESC;
1
SELECT department_id, COUNT(*) FROM employees GROUP BY
department_id;
1
?
?
?
?
Al
ex
?
?
HAVING
HAVING子句用于过滤聚合函数的结果。它与WHERE子句类似,但适用于分组后的数据。
JOIN操作
SELECT department_id, COUNT(*) FROM employees GROUP BY
department_id HAVING COUNT(*) > 5;
1
SELECT customer_id, SUM(order_total)
FROM orders
GROUP BY customer_id;
1
2
3
SELECT customer_id, SUM(order_total)
FROM orders
GROUP BY customer_id
HAVING SUM(order_total) > 1000;
1
2
3
4
?
?
?
?
Al
ex
?
?
JOIN操作用于连接两个或多个数据表,以便查询它们之间的关联数据
INNER JOIN
INNER JOIN用于查询两个表中的匹配记录。如果某个表的记录在另一个表中找不到匹配
项,那么这个记录将不会出现在查询结果中。
示例:
On: e.department_id = d.id;
Using: (department_id )
?
?
?
?
Al
ex
?
?
first_name last_name department_name
John Doe HR
Jane Smith IT
Mark Johnson HR
Emily Brown Finance
查询结果:
SELECT e.first_name, e.last_name, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id;
SELECT e.first_name, e.last_name, d.department_name
FROM employees e
INNER JOIN departments d Using(department_id);
1
2
3
4
5
6
7
SELECT e.first_name, e.last_name, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.id;
1
2
3
SELECT e.first_name, e.last_name, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.id;
1
2
3
?
?
?
?
Al
ex
?
?
Natural Join 是自然连接,它把两个表中具有相同名称的列视为相同的列并将它们相
连。
关联的表具有一对或多对同名的列
连接时候不需要使用on或者using关键字
Inner Join 则是内部连接,它仅包含两个表中存在匹配条件的行。
这种连接方式可以使用ON,Using 子句来指定连接条件。
LEFT JOIN LEFT OUTER JOIN
?
?
?
?
Al
ex
?
?
first_name last_name department_name
John Doe HR
Jane Smith IT
Mark Johnson HR
Emily Brown Finance
first_name last_name department_name
John Doe HR
Jane Smith IT
LEFT JOIN用于查询左表中的所有记录和右表中的匹配记录。如果在右表中找不到匹配
项,那么查询结果将显示NULL。
示例:
查询结果:
RIGHT JOIN RIGHT OUTER JOIN
RIGHT JOIN用于查询右表中的所有记录和左表中的匹配记录。如果在左表中找不到匹配
项,那么查询结果将显示NULL。
示例:
查询结果:
SELECT e.first_name, e.last_name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.id;
1
2
3
SELECT e.first_name, e.last_name, d.department_name
FROM employees e
RIGHT JOIN departments d ON e.department_id = d.id;
1
2
3 ?
?
?
?
Al
ex
?
?
first_name last_name department_name
Mark Johnson HR
Emily Brown Finance
first_name last_name department_name
John Doe HR
Jane Smith IT
Mark Johnson HR
Emily Brown Finance
NULL NULL Marketing
FULL JOIN FULL OUTER JOIN
FULL JOIN用于查询两个表中的所有记录。如果在另一个表中找不到匹配项,那么查询结
果将显示NULL。
示例:
查询结果(假设departments表中有一个没有匹配的部门,ID为4,部门名称
为"Marketing"):
在这个例子中,我们可以看到FULL JOIN查询了employees和departments两个表中的所有
记录。由于没有与部门ID为4的部门匹配的员工,所以员工的名字和姓氏显示为NULL。
自连接 Self-JOIN
自连接是一个表与其自身进行连接的操作,当表中的数据具有层次结构关系时
换个Table
SELECT e.first_name, e.last_name, d.department_name
FROM employees e
FULL OUTER JOIN departments d ON e.department_id = d.id;
1
2
3
?
?
?
?
Al
ex
?
?
id first_name last_name manager_id
1 John Doe NULL
2 Jane Smith 1
3 Mark Johnson 1
4 Emily Brown 2
employee_name manager_name
John Doe NULL
Jane Smith John Doe
Mark Johnson John Doe
Emily Brown Jane Smith
id customer_id order_date
1 101 20220101
2 102 20220102
employees表:
示例:查询员工及其经理的信息
查询结果:
使用多个连接条件  
假设我们有两个数据表:orders和order_items。
orders表:
SELECT e1.first_name || ' ' || e1.last_name AS employee_name,
e2.first_name || ' ' || e2.last_name AS manager_name
FROM employees e1
LEFT JOIN employees e2 ON e1.manager_id = e2.id;
1
2
3
4
?
?
?
?
Al
ex
?
?
id customer_id order_date
3 103 20220103
order_id product_id quantity
1 201 2
1 202 1
2 201 3
3 203 1
order_id order_date total_quantity
1 20220101 3
2 20220102 3
order_items表:
示例:查询特定日期范围内的订单及其对应的产品数量
查询结果:  
CROSS JOIN
CROSS JOIN用于生成两个表之间的笛卡尔积。
每个表中的每个记录都将与另一个表中的每个记录组合。
通常,CROSS JOIN用于组合数据,而不是直接查询。  
SELECT o.id AS order_id, o.order_date, SUM(oi.quantity) AS
total_quantity
FROM orders o
JOIN order_items oi ON o.id = oi.order_id AND o.order_date BETWEEN
'2022-01-01' AND '2022-01-02'
GROUP BY o.id, o.order_date;
1
2
3
4
?
?
?
?
Al
ex
?
?
id color
1 Red
2 Green
3 Blue
id size
1 Small
2 Medium
3 Large
color size
Red Small
Red Medium
Red Large
Green Small
Green Medium
Green Large
假设我们有两个数据表:colors和sizes。
colors表:
sizes表:
示例:查询所有可能的颜色和尺寸组合
查询结果:
SELECT c.color, s.size
FROM colors c
CROSS JOIN sizes s;
1
2
3
?
?
?
?
Al
ex
?
?
color size
Blue Small
Blue Medium
Blue Large
id product_id sale_date revenue
1 101 20190101 1000
2 102 20190102 2000
id product_id sale_date revenue
1 101 20200101 1500
2 103 20200102 2500
UNION操作
UNION操作用于将来自两个或多个SELECT语句的结果组合在一起。
使用UNION时,查询结果中的所有重复记录将被删除。
如果需要保留重复记录,可以使用UNION ALL操作。  
假设我们有两个数据表:sales2019和sales2020。
sales2019表:
sales2020表:
示例:查询2019年和2020年的所有销售记录?
?
?
?
Al
ex
?
?
product_id sale_date revenue
101 20190101 1000
102 20190102 2000
101 20200101 1500
103 20200102 2500
查询结果:
SQL下  
JOIN 与子查询
 使用JOIN连接两个表
这个查询将会返回所有电影的名称和它们的分类名称。
 使用子查询过滤结果
SELECT product_id, sale_date, revenue
FROM sales2019
UNION
SELECT product_id, sale_date, revenue
FROM sales2020
ORDER BY sale_date;
1
2
3
4
5
6
7
8
SELECT f.title, c.name
FROM Film f
JOIN Film_Category fc ON f.film_id = fc.film_id
JOIN Category c ON fc.category_id = c.category_id
1
2
3
4
?
?
?
?
Al
ex
?
?
这个查询将会返回所有电影的名称和它们的分类名称,但是只包含纪录片类别的电影。
DDL
定义数据库结构的语言
CREATE
约束 PK FK
ALTER  
DROP
SELECT f.title, c.name
FROM Film f
JOIN Film_Category fc ON f.film_id = fc.film_id
JOIN Category c ON fc.category_id = c.category_id
WHERE c.name IN (SELECT name FROM Category WHERE name LIKE
'%Documentary%')
1
2
3
4
5
CREATE TABLE users (
id INTEGER PRIMARY KEY NOT NULL,
name VARCHAR(50) NOT NULL,
age INTEGER NOT NULL,
email VARCHAR(100) UNIQUE
);
1
2
3
4
5
6
7
ALTER TABLE users ADD COLUMN gender CHAR(1);1
DROP TABLE users;1
?
?
?
?
Al
ex
?
?
 GROUP HAVING
查询每个类别的电影数量以及平均租赁费用
查询平均租赁费用高于3.5的类别
SELECT c.name, COUNT(*) AS movie_count, AVG(f.rental_rate) AS
avg_rental_rate
FROM Film f
JOIN Film_Category fc ON f.film_id = fc.film_id
JOIN Category c ON fc.category_id = c.category_id
GROUP BY c.name
ORDER BY movie_count DESC;
1
2
3
4
5
6
7
SELECT c.name, COUNT(*) AS movie_count, AVG(f.rental_rate) AS
avg_rental_rate
FROM Film f
JOIN Film_Category fc ON f.film_id = fc.film_id
JOIN Category c ON fc.category_id = c.category_id
GROUP BY c.name
HAVING AVG(f.rental_rate) > 3.5
ORDER BY avg_rental_rate DESC;
1
2
3
4
5
6
7
8
?
?
?
?
Al
ex
?
?
essay、essay代写