SQL 处理重复项
SQL是一种用于管理和操作关系数据库中数据的编程语言。在使用数据库时,常见的问题之一就是存在多个重复记录。重复记录是在创建表时,有时无意或有意将数据多次输入到表中时发生的。在SQL中处理重复项涉及到识别、过滤、删除或合并表中的重复记录。
为什么需要在SQL中处理重复项
处理数据库中重复项有多种原因。其中一个主要原因是,在组织数据库中存在重复记录会导致逻辑错误。此外,我们需要处理冗余数据以防止以下后果:
- 重复数据占用存储空间,导致数据库使用效率降低。
-
由于资源使用增加,处理资源的总成本上升。
-
由于存在重复记录而导致的逻辑错误增加,从数据库中推导出的结论也将是错误的。
处理重复项的方法
随着数据库中重复项的增加,引入了各种方法来处理它们。以下是这些方法:
- 使用DISTINCT关键字
- 使用GROUP BY子句
- 使用UNION子句
让我们在下面详细了解这些方法。
使用DISTINCT关键字
我们可以使用DISTINCT关键字在SQL中处理重复项。这与SELECT语句一起使用,通过消除所有重复记录并只检索唯一记录来消除重复项。
语法
消除重复记录的DISTINCT关键字的基本语法如下。
SELECT DISTINCT column1, column2,.....columnN
FROM table_name
WHERE [condition]
示例
考虑具有以下记录的CUSTOMERS表。
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
首先,让我们看看以下SELECT查询如何返回重复的工资记录。
SQL> SELECT SALARY FROM CUSTOMERS
ORDER BY SALARY;
这将产生以下结果,其中工资为2000的记录重复出现了两次,这是从原始表中复制的记录。
+----------+
| SALARY |
+----------+
| 1500.00 |
| 2000.00 |
| 2000.00 |
| 4500.00 |
| 6500.00 |
| 8500.00 |
| 10000.00 |
+----------+
现在,让我们在上面的SELECT查询中使用DISTINCT关键字并查看结果。
SQL> SELECT DISTINCT SALARY FROM CUSTOMERS
ORDER BY SALARY;
输出
这将产生以下结果,其中我们没有任何重复的条目。
+----------+
| SALARY |
+----------+
| 1500.00 |
| 2000.00 |
| 4500.00 |
| 6500.00 |
| 8500.00 |
| 10000.00 |
+----------+
使用Group By子句
我们还可以使用Group By子句将两个相似的记录合并为一个。以下是实现该功能的语法−
SELECT column_name(s) FROM table_name GROUP BY column_name(s);
示例
在本示例中,我们尝试使用以下查询创建一个新表”Employee”。
CREATE TABLE EMPLOYEE (
EID INT NOT NULL,
EMPLOYEE_NAME VARCHAR (30) NOT NULL,
SALES_MADE DECIMAL (20)
);
现在,我们可以使用INSERT语句将值插入到这个空表中,如下所示:
INSERT INTO EMPLOYEE VALUES (102, 'SARIKA', 4500);
INSERT INTO EMPLOYEE VALUES (100, 'ALEKHYA', 3623);
INSERT INTO EMPLOYEE VALUES (101, 'REVATHI', 1291);
INSERT INTO EMPLOYEE VALUES (103, 'VIVEK', 3426);
INSERT INTO EMPLOYEE VALUES (100, 'ALEKHYA', 3623);
员工表包含组织中员工的详细信息以及他们的销售情况。
+-----+---------------+------------+
| EID | EMPLOYEE_NAME | SALES_MADE |
+-----+---------------+------------+
| 102 | SARIKA | 4500 |
| 100 | ALEKHYA | 3623 |
| 101 | REVATHI | 1291 |
| 103 | VIVEK | 3426 |
| 100 | ALEKHYA | 3623 |
+-----+---------------+------------+
使用以下”Group By”查询,我们尝试将表中的重复记录合并为一条记录,并按升序排列。
SELECT * FROM EMPLOYEE GROUP BY EID, EMPLOYEE_NAME, SALARY;
输出
展示的表格如下所示-
+-----+---------------+------------+
| EID | EMPLOYEE_NAME | SALES_MADE |
+-----+---------------+------------+
| 100 | ALEKHYA | 3623 |
| 101 | REVATHI | 1291 |
| 102 | SARIKA | 4500 |
| 103 | VIVEK | 3426 |
+-----+---------------+------------+
使用 UNION
UNION是SQL中的一种操作符/子句,它的功能类似于关系代数中的并运算符。它只是将多个兼容的表的信息组合在一起。
只有来自表的不同行被添加到结果表中,因为UNION会自动消除所有重复记录。
语法
以下是SQL中UNION操作符的语法:
SELECT * FROM table1
UNION
SELECT * FROM table2;
示例
首先我们创建两个表”COURSES_PICKED”和”EXTRA_COURSES_PICKED”,它们有相同数量的列并且数据类型也相同。
使用以下查询语句创建表”COURSES_PICKED” −
CREATE TABLE COURSES_PICKED(
STUDENT_ID INT NOT NULL,
STUDENT_NAME VARCHAR(30) NOT NULL,
COURSE_NAME VARCHAR(30) NOT NULL
);
使用下面的查询将值插入COURSES_PICKED表中:
INSERT INTO COURSES_PICKED VALUES(1, 'JOHN', 'ENGLISH');
INSERT INTO COURSES_PICKED VALUES(2, 'ROBERT', 'COMPUTER SCIENCE');
INSERT INTO COURSES_PICKED VALUES(3, 'SASHA', 'COMMUNICATIONS');
INSERT INTO COURSES_PICKED VALUES(4, 'JULIAN', 'MATHEMATICS');
表格将显示为 –
+------------+--------------+------------------+
| STUDENT_ID | STUDENT_NAME | COURSE_NAME |
+------------+--------------+------------------+
| 1 | JOHN | ENGLISH |
| 2 | ROBERT | COMPUTER SCIENCE |
| 3 | SASHA | COMMUNICATIONS |
| 4 | JULIAN | MATHEMATICS |
+------------+--------------+------------------+
使用以下查询创建表EXTRA_COURSES_PICKED−
CREATE TABLE EXTRA_COURSES_PICKED(
STUDENT_ID INT NOT NULL,
STUDENT_NAME VARCHAR(30) NOT NULL,
EXTRA_COURSE_NAME VARCHAR(30) NOT NULL
);
以下是将值插入EXTRA_COURSES_PICKED表的查询语句−
INSERT INTO EXTRA_COURSES_PICKED VALUES(1, 'JOHN', 'PHYSICAL EDUCATION');
INSERT INTO EXTRA_COURSES_PICKED VALUES(2, 'ROBERT', 'GYM');
INSERT INTO EXTRA_COURSES_PICKED VALUES(3, 'SASHA', 'FILM');
INSERT INTO EXTRA_COURSES_PICKED VALUES(4, 'JULIAN', 'MATHEMATICS');
表格将如下所示创建:
+------------+--------------+--------------------+
| STUDENT_ID | STUDENT_NAME | COURSES_PICKED |
+------------+--------------+--------------------+
| 1 | JOHN | PHYSICAL EDUCATION |
| 2 | ROBERT | GYM |
| 3 | SASHA | FILM |
| 4 | JULIAN | MATHEMATICS |
+------------+--------------+--------------------+
现在,让我们尝试使用UNION查询来合并这两个表,如下所示:
现在,让我们尝试通过使用UNION查询来结合这两个表,如下所示 –
SELECT * FROM COURSES_PICKED
UNION
SELECT * FROM EXTRA_COURSES_PICKED;
输出结果
执行 UNION 操作后获得的结果表为 –
+------------+--------------+--------------------+
| STUDENT_ID | STUDENT_NAME | COURSE_NAME |
+------------+--------------+--------------------+
| 1 | JOHN | ENGLISH |
| 1 | JOHN | PHYSICAL EDUCATION |
| 2 | ROBERT | COMPUTER SCIENCE |
| 2 | ROBERT | GYM |
| 3 | SASHA | COMMUNICATIONS |
| 3 | SASHA | FILM |
| 4 | JULIAN | MATHEMATICS |
+------------+--------------+--------------------+
由于”Julian”的记录是冗余的,UNION子句会消除重复记录,并仅返回不同的值。