SQL语言
概念:
SQL
(Structured Query Language)为数据库的语言,在1974 年Boyce【博伊斯】和Chamberlin【钱伯林】提出的一种介于关系代数与关系演算之间的结构化查询语言,是一个通用的、功能极强的关系型数据库语言。
命令分类操作:
分类 | 命令 |
---|---|
DDL | create:创建;drop:删除;alter:修改;rename:重命名;truncate:截断 |
DML | insert:插入;delete:删除;update:更新;select:查询 |
DCL | grant:授权;revoke:回收权利;commit: 提交事务;rollback:回滚事务 |
数据库—表
1.表是从属于用户的
当前用户查询自己的表时,用户名. 可以省略,其他用户查询别的用户表时,不能省略,还必须存在权限
2.表是逻辑表(概念表),不是真实存在的物理表
块(8k) —>区(连续块)–>段(连续区) -->表(多个段) ,数据段不全是表,表一定是数据段。还有其他段:如索引段
3.表结构
表由表名、字段(名称+类型+约束)、记录 组成。与 java相对应
DB | JAVA |
---|---|
表名 | 类名 |
字段名 | 属性名 |
字段类型:number、char、varchar2、date… | 属性类型:基本数据类型|引用数据类型 |
字段约束:约束行为->创建表结构时加入,操作数据时生效 | 方法检查条件 |
记录:数据 | 对象:new |
三范式
1NF:
指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
2NF:
满足第一范式的前提下,第二范式就是非主属性非部分依赖于主键。
3NF:
满足第二范式的前提下,第三范式就是属性不依赖于其它非主属性。
范式总结:
简而言之,最终的目的避免数据重复冗余,1NF–>列不可再分最小原子 (避免重复);2NF–>主键依赖(确定唯一);3NF–>消除传递依赖(建立主外键关联 拆分表);
SELECT:
相关操作,代码演示:
--sql语句不区分大小写,要么全大写,要么全小写
--得到的数据称为 -> 结果集
--查询某个表格所有的字段信息
select * from 表名;
--查询某个表的指定字段名
select 列名 from 表名;
--查询某个表的多个列
select 列名1,列名2 from 表名;
--去除重复
select distinct 列名 from 表名;
--查询表达式
select 表达式 from 表名;
--使用别名,列名的 as 可用可不用,表名的别名不用 as
select 列名 as 别名 from 表名 别名
--注意点:1、*(通配符:查询所有的字段)
-- 2、as:字段别名可用可不用,表别名不可用
-- 3、"":原样输出别名,可存在空格,区分大小写
-- 4、'':表示字符串,使用 || 拼接
1.伪列:
不存在的列,构建虚拟的列
--count 和 name 就是伪列
select empno, 1*2 as count,'cmj' as name
from emp;
2.虚表
用于计算表达式,显示单条记录的值
--dual为虚表
select 1+1 from dual;
3.null
null 遇到数字参与运算的结果为 null,遇到字符串为空串
select 1+null from dual;
select '1'||null from dual;
--to_char是函数,转换为字符串
select 1||'2'||to_char(null) from dual;
select ename,sal*12+comm from emp;
--nvl内置函数,判断是否为null,如果为空,取默认值0,否
--则取字段实际值 select ename,sal*12+nvl(comm,0)
--from emp;
4.条件查询
使用 where 过滤。
4.1 比较:
= 、>、 <、 >=、 <=、 !=、 <>
这些符号简单易懂,就不多介绍了,<>
这个符号等同于 !=
4.2 且、或、非
and、or、not
select 列名 from 表名 where 条件1 and 条件2;
4.3 null
null不能使用条件判断,只能使用 is
--是否为空
select * from 表名 where 列名 is null;
--是否不为空,两种形式都可以
select * from 表名 where 列名 is not null;
select * from 表名 where not 列名 is null;
4.4 集合操作
Union、Union All、Intersect、Minus
Union
,并集(去重) 对两个结果集进行并集操作,不包括重复行同时进行默认规则的排序;
Union All
,全集(不去重) 对两个结果集进行并集操作,包括重复行,不进行排序 ;
Intersect
,交集(找出重复) 对两个结果集进行交集操作,不包括重复行,同时进行默认规则的排序;
Minus
,差集(减去重复) 对两个结果集进行差操作,不包括重复行,同时进行默认规则的排序
4.5 模糊查询
模糊查询,使用通配符:
%
:零个及以上(任意个数的)的字符
_
:一个字符
遇到内容中包含 % _ 使用escape(‘单个字符’)指定转义符
--查询列名中出现 A 的字段信息
select * from 表名 where 列名 like '%A%'
--查询列名中第二个字符是A的字段信息
select * from 表名 where 列名 like '_A%';
--查询列名出现 _ 的字段信息,a 为转义字符
select * from 表名 where 列名 like '%a_%' escape('a')
4.6 in和exists
in
相当于使用or的多个等值,定值集合 ,如果存在 子查询,确保 类型相同、字段数为1,如果记录多,效率不高,用于 一些 少量定值判断上
--查询该列的值与in()括号中数据匹配的字段信息
select * from 表名 where 列名 in(数据1,数据2...);
exists
条件为true,存在记录则返回结果,后续不再继续比较查询,与查询的字段无关,与记录有关
--无关系列
select *
from emp
where exists
(select deptno,dname from dept where dname in('SALES', 'ACCOUNTING'));
--有关系列,通过deptno连接两个表
select *
from emp e
where exists (select deptno, dname from dept d
where dname in ('SALES','ACCOUNTING') and e.deptno = d.deptno);
4.7 获取所有行记录
select * from emp;
--后期字符串拼接成SQL语句有优势
select * from emp where 1=1 ;
--效率低
select * from emp where ename like '%';
4.8 排序
使用 ORDER BY
排序,排序不是真实改变存储结构的顺序,而是获取的集合的顺序。
- 顺序 :
asc
(默认)desc
- 多字段: 在前面字段相等时,使用后面的字段排序
- 空排序: 降序为 desc,注意 null 为最后
--查询表显示获得补助的所有雇员名、工资及补助,并以工资升序和补助降序排序
select ename,sal,comm from emp order by sal,comm desc;