SQL 查询练习
如果您的目标是成为数据管理员、数据库开发人员或数据分析师,那么掌握SQL查询非常重要。如果您想处理结构化数据,那么您必须知道如何从关系数据库中检索、处理和分析数据。
在本文中,我们将学习几个能帮助您提高查询能力的SQL查询。
以下是SQL查询:
1.编写查询以创建新表。
CREATE TABLE tableName (
columnName datatype,
columnName datatype,
...
);
2. 编写查询以插入新记录到表中:
INSERT INTO tableName (Column1, Column2, ?)
VALUES (Value1, Value2, ?);
3. 编写一个查询来删除表中的记录:
DELETE FROM tableName WHERE condition;
4. 编写查询以更新表中的记录:
UPDATE tableName
SET columnName = newValue
WHERE condition;
5. 编写查询以从数据库中删除表:
DROP TABLE tableName;
6. 编写查询语句以选择从表中检索数据的所有记录:
SELECT * FROM tableName;
7. 编写查询以从表中选择特定列:
SELECT Column1, Column2 FROM tableName;
8. 编写查询以从列中选择唯一值:
SELECT DISTINCT columnName FROM tableName;
9. 编写使用WHERE子句过滤记录的查询语句:
SELECT * FROM tableName WHERE condition;
10. 编写查询以按降序排序记录:
SELECT * FROM tableName
ORDER BY columnName DESC;
11. 编写查询以按升序排序记录:
SELECT * FROM tableName
ORDER BY columnName ASC;
12. 编写查询语句以基于一个共同的列连接两个表:
SELECT * FROM Table1 JOIN Table2
ON Table1.columnName = Table2.columnName;
13. 编写查询以计算表中行的数量。
我们将使用COUNT()函数来计算行的数量。声明如下:
SELECT COUNT(*) FROM tableName;
14. 编写查询以对记录进行分组并计算聚合函数:
SELECT columnName, COUNT(*), AVG(columnName)
FROM tableName GROUP BY columnName;
15.编写查询以限制结果集中返回的行数。
我们将使用LIMIT子句限制行数。以下是语句:
SELECT columnName FROM tableName LIMIT 10;
16. 编写查询以查找列中值的总和:
SELECT SUM(columnName) FROM tableName;
17.编写查询以查找列的平均值:
SELECT AVG(columnName) FROM tableName;
18. 编写查询以从列中获取最小值:
SELECT MIN(columnName) FROM tableName;
19. 编写查询以从列中检索最大值:
SELECT MAX(columnName) FROM tableName;
20. 编写查询以检索具有指定范围内的值的行:
SELECT columnName FROM tableName
WHERE columnName
BETWEEN Value1 AND Value2;
21. 编写查询以检索具有与指定值列表匹配的行:
SELECT columnName FROM tableName
WHERE columnName
IN (Value1, Value2, Value3);
22. 编写查询以使用通配符字符在列中搜索模式:
SELECT columnName FROM tableName WHERE columnName LIKE 'abc%';
23. 编写查询以依据分组查询中的聚合函数过滤数据:
SELECT Column1, COUNT(Column2)
FROM tableName
GROUP BY Column1 HAVING COUNT(Column2) > 5;
24. 编写查询以检索在指定范围内具有日期的行:
SELECT columnName FROM tableName
WHERE columnName
BETWEEN '2023-01-01' AND '2023-07-30';
25. 编写查询以组合两个或多个SELECT语句的结果集:
SELECT * FROM Table1
UNION SELECT columnName FROM Table2;
26. 编写查询以在查询中执行条件逻辑:
SELECT columnNamse, CASE WHEN Condition1 THEN 'Value1'
WHEN Condition2 THEN 'Value2'
ELSE 'Value3'
END AS newColumn FROM tableName;
27. 编写查询以删除表中的所有行,但保留表结构:
TRUNCATE TABLE tableName;
28. 编写查询以在表的一个或多个列上创建索引:
CREATE INDEX indexName ON tableName (Column1, Column2);
29. 编写查询语句以修改现有表的结构:
ALTER TABLE tableName ADD columnName datatype;
30. 编写查询以返回表达式列表中的第一个非空值:
SELECT COALESCE(Column1, Column2, … , ColumnN) AS Result
FROM tableName;
31. 编写查询,如果两个表达式相等,则返回NULL,否则返回第一个表达式。
我们将使用NULLIF()函数来实现,语句如下所示:
SELECT NULLIF(Column1, 0) AS result FROM tableName;
实践SQL查询的基于现实生活的问题:
让我们来看一些基于现实生活的问题,以练习上述讨论的SQL查询:
1. 编写查询以创建一个名为’employees’的表,该表具有字段empId、empName、empAge、empAddress和empSalary。
查询:
CREATE TABLE employees (
empId INT,
empName VARCHAR(40),
empAge INT,
empAddress VARCHAR(40),
empSalary INT
);
结果: ’employees’表将如下所示。
empId | empName | empAge | empAddress | empSalary |
---|---|---|---|---|
2. 写出插入值到上述 ’employees’ 表的查询语句。
Query:
INSERT INTO employees
VALUES(1, 'Daksh', 25, 'Jaipur', 32000),
(2, 'Ananya', 30, 'Bhopal', 37000),
(3, 'Aarush', 32, 'Jaipur', 35000),
(4, 'Reyansh', 30, 'Bhopal', 40000)
(5, 'Jhalak', 28, 'Jaipur', 39000);
结果: 在向’employees’表中插入值后,它将如下所示。
empId | empName | empAge | empAddress | empSalary |
---|---|---|---|---|
1 | Daksh | 25 | Jaipur | 32000 |
2 | Ananya | 30 | Bhopal | 37000 |
3 | Aarush | 32 | Jaipur | 35000 |
4 | Reyansh | 30 | Bhopal | 40000 |
5 | Jhalak | 28 | Jaipur | 39000 |
3. 考虑 ’employees’ 表,在 ’employees’ 表中写一个查询语句来删除 ’empId=1′ 的记录:
Query:
DELETE FROM employees WHERE empId=1;
结果: 上述语句将从“employees”表中删除记录“empId=1”。
empId | empName | empAge | empAddress | empSalary |
---|---|---|---|---|
2 | Ananya | 30 | Bhopal | 37000 |
3 | Aarush | 32 | Jaipur | 35000 |
4 | Reyansh | 30 | Bhopal | 40000 |
5 | Jhalak | 28 | Jaipur | 39000 |
4. 考虑“employees”表格并编写查询以更新“employees”表格中“empId = 5”的年龄:
查询:
UPDATE employees SET empAge = 29 WHERE empId=5;
结果: 将在“员工”表中更新“empId = 5”的年龄。
empId | empName | empAge | empAddress | empSalary |
---|---|---|---|---|
1 | Daksh | 25 | Jaipur | 32000 |
2 | Ananya | 30 | Bhopal | 37000 |
3 | Aarush | 32 | Jaipur | 35000 |
4 | Reyansh | 30 | Bhopal | 40000 |
5 | Jhalak | 28 | Jaipur | 39000 |
5. 考虑’employees’表并编写查询以选择’employees’表中的所有记录:
查询:
SELECT * FROM employees;
结果: 如你所见,上述语句将从’employees’表中选择所有记录。
empId | empName | empAge | empAddress | empSalary |
---|---|---|---|---|
1 | Daksh | 25 | Jaipur | 32000 |
2 | Ananya | 30 | Bhopal | 37000 |
3 | Aarush | 32 | Jaipur | 35000 |
4 | Reyansh | 30 | Bhopal | 40000 |
5 | Jhalak | 28 | Jaipur | 39000 |
6. 考虑 ’employees’ 表,并编写查询以从 ’employees’ 表中选择 ’empName’ 和 ’empSalary’ 列:
查询:
SELECT empName, empSalary FROM employees;
结果: 上述语句将从 ’employees’ 表中选择 ’empName’ 和 ’empSalary’ 两列。
empName | empSalary |
---|---|
Daksh | 32000 |
Ananya | 37000 |
Aarush | 35000 |
Reyansh | 40000 |
Jhalak | 39000 |
7. 考虑一下’employees’表,并编写查询以从’employees’表的’empAddress’列中选择不同的值:
查询:
SELECT DISTINCT empAddress FROM employees;
结果: 上述语句将从’employees’表中选择’empAddress’列中的不同值。
empAddress
---
Jaipur
Bhopal
8. 考虑 ’employees’ 表格,并使用 WHERE 子句编写查询来过滤和选择 empAddress=’Jaipur’ 的记录:
查询语句:
SELECT * FROM employees
WHERE empAddress='Jaipur';
结果: 上述语句将过滤“employees”表中的记录。
empId | empName | empAge | empAddress | empSalary |
---|---|---|---|---|
1 | Daksh | 25 | Jaipur | 32000 |
3 | Aarush | 32 | Jaipur | 35000 |
5 | Jhalak | 28 | Jaipur | 39000 |
9. 考虑到’employees’表,请编写查询以按降序对’employees’表的记录进行排序。
查询:
SELECT * FROM employees
ORDER BY empName DESC;
结果: 以上语句将按降序排序’employees’表的记录。
empId | empName | empAge | empAddress | empSalary |
---|---|---|---|---|
4 | Reyansh | 30 | Bhopal | 40000 |
5 | Jhalak | 28 | Jaipur | 39000 |
1 | Daksh | 25 | Jaipur | 32000 |
2 | Ananya | 30 | Bhopal | 37000 |
3 | Aarush | 32 | Jaipur | 35000 |
10. 考虑以下 ’employees’ 表并编写查询以按升序排序 ’employees’ 表的记录。
查询:
SELECT * FROM employees
ORDER BY empName ASC;
结果: 以上语句将按升序对’employees’表中的记录进行排序。
empId | empName | empAge | empAddress | empSalary |
---|---|---|---|---|
3 | Aarush | 32 | Jaipur | 35000 |
2 | Ananya | 30 | Bhopal | 37000 |
1 | Daksh | 25 | Jaipur | 32000 |
5 | Jhalak | 28 | Jaipur | 39000 |
4 | Reyansh | 30 | Bhopal | 40000 |
11. 考虑’employees’表格并编写查询来计算’employees’表格中的行数。
查询:
SELECT COUNT(*) FROM employees;
结果: 上述语句将计算 ’employees’ 表中的行数。
COUNT(*)
---
5
12. 考虑’employees’表,并编写查询以检索薪水在35000至40000之间的所有员工。
查询:
SELECT empSalary FROM employees
WHERE empSalary
BETWEEN 35000 AND 40000;
结果: 以上语句将会检索出”employees”表中薪水在35000到40000之间的所有员工。
empId | empName | empAge | empAddress | empSalary |
---|---|---|---|---|
2 | Ananya | 30 | Bhopal | 37000 |
3 | Aarush | 32 | Jaipur | 35000 |
4 | Reyansh | 30 | Bhopal | 40000 |
5 | Jhalak | 28 | Jaipur | 39000 |
13. 考虑’employees’ 表,并编写查询语句以添加名为 ‘Department’ 的另一列。
查询语句:
ALTER TABLE employees ADD Department VARCHAR(45);
结果: 由于在新列’Department’中没有插入任何值,所以默认情况下它包含NULL。
empId | empName | empAge | empAddress | empSalary | Department |
---|---|---|---|---|---|
1 | Daksh | 25 | Jaipur | 32000 | NULL |
2 | Ananya | 30 | Bhopal | 37000 | NULL |
3 | Aarush | 32 | Jaipur | 35000 | NULL |
4 | Reyansh | 30 | Bhopal | 40000 | NULL |
5 | Jhalak | 28 | Jaipur | 39000 | NULL |
14. 考虑一个名为 “products” 的表,其中包含诸如 product_id、product_name、product_quantity 和 product_price 等字段。
product_id | product_name | product_quantity | product_price |
---|---|---|---|
1 | Speaker | 2 | 10000 |
2 | Printer | 1 | 21000 |
3 | Key Board | 5 | 2500 |
4 | Refill Cartridge | 6 | 1500 |
5 | CD Drive | 4 | 2000 |
i) 编写查询以计算“products”表中“product_price”列的值的总和。
查询语句:
SELECT SUM(product_price)
FROM products;
结果:
SUM(product_price)
---
37000
ii) 写一个查询来计算”products”表中”product_price”列的平均值。
查询语句:
SELECT AVG(product_price)
FROM products;
结果:
AVG(product_price)
---
7400
iii)编写查询以检索’products’表中’product_price’列的最小值。
查询:
SELECT MIN(product_price)
FROM products;
结果:
MIN(product_price)
---
1500
iv) 编写查询,以检索“products”表中“product_price”列的最大值。
查询语句:
SELECT MAX(product_price)
FROM products;
结果:
MAX(product_price)
---
21000
V)编写查询语句以对“products”表中的“product_price”列进行分组并计算聚合函数。
查询语句:
SELECT product_price, COUNT(product_price), AVG(product_price)
FROM products GROUP BY product_price;
结果:
product_price | COUNT(product_price) | Age(product_price) |
---|---|---|
10000 | 1 | 10000 |
21000 | 1 | 21000 |
2500 | 1 | 2500 |
1500 | 1 | 1500 |
2000 | 1 | 2000 |
15. 考虑一个名为’mobilephones’的表格,其中包含字段Id,Name,Company,Quantity和Price。
Id | Name | Company | Colour | Quantity | Price |
---|---|---|---|---|---|
1 | Samsung Galaxy A23 | Samsung | Blue | 1 | 20000 |
2 | iPhone 13 mini | Apple | Pink | 2 | 65000 |
3 | iPhone 12 | Apple | Black | 1 | 54000 |
4 | Motorola Edge 30 Fusion | Motorola | Viva Magenta | 2 | 38000 |
5 | Samsung Galaxy Z Flip3 5G | Samsung | Black | 4 | 48000 |
i) 编写查询以选择在’mobilephones’表中以”bl”开头的’Colour’列中的所有客户。
查询语句:
SELECT * FROM mobilephones
WHERE Colour LIKE 'bl%';
结果:
product_price | COUNT(product_price) | Age(product_price) |
---|---|---|
10000 | 1 | 10000 |
21000 | 1 | 21000 |
2500 | 1 | 2500 |
1500 | 1 | 1500 |
2000 | 1 | 2000 |
15. 考虑一个名为’mobilephones’的表,其中包含诸如Id、Name、Company、Quantity和Price等字段。
Id | Name | Company | Colour | Quantity | Price |
---|---|---|---|---|---|
1 | Samsung Galaxy A23 | Samsung | Blue | 1 | 20000 |
3 | iPhone 12 | Apple | Black | 1 | 54000 |
5 | Samsung Galaxy Z Flip3 5G | Samsung | Black | 4 | 48000 |
ii)编写查询以选择‘mobilephones’表中‘Price’列中平均值大于45000的所有手机名称。
查询:
SELECT Name, AVG(Price)
FROM mobilephones
GROUP BY Name HAVING AVG(Price) > 45000;
结果:
Name | AVG(Price) |
---|---|
iPhone 13 mini | 65000 |
iPhone 12 | 54000 |
Samsung Galaxy Z Flip3 5G | 48000 |
iii)编写查询以选择在“mobilephones”表的“Price”列中总和小于45000的所有手机名称。
查询:
SELECT Name, SUM(Price)
FROM mobilephones
GROUP BY Name HAVING SUM(Price) < 45000;
结果:
Name | SUM(Price) |
---|---|
Samsung Galaxy A23 | 20000 |
Motorola Edge 30 Fusion | 38000 |
16. 考虑到具有Id,firstName,middleName,lastName和Address的“customers”表。
Id | firstName | middleName | lastName | Address |
---|---|---|---|---|
1 | Shruti | NULL | Bansal | Goa |
2 | NULL | Raj | Singh | Goa |
3 | Aadi | Kumar | NULL | Goa |
4 | Nishtha | NULL | NULL | Mumbai |
5 | NULL | NULL | Kapoor | Mumbai |
i) 编写查询以返回firstName、middleName和lastName列中的第一个非空值。
查询:
SELECT Id, Address COALESCE(firstName, middleName, lastName) AS NAME
FROM customers;
结果:
Id | Address | NAME |
---|---|---|
1 | Goa | Shruti |
2 | Goa | Raj |
3 | Goa | Aadi |
4 | Mumbai | Nishtha |
5 | Mumbai | Kapoor |
ii)编写查询以从“customers”表中删除所有行,但保留表结构。
查询:
TRUNCATE TABLE customers;
结果: 如你所见,上面的声明已删除所有行,只剩下表格结构。
Id | firstName | middleName | lastName | Address |
---|---|---|---|---|
17. 考虑两个表格:一个是“teachers”表格,它有fields包括teachers_id, Name, teachers_age和teachers_address。另一个是“students”表格,它有fields包括students_id, Name, students_age和students_address。
下面是 ‘teachers’表格:
teachers_id | Name | teachers_age | teachers_address |
---|---|---|---|
100 | Karishma | 35 | Noida |
101 | Yasha | 29 | Meerut |
102 | Kartik | 40 | Noida |
103 | Milan | 36 | Lucknow |
以下是 ‘学生’表:
students_id | Name | students_age | students_address |
---|---|---|---|
200 | Harsh | 19 | Noida |
201 | Palak | 18 | Lucknow |
202 | Himanshi | 20 | Roorkee |
203 | Ansh | 19 | Roorkee |
i) 使用UNION运算符编写查询,将“teachers”表中的“Name”列与“students”表中的“Name”列合并。
查询语句:
SELECT Name FROM teachers
UNION SELECT Name FROM students;
结果:
Name
---
Karishma
Yasha
Kartik
Milan
Harsh
Palak
Himanshi
Ansh
ii) 编写查询以查找年龄在34岁和41岁之间的教师的姓名在“teachers”表中。
查询:
SELECT * FROM teachers
WHERE teachers_age
BETWEEN '34' AND '41';
结果:
teachers_id | Name | teachers_age | teachers_address |
---|---|---|---|
100 | Karishma | 35 | Noida |
102 | Kartik | 40 | Noida |
103 | Milan | 36 | Lucknow |
结论:
在这篇文章中,你学习了几个用于练习的SQL查询。你阅读了各种基于真实生活的问题,并使用SQL查询解决了它们。如果你想要在管理和检索数据库方面变得熟练,练习SQL查询是很重要的。
通过经常的练习,你可以正确理解SQL语法,并改进查询优化技巧。你可以轻松地识别和纠正错误。如果你掌握了SQL查询,你将能够从数据库中提取有价值的见解,并做出数据驱动的决策,这将有助于推进你的职业发展。