暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

单表查询

SQL新手 2022-12-08
146

单表查询是指仅涉及一个表的查询。

单表查询语法

单表查询的语法如下:

SELECT [ALL | DISTINCT] select_list FROM table_name
              [ WHERE query_condition ]
              [ GROUP BY group_by_expression ]
              [ HAVING group_condition ]
              [ ORDER BY column_list ][ASC | DESC]
              [ LIMIT limit_clause ]

column_list:
 column_name[,column_name...] 

当 WHEREGROUP BYHAVINGORDER BYLIMIT 这些关键字一起使用时,先后顺序有明确的限制。关键字执行顺序如下:

  1. 执行 FROM 找到表。

  2. 执行 WHERE 指定约束条件。

  3. 执行 GROUP BY 将取出的每条记录进行分组(聚合)。如果没有 GROUP BY,则整体作为一组。

  4. 执行 HAVING 将分组的结果进行筛选。

  5. 执行 SELECT

  6. 执行 DISTINCT 去重。

  7. 执行 ORDER BY 将结果按条件升序或降序排序。

  8. 执行 LIMIT 限制结果的条数。

WHERE 和 HAVING 的区别是,WHERE 是在分组前对数据进行筛选,而 HAVING 是在分组后的结果里进行筛选,最后返回整个 SQL 的查询结果。

SELECT 查询基础

创建示例表 emp 和 dept,并插入数据。

CREATE TABLE dept(  
    deptno           NUMBER(2,0),  
    dname            VARCHAR(14),  
    location         VARCHAR(13),   
    CONSTRAINT pk_dept PRIMARY KEY(deptno)  
);

CREATE TABLE emp(  
    empno         NUMBER(4,0),  
    empname       VARCHAR(10),  
    job           VARCHAR(9),  
    mgr           NUMBER(4,0),  
    hiredate      DATE,  
    sal           NUMBER(7,2),  
    comm          NUMBER(7,2),        
    deptno        NUMBER(2,0),   
    CONSTRAINT PK_emp PRIMARY KEY (empno), 
    CONSTRAINT FK_deptno  FOREIGN KEY (deptno)  REFERENCES dept (deptno)  
);

INSERT INTO dept VALUES (20,'ACCOUNTING','Los Angeles');
INSERT INTO dept VALUES (30,'OPERATIONS','CHICAGO');
INSERT INTO dept VALUES (40,'SALES','NEW YORK');

INSERT INTO emp VALUES (1698,'BLAKE','MANAGER',1839,'1981-5-1',2850,null,30);
INSERT INTO emp VALUES (1566,'JONES','MANAGER',1839, '1981-4-2',2975,null,40);
INSERT INTO emp VALUES (1788,'SCOTT','ANALYST',1566, '1987-7-15',3000,null,20);
INSERT INTO emp VALUES (1902,'FORD','ANALYST',1566, '1981-12-5',3000,null,40);
INSERT INTO emp VALUES (1369,'SMITH','CLERK',1902, '1980-12-17',800,null,20);
INSERT INTO emp VALUES (1499,'ALLEN','SALESMAN',1698, '1981-2-20',1600,300,30);

查询全部列

* 表示返回表中所有字段。示例如下:

obclient> SELECT * FROM emp;
+-------+---------+----------+------+------------+---------+--------+--------+
| empno | empname | job      | mgr  | hiredate   | sal     | comm   | deptno |
+-------+---------+----------+------+------------+---------+--------+--------+
|  1369 | SMITH   | CLERK    | 1902 | 1980-12-17 |  800.00 |   NULL |     20 |
|  1499 | ALLEN   | SALESMAN | 1698 | 1981-02-20 | 1600.00 | 300.00 |     30 |
|  1566 | JONES   | MANAGER  | 1839 | 1981-04-02 | 2975.00 |   NULL |     40 |
|  1698 | BLAKE   | MANAGER  | 1839 | 1981-05-01 | 2850.00 |   NULL |     30 |
|  1788 | SCOTT   | ANALYST  | 1566 | 1987-07-15 | 3000.00 |   NULL |     20 |
|  1902 | FORD    | ANALYST  | 1566 | 1981-12-05 | 3000.00 |   NULL |     40 |
+-------+---------+----------+------+------------+---------+--------+--------+
6 rows in set

等价于:

obclient> SELECT empname, empno, job, mgr, hiredate, sal,comm, deptno FROM emp;

查询指定列

obclient> SELECT empname, deptno FROM emp;
+---------+--------+
| empname | deptno |
+---------+--------+
| SMITH   |     20 |
| ALLEN   |     30 |
| JONES   |     40 |
| BLAKE   |     30 |
| SCOTT   |     20 |
| FORD    |     40 |
+---------+--------+
6 rows in set

在查询时可以为列设置别名。示例如下:

obclient> SELECT empname AS 员工名称, deptno AS 部门编号 FROM emp;
+--------------+--------------+
| 员工名称      | 部门编号      |
+--------------+--------------+
| SMITH        |           20 |
| ALLEN        |           30 |
| JONES        |           40 |
| BLAKE        |           30 |
| SCOTT        |           20 |
| FORD         |           40 |
+--------------+--------------+
6 rows in set

在查询时可以对结果进行去重。示例如下:

obclient> SELECT deptno FROM emp;
+--------+
| deptno |
+--------+
|     20 |
|     30 |
|     40 |
|     30 |
|     20 |
|     40 |
+--------+
6 rows in set
  
obclient> SELECT DISTINCT deptno FROM emp;
+--------+
| deptno |
+--------+
|     20 |
|     30 |
|     40 |
+--------+
3 rows in set

在查询时可以使用 LIMIT 用来限制返回的行数,常用于分页等操作。示例如下:

obclient> SELECT empname, deptno FROM emp LIMIT 3;
+---------+--------+
| empname | deptno |
+---------+--------+
| SMITH   |     20 |
| ALLEN   |     30 |
| JONES   |     40 |
+---------+--------+
3 rows in set

查询经过计算的值

obclient> SELECT empname, sal-100, deptno FROM emp;
+---------+---------+--------+
| empname | sal-100 | deptno |
+---------+---------+--------+
| SMITH   |  700.00 |     20 |
| ALLEN   | 1500.00 |     30 |
| JONES   | 2875.00 |     40 |
| BLAKE   | 2750.00 |     30 |
| SCOTT   | 2900.00 |     20 |
| FORD    | 2900.00 |     40 |
+---------+---------+--------+
6 rows in set

在查询中可以对指定列进行函数处理,如下示例将 empname 结果列展示为小写字母。

obclient> SELECT LOWER(empname), sal, deptno FROM emp;
+---------+---------+--------+
| empname | sal-100 | deptno |
+---------+---------+--------+
| smith   |  800.00 |     20 |
| allen   | 1600.00 |     30 |
| jones   | 2975.00 |     40 |
| blake   | 2850.00 |     30 |
| scott   | 3000.00 |     20 |
| ford    | 3000.00 |     40 |
+---------+---------+--------+
6 rows in set

此外,指定列的查询还支持 WHERE 条件查询,请参见 条件查询

更多用法请参见 在查询中使用操作符和函数

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论