数据库
DQL
作用:从一个或多个表中检索一列或多列数据。Select操作: 投影操作,选择操作,连接操作。 a.投影操作:将表的数据查询出来 b.选择操作:有条件获取数据 c.连接操作:将多表中的数据合并在一起。语法:
select *|[distinct] column |experssion [alias] from table;
select 列名或表达式
from 表名 用户.名
最简单的SQL组成部分:
select语句
from 语句
*:指定表中的所有列
distinct 列名:去重
column/expression:列名或表达式
column alias 定义列的别名
92: column as alias
SQL语句处理过程 a.用户书写sql语句 —>b.用户进程pl/sql将sql语句发送到 –>oracle服务器 创建一个会话(session)然后按照对应执行执行sql语句 以下流程执行select语句 1)分析语句 a)搜索SGA缓冲区中是否存在相同的语句 如果存在 直接将结果返回 b)检查语法,表名,权限 c)正在分析过程中给对象加锁。 d)生成执行计划 2)给变量赋值 3)执行语句 4)获取数据将数据返回给用户进程。
案例:每年给每个员工薪水提升1% 请计算提升之后的薪资,提升之前的薪资
select salary,salary * 1.01 from t_employees;
select salary,salary + salary *0.01 from t_employees;
where子句功能 1)where子句的功能 位置 后面可包含哪些合法内容 a)功能:用where子句对表中的记录进行过滤。 b)位置:紧跟 from子句之后order by子句(对查询的结果进行排序) 1)语法 order by 列名 desc|asc, 列名 desc|asc asc 升序 默认 desc:降序 ps: order by执行顺序 在select之后。(最后一个)分组及分组过滤(group by having) a.分组(group by) 1)group by按照一个或多个字段实现分组操作 语法: group by col,col2; 2)增加group by之后执行顺序 from子句 —>where子句 —>group by —>having—>select —>order by 3)group by之后跟hvaing语句 对分组之后数据进行过滤having子句 1)having子句必须跟在group by之后 2)having作用:将分组之后的数据行过滤。 3)having子句过滤数据:只有符合having条件的组才会被保留,在select后面组函数 才会被显示。 案例:求部门的平均工资大于5000的部门编号 select department_id,avg(salary) from t_employees group by department_id having avg(salary) > 5000; ps:1)having中能使用表的别名 但是不能用列的别名。 2)having后面可以使用组函数 及group by中出现的字段。子查询 A.什么叫子查询? 在一条sql语句中嵌入了select语句 B.执行过程? 1)执行顺序:先执行子查询 子查询返回的结果作为主查询的条件,在执行主查询。 2)执行次数: 子查询只执行一次. 3)执行的结果: 如果子查询返回结果为多个值,oracle会自动去掉重复的值, 将结果返回给主查询。 C.子查询的规则 1)一个子查询必须放在小括号中. 2)在单行子查询中用单行运算符,在多行子查询中用多行运算符 3)将子查询放在比较条件的右边,在子查询中不需要使用order by子句. D.Exists(存在)运算符 a)原理:exists 采用循环方式。判断e表中是否存在记录,然后将e表中的 记录作为 emp表中的条件,只要在emp表中找到一条可以匹配的记录即可。 b)执行过程: 1)外部查询得到一条记录并将其传入到内部查询作为其查询条件。 2)对内部表中的记录依次扫描,如果根据条件判断存在一条记录与外部 传入的条件匹配。那么就停止扫描。返回true. 将外部表中的记录存入到结果 集中,若扫描全部记录,没有一条符合条件,返回false, 外部表中的该条记录 被过滤,不能出现在结果集中。 3)重复执行 1-2 直到外部表的所有记录都被判断一遍才停止。 F.not exists(不存在运算符)多表连接 a.笛卡尔积的问题 1)一个连接条件被遗漏 2)一个连接条件不正确 b.如何避免笛卡尔积 在where条件中包含正确的连接条件 c.多表查询 1)内连接(inner join on) a)原理 T1表和T2表做内连接 连接的条件 t1.id = t2.id select * from t1 inner join t2 on t1.id = t2.id; T1:驱动表 T2:匹配表 b)等值连接 1)两张表有描述相同属性的列 2)常见的形式为父表的主键 和子表的外键 c)非等值连接 (1)可以用between and这样运算符作为多表连接条件 (2)所谓的表之间的关系,实际上指的是表中行之间的关系. 该关系可可以通过将表中的列写成表达式的方式来实现。 d)自连接:同一张表中的列之间有关系 实际反映的是同一张表中每一行 记录存在的关系 2)外连接 A)外连接的原理 外连接的结果集 = 内连接的结果集 + 驱动表中匹配不上的所有记录 外链接核心: 可以将驱动表中所有的记录全部显示 B)外链接的写法 t1表 t2表 连接条件 t1.id = t2.id 左外连接: from t1 left join t2 on t1.id = t2.id 右外连接: from t1 right join t2 on t1.id = t2.id C)区分驱动表和匹配表 左外连接: 左边是驱动表 t1为驱动表 t2匹配表 右外连接: 右边是驱动表 t2为驱动表 t1匹配表
案例:那些人是员工
select * from t_employees emp left join t_employees mgr
on emp.manager_id = mgr.employee_id where mgr.employee_id is not null;
DML和DDL
表的创建和维护 1)表的创建(create table语句):功能:用SQL语句在数据库中创建一个表对象这个对象可以存储数据。语法如下
create table 表名(
列名 数据类型 约束,
列名 数据类型 约束
);
3)表名和列名的命名规则:a)第一个位置是字母 b)名字长度1-30个字符长 c)只能包含 A-Z a-z 0-9 _$# d)同一个命名空间里面的对象不能重名。e)不能使用关键字 4)字段的数据类型 varchar2(size)变长字符串 char(size)定长字符串 可以不指定长度 默认1个字符 number(p,s) p整个数字的位数 s小数位 最大精度38 varchar(size)变长字符串 date 日期和时间 long 最大存2g的可变长字符类型 clob 最大4g的可变长字符 RAW(size)原始的二进制 最大2g long raw 可变长二进制 最大2g blob:二进制 最大4g bfile:二进制存储在一个外部文件中最大4g rowid:十六进制的串,表示行所在表中的唯一地址 rownum:伪列 唯一 不重复 连续的数字
案例:创建一个部门表
create table s_dept(
deptno number(10),--部门编号
dname varchar2(20),--部门名称
location varchar2(30) --位置
);
.修改表的语句及基本语法 1)添加一个新列语法: alter table 表名 add(列名 数据类型);ps:添加的新列只能放在最后。2)修改列(数据类型 大小 默认值)语法: alter table 表名 modify(列名 数据类型 默认值)
修改列的原则:
1)可以增加列的宽度和精度。
2)只能当列中包含空值时,才可以减少列的宽度和精度。
3)对默认值得改变,仅仅对后面插入的数据有效。
4)varchar可以转换成varchar2,反之仅当列的中数据为空才可以转。
3)删除一个列语法: alter table 表名 drop column 列名;
删除列的原则:
a.该列是否包含的数据是无关紧要的。
b.一次只能删除一列,列被删除后无法恢复
c.不能删除所有的列,必须保留一个列的存在.
4)重命名(rename)修改表,视图的名字语法: rename oldname to newname;
案例:修改列名
alter table s_dept rename column dname to sname;
案例:修改表名
rename s_dept to d_dept;
截断表(truncate table)功能:用于删除表中所有的数据,并且释放该表所使用存储空间;语法:truncate table 表名表数据的插入(insert) 1)insert语句的语法 insert into 表名 (字段1,字段2) values(值1,值2); 字段 和值1:1 insert into 表名 values(值1,值2); 值的个数及类型和表中的字段相同 ps:一次只能插入一条记录 2)插入的记录可以包含空值 insert into s_dept(deptno,dname) values(1,null); ps:插入数据后需要使用 commit提交数据才能将内存中的数据写入 到数据文件中。表数据的更新 update 语法: update 表名 set 字段名=值, 字段名=值 where 条件
案例:将10部门工资提升10%
update t_employees set salary = salary * 1.1 where department_id = 10;
案例:将所有部门员工工资提升20%
update t_employees set salary = salary * 1.2;
表数据的删除 delete 语法: delete from 表名 where 条件
案例:将10部门全部解雇
delete from t_employees where department_id=10;
mysql和oracle的区别
mysql一般适用于中小型数据库 oracle一般适用于大型数据库mysql中有自动增长的数据类型,插入记录时不用操作此字段,会自动获取数据值,oracle没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋给此字段。事务:mysql默认对事物是自动提交的,oracle默认是不自动提交的,需要手动提交,写commit;指令或者点击commitmysql中给字段起别名,双引号或者单引号都可以用,oracle中的单引号主要是应用于计算的时候,起别名用的是双引号。mysql默认的端口号是3306,oracle默认的端口号是1521mysql中的过滤空值使用ifnull(a,b),oracle则使用nvl(a,b),nvl2(a,b)mysql中只有一个用户,是以数据库进行分类的,oracle是以用户进行分类的。
总结
varchar2 和varchar char之间区别? a.varchar2必须指定宽度,最大长度 4000字节,char可以不指定长度 缺省值为1个字符,varchar 必须指定宽度。b.varchar2以存储实际字符长度来分配空间 varchar以存储实际字符长度来分配空间,char按照定义长度来分配空间。c.varchar2 是oracle独有的数据类型,varchar 所有数据库通用的数据类型,varchar可以直接转换成varchar2 但varchar2必须在列为空,情况下才能转换成varchar。truncate 和 delete区别? 相同点: a.都能删除表中的数据, b.删除数据 但不删除表结构。 不同点: a.truncate 执行速度要比 delete块 b.delete 可以跟where子句 可以选择性删除 truncate是一次性删除 c.delete删除后可以通过rollback回滚恢复数据,truncate立即执行且释放空间 所以数据无法恢复where子句和having子句的区别? 1)过滤的数据不同 where过滤是行数据 having过滤的是分组之后组数据 2)过滤的函数不同 where只能包含单行函数 having只能在group by之后出现 表达式 组函数 3)执行顺序不同 where子句在group by之前执行 having子句 在group by之后执行。