SQL 子句
- SQL子句帮助我们从表中检索一组或一批记录。
- SQL子句帮助我们指定对表的列或记录的条件。
结构化查询语言中可用的不同子句如下:
- WHERE子句
- GROUP BY子句
- HAVING子句
- ORDER BY子句
让我们逐个查看每个子句及其示例。我们将使用MySQL数据库来编写示例查询。
1. WHERE子句
WHERE子句在SQL中与SELECT查询一起使用,它是数据操作语言命令之一。WHERE子句可以用于限制结果集中要显示的行数,它通常有助于过滤记录。它仅返回符合WHERE子句特定条件的查询结果。WHERE子句在SELECT、UPDATE、DELETE语句等中使用。
带有SELECT查询的WHERE子句
星号符号与WHERE子句一起在SELECT查询中使用,以检索表中每条记录的所有列值。
使用SELECT查询的WHERE子句检索表中每条记录的所有列值的语法:
SELECT * FROM TABLENAME WHERE CONDITION;
如果根据需求,我们只想检索特定的列,则使用下面的语法:
SELECT COLUMNNAME1, COLUMNNAME2 FROM TABLENAME WHERE CONDITION;
考虑具有以下数据的员工表:
E_ID | Name | Salary | City | Designation | Date_of_Joining | Age |
---|---|---|---|---|---|---|
1 | Sakshi Kumari | 50000 | Mumbai | Project Manager | 2021-06-20 | 24 |
2 | Tejaswini Naik | 75000 | Delhi | System Engineer | 2019-12-24 | 23 |
3 | Anuja Sharma | 40000 | Jaipur | Manager | 2021-08-15 | 26 |
4 | Anushka Tripathi | 90000 | Mumbai | Software Tester | 2021-06-13 | 24 |
5 | Rucha Jagtap | 45000 | Bangalore | Project Manager | 2020-08-09 | 23 |
6 | Rutuja Deshmukh | 60000 | Bangalore | Manager | 2019-07-17 | 26 |
7 | Swara Baviskar | 55000 | Jaipur | System Engineer | 2021-10-10 | 24 |
8 | Sana Sheik | 45000 | Pune | Software Engineer | 2020-09-10 | 26 |
9 | Swati Kumari | 50000 | Pune | Software Tester | 2021-01-01 | 25 |
10 | Mayuri Patel | 60000 | Mumbai | Project Manager | 2020-10-02 | 24 |
11 | Simran Khanna | 45500 | Kolhapur | HR | 2019-01-02 | 26 |
12 | Shivani Wagh | 50500 | Delhi | Software Developer | 2016-09-10 | 25 |
13 | Kiran Maheshwari | 50000 | Nashik | HR | 2013-12-12 | 23 |
14 | Tejal Jain | 40000 | Delhi | Project Manager | 2017-11-10 | 25 |
15 | Mohini Shah | 38000 | Pune | Software Developer | 2019-03-05 | 20 |
示例1:
编写一个查询以检索所有员工工资大于50000的记录。
查询:
mysql> SELECT * FROM employees WHERE Salary > 50000;
上述查询将显示所有那些员工工资大于50000的记录。根据条件,低于50000工资的记录将不会被显示。
您将会得到以下输出:
根据预期的输出,只显示那些员工薪水大于50000的记录。员工表中有六条记录满足给定条件。
示例2:
编写一个查询来更新员工记录,并将更新后的姓名设置为’Harshada Sharma’,条件是员工的城市名称为Jaipur。
查询:
mysql> UPDATE employees SET Name = "Harshada Sharma" WHERE City = "Jaipur";
上述查询将会将员工的名字更新为“Harshada Sharma”,当员工所在的城市是Jaipur时。
为了验证记录是否已经更新,我们将运行一个选择查询。
mysql> SELECT * FROM employees;
只有一个员工表中的记录,该记录的城市为’Jaipur’。该记录的ID为3,满足给定条件。根据给定条件,员工ID为3的员工姓名现在更改为’Harshada Sharma’。
示例3:
编写一个查询来删除员工加入日期为”2013-12-12″的记录。
查询:
mysql> DELETE FROM employees WHERE Date_of_Joining = "2013-12-12";
以上查询将删除加入日期为“2013-12-12”的雇员的详细信息。
为了验证上述查询的结果,我们将执行选择查询。
mysql> SELECT *FROM employees;
在员工表中只有一条记录的员工入职日期为’2013-12-12’。该记录的ID为13,符合给定的条件。因此,根据给定的条件,员工ID为13的员工现已从员工表中删除。
2. GROUP BY子句
在结构化查询语言中,Group By子句用于将相似类型的记录按组进行排列。在结构化查询语言中,Group By子句与Select语句一起使用。Group By子句放置在SQL语句的where子句之后。Group By子句通常与聚合函数一起使用,例如max()、min()、avg()、sum()、count(),以根据一个或多个列分组结果。
Group By子句的语法:
SELECT * FROM TABLENAME GROUP BY COLUMNNAME;
上述语法将选择表中的所有数据或记录,但它将根据查询中给定的列名将所有这些数据或记录按组排列。
具有聚合函数的Group By子句的语法:
SELECT COLUMNNAME1, Aggregate_FUNCTION (COLUMNNAME) FROM TABLENAME GROUP BY COLUMNNAME;
让我们通过例子来了解Group By子句。
考虑以下数据的员工表:
E_ID | Name | Salary | City | Designation | Date_of_Joining | Age |
---|---|---|---|---|---|---|
1 | Sakshi Kumari | 50000 | Mumbai | Project Manager | 2021-06-20 | 24 |
2 | Tejaswini Naik | 75000 | Delhi | System Engineer | 2019-12-24 | 23 |
3 | Anuja Sharma | 40000 | Jaipur | Manager | 2021-08-15 | 26 |
4 | Anushka Tripathi | 90000 | Mumbai | Software Tester | 2021-06-13 | 24 |
5 | Rucha Jagtap | 45000 | Bangalore | Project Manager | 2020-08-09 | 23 |
6 | Rutuja Deshmukh | 60000 | Bangalore | Manager | 2019-07-17 | 26 |
7 | Swara Baviskar | 55000 | Jaipur | System Engineer | 2021-10-10 | 24 |
8 | Sana Sheik | 45000 | Pune | Software Engineer | 2020-09-10 | 26 |
9 | Swati Kumari | 50000 | Pune | Software Tester | 2021-01-01 | 25 |
10 | Mayuri Patel | 60000 | Mumbai | Project Manager | 2020-10-02 | 24 |
11 | Simran Khanna | 45500 | Kolhapur | HR | 2019-01-02 | 26 |
12 | Shivani Wagh | 50500 | Delhi | Software Developer | 2016-09-10 | 25 |
13 | Kiran Maheshwari | 50000 | Nashik | HR | 2013-12-12 | 23 |
14 | Tejal Jain | 40000 | Delhi | Project Manager | 2017-11-10 | 25 |
15 | Mohini Shah | 38000 | Pune | Software Developer | 2019-03-05 | 20 |
例子 1:
编写一个查询来显示员工表的所有记录,但根据年龄列对结果进行分组。
查询:
mysql> SELECT * FROM employees GROUP BY Age;
以上查询将按年龄列对员工表的所有记录进行分组显示。
您将得到以下输出:
示例2:
编写一个查询,按职位和薪水分组显示员工表的所有记录。
查询:
mysql> SELECT * FROM employees GROUP BY Salary, Designation;
以上查询将显示所有员工表的记录,但按薪水和职位列进行分组。
您将获得以下输出:
使用聚合函数的GROUP BY子句的示例
示例1:
编写一个查询,列出在特定职位上工作的员工数量,并按员工的职位分组显示结果。
查询:
mysql> SELECT COUNT (E_ID) AS Number_of_Employees, Designation FROM employees GROUP BY Designation;
以上查询将显示与相应的员工人数一起工作在该职位上的职位。所有这些结果将按职位列分组。
您将获得以下输出:
根据预期输出,显示具有相应员工数量的职位。
示例2:
编写查询,按照员工的年龄分组,显示员工薪水的总和。
查询:
mysql> SELECT SUM (Salary) AS Salary, City FROM employees GROUP BY City;
上述查询将首先计算每个城市工作的薪资总和,然后根据年龄列将薪资总和和相应的薪资分组显示。
您将得到以下输出:
TABLENAME GROUP BY COLUMNNAME HAVING CONDITION;
考虑以下数据的员工表:
E_ID | Name | Salary | City | Designation | Date_of_Joining | Age |
---|---|---|---|---|---|---|
1 | Sakshi Kumari | 50000 | Mumbai | Project Manager | 2021-06-20 | 24 |
2 | Tejaswini Naik | 75000 | Delhi | System Engineer | 2019-12-24 | 23 |
3 | Anuja Sharma | 40000 | Jaipur | Manager | 2021-08-15 | 26 |
4 | Anushka Tripathi | 90000 | Mumbai | Software Tester | 2021-06-13 | 24 |
5 | Rucha Jagtap | 45000 | Bangalore | Project Manager | 2020-08-09 | 23 |
6 | Rutuja Deshmukh | 60000 | Bangalore | Manager | 2019-07-17 | 26 |
7 | Swara Baviskar | 55000 | Jaipur | System Engineer | 2021-10-10 | 24 |
8 | Sana Sheik | 45000 | Pune | Software Engineer | 2020-09-10 | 26 |
9 | Swati Kumari | 50000 | Pune | Software Tester | 2021-01-01 | 25 |
10 | Mayuri Patel | 60000 | Mumbai | Project Manager | 2020-10-02 | 24 |
11 | Simran Khanna | 45500 | Kolhapur | HR | 2019-01-02 | 26 |
12 | Shivani Wagh | 50500 | Delhi | Software Developer | 2016-09-10 | 25 |
13 | Kiran Maheshwari | 50000 | Nashik | HR | 2013-12-12 | 23 |
14 | Tejal Jain | 40000 | Delhi | Project Manager | 2017-11-10 | 25 |
15 | Mohini Shah | 38000 | Pune | Software Developer | 2019-03-05 | 20 |
3. HAVING 子句:
当需要对表中的列设置条件时,可以使用SQL中的WHERE子句。但如果想在Group By子句中对列使用任何条件,则使用HAVING子句和Group By子句来表示列条件。
语法:
TABLENAME GROUP BY COLUMNNAME HAVING CONDITION;
考虑包含以下数据的employees表:
E_ID | Name | Salary | City | Designation | Date_of_Joining | Age |
---|---|---|---|---|---|---|
1 | Sakshi Kumari | 50000 | Mumbai | Project Manager | 2021-06-20 | 24 |
2 | Tejaswini Naik | 75000 | Delhi | System Engineer | 2019-12-24 | 23 |
3 | Anuja Sharma | 40000 | Jaipur | Manager | 2021-08-15 | 26 |
4 | Anushka Tripathi | 90000 | Mumbai | Software Tester | 2021-06-13 | 24 |
5 | Rucha Jagtap | 45000 | Bangalore | Project Manager | 2020-08-09 | 23 |
6 | Rutuja Deshmukh | 60000 | Bangalore | Manager | 2019-07-17 | 26 |
7 | Swara Baviskar | 55000 | Jaipur | System Engineer | 2021-10-10 | 24 |
8 | Sana Sheik | 45000 | Pune | Software Engineer | 2020-09-10 | 26 |
9 | Swati Kumari | 50000 | Pune | Software Tester | 2021-01-01 | 25 |
10 | Mayuri Patel | 60000 | Mumbai | Project Manager | 2020-10-02 | 24 |
11 | Simran Khanna | 45500 | Kolhapur | HR | 2019-01-02 | 26 |
12 | Shivani Wagh | 50500 | Delhi | Software Developer | 2016-09-10 | 25 |
13 | Kiran Maheshwari | 50000 | Nashik | HR | 2013-12-12 | 23 |
14 | Tejal Jain | 40000 | Delhi | Project Manager | 2017-11-10 | 25 |
15 | Mohini Shah | 38000 | Pune | Software Developer | 2019-03-05 | 20 |
示例 1:
编写一个查询来显示员工的名称、薪水和城市,其中员工的最高薪水大于40000,并按职位分组结果。
查询:
mysql> SELECT Name, City, MAX (Salary) AS Salary FROM employees GROUP BY Designation HAVING MAX (Salary) > 40000;
您将获得以下输出:
上述输出显示了一个员工的姓名、工资和所在城市,其中员工的工资大于40000,按照职称分组。(拥有相似职称的员工位于同一组,具有其他职称的员工单独分组)。
示例2:
编写一个查询,显示员工的姓名和职称,其中员工的工资总和大于45000,并按城市对结果进行分组。
查询:
mysql> SELECT Name, Designation, SUM (Salary) AS Salary FROM employees GROUP BY City HAVING SUM (Salary) > 45000;
您将获得以下输出:
上述输出显示了员工的姓名、职位和工资。根据城市对薪水求和,薪水总和大于45000(相同城市的员工放在一组,不同城市的员工放在不同组中)。
4. ORDER BY子句
在SQL中,当我们想要对任何内容进行排序时,我们使用ORDER BY子句。SQL中的ORDER BY子句可以帮助我们根据表中的特定列对数据进行排序。这意味着我们执行ORDER BY子句的特定列中存储的所有数据都将被排序。相应的列值将按照我们在之前步骤中获得值的顺序显示。
众所周知,排序意味着按照升序或降序排序。同样地,ORDER BY子句根据我们的需求以升序或降序方式对数据进行排序。当与ORDER BY子句一起使用时,使用ASC关键字将按升序将数据排序,而使用DESC关键字将按降序将记录排序。
默认情况下,如果我们没有指定排序顺序,则SQL中的排序将使用ORDER BY子句按升序进行排序。
在进行排序示例之前,让我们首先看一下没有asc和desc关键字的ORDER BY子句的语法,这样我们就可以更容易地通过示例进行了解。
没有asc和desc关键字的ORDER BY子句的语法:
SELECT COLUMN_NAME1, COLUMN_NAME2 FROM TABLE_NAME ORDER BY COLUMNAME;
ORDER BY子句的语法用于按升序进行排序:
SELECT COLUMN_NAME1, COLUMN_NAME2 FROM TABLE_NAME ORDER BY COLUMN_NAME ASC;
ORDER BY子句的语法,按降序排序:
SELECT COLUMN_NAME1, COLUMN_NAME2 FROM TABLE_NAME ORDER BY COLUMN_NAME DESC;
考虑我们有一个带有以下数据的员工表:
E_ID | Name | Salary | City | Designation | Date_of_Joining | Age |
---|---|---|---|---|---|---|
1 | Sakshi Kumari | 50000 | Mumbai | Project Manager | 2021-06-20 | 24 |
2 | Tejaswini Naik | 75000 | Delhi | System Engineer | 2019-12-24 | 23 |
3 | Anuja Sharma | 40000 | Jaipur | Manager | 2021-08-15 | 26 |
4 | Anushka Tripathi | 90000 | Mumbai | Software Tester | 2021-06-13 | 24 |
5 | Rucha Jagtap | 45000 | Bangalore | Project Manager | 2020-08-09 | 23 |
6 | Rutuja Deshmukh | 60000 | Bangalore | Manager | 2019-07-17 | 26 |
7 | Swara Baviskar | 55000 | Jaipur | System Engineer | 2021-10-10 | 24 |
8 | Sana Sheik | 45000 | Pune | Software Engineer | 2020-09-10 | 26 |
9 | Swati Kumari | 50000 | Pune | Software Tester | 2021-01-01 | 25 |
10 | Mayuri Patel | 60000 | Mumbai | Project Manager | 2020-10-02 | 24 |
11 | Simran Khanna | 45500 | Kolhapur | HR | 2019-01-02 | 26 |
12 | Shivani Wagh | 50500 | Delhi | Software Developer | 2016-09-10 | 25 |
13 | Kiran Maheshwari | 50000 | Nashik | HR | 2013-12-12 | 23 |
14 | Tejal Jain | 40000 | Delhi | Project Manager | 2017-11-10 | 25 |
15 | Mohini Shah | 38000 | Pune | Software Developer | 2019-03-05 | 20 |
例子 1:
编写一个查询,按照职员表中员工职位的升序对记录进行排序。
查询:
mysql> SELECT * FROM employees ORDER BY Designation;
在一个SELECT查询中,我们对列’Designation’应用了ORDER BY子句来对记录进行排序,但是我们没有在ORDER BY子句之后使用ASC关键字来按升序排序。所以,默认情况下,如果我们没有指定asc关键字,数据将按照升序排序。
你将获得以下输出:
根据预期的输出,记录以员工职位的升序显示。
例2:
编写一个查询,按照员工的工资升序显示员工姓名和工资。 来自员工表。
查询:
mysql> SELECT Name, Salary FROM employees ORDER BY Salary ASC;
在SELECT查询中,使用ORDER BY子句对’Salary’列进行排序以排序记录。我们使用ASC关键字按升序对员工的薪水进行排序。
您将获得以下输出:
所有记录按照员工的薪水升序显示。
示例3:
编写一个查询,按照employees表中存储的员工姓名降序排序数据。
查询:
mysql> SELECT * FROM employees ORDER BY Name DESC;
在这里,我们使用ORDER BY子句对Name列应用SELECT查询来对数据进行排序。我们在ORDER BY子句后使用DESC关键字以按降序排列数据。
您将获得以下输出:
所有记录按照员工姓名降序显示。