SQL知识点1 - oracle

165 阅读4分钟

文章目录

1. SQL基本概念

SQL( Structured Query Language ):结构化查询语言

  • SQL分类:

    1. 数据查询语言( DQL ):从表中 检索数据(select)
    2. 数据操作语言( DML ):对表中数据进行 增(insert)、删(delete)、改(update)
    3. 事务处理语言( TPL ): 主要是对数据进行 提交(commit)、回滚(rollback)
    4. 数据控制语言( DCL ): 主要是对用户的权限 授权(grant)、回收(revoke)
    5. 数据定义语言( DDL ): 对数据库进行 创建(create)、删除(drop)、修改(alter)

  • 注意事项的语法:

    1. oracle的null:表示无效、无用、未赋值,未知的值
    2. oracle中的null操作: 任何与其进行算术操作,返回的值都是空值

2. 语法

  1. SQL语句的关键字不区分大小写,必须使用分号结束
  2. SQL语句有多条子句,尽量子句分行写 → 代码可读性
  3. 关键字尽量使用大写,其他语法元素(列名、表名等)则小写 → 代码可读性

(1) 列的普通检索、合并与算术操作

  1. 表中的列 与 算术操作列 进行 字符串合并输出 → 算术操作列必须必须打括号
  2. 别名加双引号表示按双引号的格式输出 - 区分大小写、可包含空格、特殊字符
  3. 原义字符(单引号):字符串字面量、日期
  4. 关键字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】】

[外链图片转存失败(img-kFFm3ghZ-1568540199525)(en-resource://database/2224:1)]

  • 单词型比较操作符:

    1. like(模糊正则查询)

      • %: 代表0个或多个任意字符 → 不代表1个字符
      • _ : 仅代表一个任意字符
      • escape: 转义字符,(escape+特殊字符) → 即指明是特殊字符
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;      //行数有多少则除以多少,反映所有行的平均情况