什么是连接:
使用连接可以从多个表中查询数据。
Select table1.column,table2.column from table1, table2 where table1.column=table2.column
在where子句中写连接的条件,是因为在多个表中有相同的列名
笛卡尔:若一个表有5行记录,另一个表有6行记录,则用笛卡尔计算:一共有5*6=30行记录。
连接的类型:等值连接,不等连接,自连接,外连接。
如果两个表中有相同的列可以使用等值连接把两个表连在一起
使用等值连接的例子:select emp.ename,emp.empno,dept.deptno,dept.loc from emp,dept where emp.deptno=dept.deptno
使用表名是为了指定列在哪个表,同时也可以区分不同表的同一列名,一般情况下,我们可以使用表的别名来简化查询,如:select e.ename, e.empno, d.deptno, d.loc from emp e, dept d where e.deptno=d.deptno
非等值连接
如:select e.ename, e.sal, s.grade from emp e,salgrade s where e.sal between s.losal and s.hisal;
表的自连接:可以把一张表如emp表分成一个worker表和一个manager表,所以worker表中的mgr等于manager表中的empno。
如:select worker.ename, worker.mgr, ‘workers for’,manager.empno,manager.ename from worker,manmger where worker.mgr=manager.empno;
表的外连接:
外连接的运算符是(+)
外连接分为左连接和右连接
如:select table1.column, table2.column from table1, table2 where table1column(+)=table2.column
select table1.column, table2.column from table1, table2 where table1column=table2.column(+)
左连接是把加号放在等号的右边,输出的结果是由左边的和右边符合条件的共同组成
例子:select e.ename,d.depno,d.dname from emp e,dept d where e.deptno(+)=d.deptno
组函数:也叫做分组函数:分组函数就是运算一组记录,每一组返回一个值(结果)。
包括:group by(将数据进行分组) 和having(包括或者排除被分组的记录),除此之外还有avg,max,min,sum,count,方差,标准差等
数字类型的数据使用avg,sum函数,而min和max可以适用于任何类型的数据
如:Select avg(sal),max(sal),min(sal) from emp where job like ‘SALES%’;
Select min (hiredate),max(hiredate) from emp;
Group by 后面可以跟多个列,如:group by deptno,job
Having 后面跟的是分组函数,where不能跟分组函数
如:select deptno,max(sal) from emp group by deptno having avg(sal)>2000;
嵌套组函数:如:select max(avg(sal)) from emp group by deptno
子查询的规则:子查询要用括号括起来,子查询放在比较运算符的右边,子查询中不要出现order by子句,对于多行子查询要用多行运算符,单行子查询用单行运算符,单行运算符:=,>,<,>=,<=, 多行子查询的运算符:in,any,all
以上的子查询是错误的是因为子查询中会出现多个值,应该使用多行运算符,而等于号是单行运算符,所以以上的句子是错误的。
多行子查询中用的any与all的区别:<any,意思是小于最大值,>any是大于最小值
>all意思是大于最大值,<all是小于最小值。
Insert 语句的用法: insert into table (column,column,…) values(…..,….,….)
如:insert into dept (deptno,dname,loc) values(50,’sjuhduie’,’chain’);
Update语句 用法:update table set column=values where 条件
如:update emp set deptno=20 where empno=7782;
所有的记录被修改之后,只有commit之后才是真正的被修改成功了,rollback:相当于撤销,回到上一步执行的命令,而savepoint:是能回归到原先设定的位置。
数据库的对象:table ,view,sequence:序列,index:索引,synonym:同义词。
创建表:
create table 表名 as select * from 表名1,... ---复制和表名1一样的表,包括数据
create table 表名 as select * from 表名1,... where 1=2 ---复制和表名1一样的表,但没有数据
create table 表名 as select 字段1,字段2... from 表名1,... ---复制表名1表中指定的字段,包括数据
create table 表名(新字段名1,新字段名2...) as select 字段1,字段2... from 表名1,... ---复制表名1表中指定的字段,包括数据,并且改变列名
创建一个新表 creat table 表名(column datatype),datatype是数据类型,可以都用varchar2(size)
其他用户的表不能直接访问,所以在使用其他用户的表时需要加上用户名作为前缀。如:select * from scott.emp;
建表:如果自己重新创建一个名为dept的表,则如下:
select table dept (deptno number(2),
dname varchar2(14),
loc varchar2(12))
确认创建的表:describe dept
查询用户有哪些表:select * from user_tables;查询用户有哪些类型的对象:select distinct object_type from user_objects;
常见的数据类型:VARCHAR2(size),CHAR(size),NUMBER,DATE LONG等
使用子查询创建表:create table 表名 【column,column,..】as 子查询,如:
修改表结构
1.增加字段
alter table 表名 add 字段名 数据类型 [default 默认值]
2.修改字段(数据类型以及默认值)
alter table 表名 modify 字段名 数据类型 [default 默认值]
3.修改字段名
alter table 表名 rename column 旧列名 to 新列名
4.删除字段
alter table 表名 drop column 列名
修改表名
rename 旧表名 to 新表名
删除表
drop table 表名
在表中加注释:comment on table 表名 is ‘注释‘’;例如:comment table emp is ‘empioyyee information’;