Oracle版本:19c
一、DQL简介
-
DQL(Data Query Language) :数据查询语言,使用SQL语句实现对数据表的查询
-
SQL:Structured Query Language标准结构化查询语言简称
Oracle的DQL(数据查询语言)核心是SELECT语句,其语法结构完整且功能强大,支持从简单查询到复杂分析的各种场景。
1.1 基本语法结构
Oracle的DQL基本语法结构如下
cpp
SELECT [DISTINCT] 列名1, 列名2, ... | *
FROM 表名
[WHERE 条件]
[GROUP BY 列名]
[HAVING 分组条件]
[ORDER BY 列名 [ASC|DESC]];
SELECT子句:指定要查询的列或表达式
-
查询所有列:
SELECT * FROM 表名; -
查询指定列:
SELECT 列名1, 列名2 FROM 表名; -
DISTINCT关键字 :去除重复行,
SELECT DISTINCT 列名 FROM 表名; -
列别名 :使用
AS关键字或直接空格,SELECT 列名 AS 别名 FROM 表名;
FROM子句:指定数据来源表
-
单表查询:
FROM 表名; -
DUAL表 :Oracle特有虚拟表,用于计算和函数测试,
SELECT 1+3 FROM DUAL;
WHERE子句:筛选符合条件的行
-
比较运算符 :
=, >, <, >=, <=, !=, <> -
范围查询 :
BETWEEN...AND... -
集合查询 :
IN(值1, 值2, ...) -
模糊查询 :
LIKE '模式'(%匹配任意字符,_匹配单个字符) -
空值判断 :
IS NULL或IS NOT NULL -
逻辑运算符 :
AND, OR, NOT(优先级:NOT > AND > OR)
ORDER BY子句:对结果进行排序
-
升序 :
ORDER BY 列名 ASC(默认) -
降序 :
ORDER BY 列名 DESC -
多列排序 :
ORDER BY 列名1 DESC, 列名2 ASC -
空值处理 :
NULLS FIRST或NULLS LAST
GROUP BY子句:按列分组进行统计
-
基本用法:
SELECT 列名, 聚合函数 FROM 表名 GROUP BY 列名; -
HAVING子句 :对分组结果进行筛选,
GROUP BY 列名 HAVING 聚合函数 > 值;
二、SELECT的基础使用
2.1 SELECT语句的功能
基础的SELECT语句
cpp
SELECT *|{[DISTINCT] column [alias],...}
FROM table;
-
SELECT标识要显示的列(*代表所有列)
-
FROM标识包含这些列的表(从哪张表查询数据)
使用SELECT语句列出所有列的值
cpp
SELECT * FROM employees;

使用SELECT语句列出特定列的值

2.2 编写SQL语句的注意事项
-
SQL语句不区分大小写。
-
可以在一行或多行上输入SQL语句。
-
关键字不能缩写或跨行分割。
-
子句通常放在单独的行上。
-
缩进用于增强可读性。
-
在SQL Developer中,SQL语句可以选择以分号(;)终止。 执行多个SQL语句时需要分号。
-
在SQL * Plus中,要求每个SQL语句以分号(;)结尾。
列头(字段头)默认值
SQL Developer
-
默认标题对齐:左对齐
-
默认标题显示:大写
SQL*Plus
-
字符和日期列标题左对齐。
-
数字列标题右对齐。
-
默认标题显示:大写
SQL*Plus是Oracle官方提供的命令行工具,主要用于执行SQL/PL/SQL语句和数据库脚本;而SQL Developer是Oracle提供的图形化集成开发环境(IDE),功能更全面,支持数据库开发、管理和调试等复杂任务。
三、SELECT语句中算术表达式和NULL值
3.1 算术表达式
使用算术表达式创建具有数字和日期数据的表达式

使用算术表达式
cpp
-- 直接进行计算
SQL> SELECT 99*99 FROM DUAL;
99*99
----------
9801
SQL> SELECT (1+2)*3 FROM DUAL;
(1+2)*3
----------
9
cpp
-- 在列中进行运算
SELECT last_name, salary, salary + 300 FROM employees;

运算符优先级
和数学中的加减乘除一致,可以通过括号改变优先级
cpp
-- 不用括号
SELECT last_name, salary, 12*salary+100
FROM employees;
-- 使用括号
SELECT last_name, salary, 12*(salary+100)
FROM employees;


3.2 NULL
定义一个空值
-
空值是不可用,未分配,未知或不适用的值。
-
空不等于零或空格。
cpp
SELECT last_name, job_id, salary, commission_pct
FROM employees;

算数计算中的NULL
包含空值的算术表达式为空。
cpp
-- commission_pct列有的为NULL,有的不为NULL
-- 任何和NULL计算的结果都为NULL
SELECT last_name, 12*salary*commission_pct
FROM employees;

四、列别名
定义列别名
列别名:
-
重命名列标题
-
对计算有用
-
紧随列名之后(列名和别名之间也可以有可选的AS关键字)
-
如果包含空格或特殊字符,或者区分大小写,则需要双引号
使用列别名
cpp
-- 只有小写
-- 直接使用AS
SELECT last_name AS name, commission_pct comm
FROM employees;
-- 包含大小写或空格
-- 省略AS
SELECT last_name "Name" , salary*12 "Annual Salary"
FROM employees;


五、使用串联运算符,文字字符串,替代引号运算符和DISTINCT关键字
5.1 连接符||
连接符操作:
-
将列或字符串链接到其他列
-
用两个竖线(||)表示
-
创建作为字符表达式的结果列
cpp
-- 中间用:将两列连接起来
SELECT last_name||' : '||job_id AS "Employees" FROM employees;
-- 中间什么都不加直接将两列连接
-- 可见中间会自动用_连接
SELECT last_name || job_id AS "Employee Details" FROM employees;


5.2 文字字符串
文字是SELECT语句中包含的字符,数字或日期。
日期和字符文字值必须用单引号引起来。
每个字符串对于返回的每一行输出一次。
cpp
-- 中间用is a将两列连接起来
SELECT last_name ||' is a '||job_id AS "Employee Details" FROM employees;

5.3 替代运算符q'[]'
指定您自己的引号定界符。
选择任何定界符。
提高可读性和可用性。
cpp
-- 示例
SELECT '''HELLO WORLD''' FROM DUAL;-- '''' 最前面的和最后面的两个单引号代表的是界限,中间的两个单引号代表的是转义后一个单引号
SELECT '"HELLO WORLD"' FROM DUAL;
-- 可以看见如果打涉及到特殊符号的内容非常不方便,那么就可以使用替代运算符q'[]',其中[]内即可正常输入任何想要的内容,不需要再转义

cpp
-- 使用了替代运算符后,可见Department's不需要转义也可以正常输出了
SELECT department_name || q'[ Department's Manager Id: ]' || manager_id AS "Department and Manager" FROM departments;

5.4 去重运算符 DISTINCT
查询的默认显示为所有行,包括重复的行。
cpp
SELECT department_id FROM employees; -- 不去重
SELECT DISTINCT department_id FROM employees; -- 去重


六、列出表结构DESCRIBE
使用DESCRIBE命令显示表的结构。
或者,在"连接"树中选择表,然后使用"列"选项卡查看表结构。
cpp
DESC[RIBE] tablename -- 可以简写为DESC
cpp
DESC employees; -- 简写
DESCRIBE employees; -- 全写
-- 返回结果不会有任何区别
