欢迎访问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...]
当 WHERE、GROUP BY、HAVING、ORDER BY、LIMIT 这些关键字一起使用时,先后顺序有明确的限制。关键字执行顺序如下:
执行
FROM找到表。执行
WHERE指定约束条件。执行
GROUP BY将取出的每条记录进行分组(聚合)。如果没有GROUP BY,则整体作为一组。执行
HAVING将分组的结果进行筛选。执行
SELECT。执行
DISTINCT去重。执行
ORDER BY将结果按条件升序或降序排序。执行
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




