SQL 处理重复项

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子句会消除重复记录,并仅返回不同的值。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程