文章目录
1. SQL基本概念
SQL( Structured Query Language ):结构化查询语言
- SQL分类:
- 数据查询语言( DQL ):从表中 检索数据(select)
- 数据操作语言( DML ):对表中数据进行 增(insert)、删(delete)、改(update)
- 事务处理语言( TPL ): 主要是对数据进行 提交(commit)、回滚(rollback)
- 数据控制语言( DCL ): 主要是对用户的权限 授权(grant)、回收(revoke)
- 数据定义语言( DDL ): 对数据库进行 创建(create)、删除(drop)、修改(alter)
- 注意事项的语法:
- oracle的null:表示无效、无用、未赋值,未知的值
- oracle中的null操作: 任何与其进行算术操作,返回的值都是空值
2. 语法
- SQL语句的关键字不区分大小写,必须使用分号结束
- SQL语句有多条子句,尽量子句分行写 → 代码可读性
- 关键字尽量使用大写,其他语法元素(列名、表名等)则小写 → 代码可读性
(1) 列的普通检索、合并与算术操作
- 表中的列 与 算术操作列 进行 字符串合并输出 → 算术操作列必须必须打括号
- 别名加双引号表示按双引号的格式输出 - 区分大小写、可包含空格、特殊字符
- 原义字符(单引号):字符串字面量、日期
- 关键字distinct:消除重复行
select * from 表名 // 检索输出选中表的所有列数据
select distinct * from 表名 // 消除重复行
select 列名,列名 from 表名 // 检索输出选中表的所有指定列数据
select 列名 别名 from 表名 // 输出的列名为别名
select 列名 as 别名 from 表名
select 列名+算术运算符+数字/单引号字面量(字符串) from 表名 // 对指定列的值进行算术计算
select 列名 || 列名 from 表名 // 把多个列的列值 “字符串形式”合并成一列 输出
select 列名 || '字符串' || (算术操作咧) from 表名 // 合并算术操作列与其他列为一列
select concat(列名,列名/算术操作列) from 表名 // 合并列值为一列,concat只能写入两个参数
(2) 行的选择
注意:
- 【】表示可有可无,不影响 有结果输出
- { }表示里面内容必须有
- | 表示输出的内容可以是其他另一个选项
- 表达式:
select 【 distinct 】 { * | column | expression | function 【别名】 }
from 表名
【where 条件表达式 】
【order by 列名|表达式|列别名|列序号 【asc|desc】】
- 单词型比较操作符:
- like(模糊正则查询)
- %: 代表0个或多个任意字符 → 不代表1个字符
- _ : 仅代表一个任意字符
- escape: 转义字符,(escape+特殊字符) → 即指明是特殊字符
- like(模糊正则查询)
select 列名 from 表名 where 列名 like 'a%b__3@_' escape '@ '
// 查询的是列值含有 首字母为a、且以 3_ 结尾的、并且倒数第5个字符为b的 行元素
(3) 函数
单行函数( 变量|列名|表达式 ) → 可嵌套无数个单行函数
这些函数 可写在select、where、order by
分组函数、多行函数 – 只能嵌套两层
语法:
select 列|分组函数 from 表名
where 行筛选条件
group by 列名
having 分组函数的条件
order by 列名|分组函数表达式列
执行顺序
from(选表) --> where(选符合行) --> group by(行分组) --> having(选符合组) --> select(选输出的列) --> order by(排序行)
函数的语法以及注意事项
分组group by 列名有什么都需要写上去,除了分组函数
select deptno, ename, avg(count)
from emp
group by deptno , ename //分组字段后面所要写的列: 表显示的全部列,除了分组函数
//错误书写,会报错 // group by deptno
没有写 group by 则不能直接 写除了分组函数以为的其他列
select max(sal) from emp;
// select ename, max(sal) from emp 错误,无group by 则不能在输入其他的列
不能在where子句里写 有关分组函数的条件语句,有关分组函数条件的语句只能写在having 里面
select deptno, max(sal)
from emp
// where max(sal) > 30 则直接报错,分组函数条件语句需写在having后面
group by deptno
having max(sal) > 30;
注意 分组函数参数里面可以添加 distinct 去重
select count( distinct deptno ) from emp // 输出有员工的部门数量
注意 avg 只计算有值的列值,空值则忽略不计,为了避免出现平均算少的情况,需要使空值默认有值
select avg(nvl(sal, 0)) from emp; //行数有多少则除以多少,反映所有行的平均情况