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

OceanBase Cloud快速入门第37期:什么是单表查询?

欢迎访问OceanBase官网获取更多信息:https://www.oceanbase.com/


单表查询语法

单表查询的语法如下:

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);

查询全部列

查询表 emp 的全部数据,* 表示返回表中所有字段。示例如下:

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;

查询指定列

在表中根据列名查找指定列数据。

示例:

  • 查询表 emp 中的 empname 和 deptno 列。

    obclient> SELECT empname, deptno FROM emp;
    +---------+--------+
    | empname | deptno |
    +---------+--------+
    | SMITH   |     20 |
    | ALLEN   |     30 |
    | JONES   |     40 |
    | BLAKE   |     30 |
    | SCOTT   |     20 |
    | FORD    |     40 |
    +---------+--------+
    6 rows in set
    
  • 在查询时可以通过 AS + 列别名 或者直接在原列名后加别名的方式为查询列设置别名。

    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 empname '员工名称', deptno AS '部门编号' FROM emp;
    +--------------+--------------+
    | 员工名称     | 部门编号      |
    +--------------+--------------+
    | SMITH        |           20 |
    | ALLEN        |           30 |
    | JONES        |           40 |
    | BLAKE        |           30 |
    | SCOTT        |           20 |
    | FORD         |           40 |
    +--------------+--------------+
    6 rows in set
    
  • 在查询时可以通过添加 DISTINCT 关键字对结果进行去重。

    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
    

查询经过计算的值

在查询中可以对指定列进行数据处理。

示例:

  • 将查询的 sal 列的值 -100 再输出。

    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
    



欢迎访问OceanBase官网获取更多信息:https://www.oceanbase.com/

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

评论