去掉重复记录[z6]
where 将不满足的过滤掉
把列与列,列与字符串连接在一起,用“||”表示,可以用来合成。
select last_name || job_id from employees;
select employee_id ,job_id,last_name fromemployees where department_id = 90;
字符和日期要包含在单引号中。
字符大小写敏感,日期格式敏感。
默认的日期格式是 DD-MON-RR
where解析顺序从右到左
select last_name ,job_id from employees where salary between 3000 and 5000;
IN(set):等值与列表的值
select last_name ,job_id,manager_id from employees where manager_id in (100);
% 代表零个或多个字符(任意个字符)。
_ 代表一个字符。
And,Or,Not
使用 ORDER BY 子句排序
ASC(ascend): 升序 [z8]
DESC[z9] (descend): 降序
Order by 用法[z10]
ORDER BY 子句在SELECT语句的结尾。
例如:select last_name,job_id,department_id,hire_date from employees order by hire_date;
按别名;来排序也可以:
select last_name,job_id,department_id,salary* 12 sal,hire_date from employeesorder by sal;
LOWER('HHHHHHHH')
select lower('HHHHHHHH') from dual;
输出结果:
hhhhhh
UPPER('SQLCOURSE')
select UPPER('SQL Course') from dual;
输出结果
SQL COURSE
CONCAT('Hello', 'World') HelloWorld
substr('nihao',3) [z11]
SUBSTR[z12] ('HelloWorld',1,5) Hello
LENGTH('HelloWorld') 10
LPAD[z13] (salary,10,'*')
RPAD(salary, 10, '*')
INSTR[z14] ('HelloWorld', 'W') 6
TRIM[z15] ('H' FROM 'HelloWorld') elloWorld
replace[z16] ('abcd', 'b', 'm') amcd
ROUND: 四舍五入
ROUND(45.926,2) 45.93
TRUNC: 截断
TRUNC(45.926,2) 45.92
MOD: 求余
MOD(1600,300) 100
函数SYSDATE
日期
select last_name,(sysdate-hire_date)/7 fromemployees where department_id = 90;
例子:昨天 今天 明天
select (sysdate-1) 昨天,sysdate 今天,(sysdate+1)明天
2 from dual;
昨天 今天 明天
-------------- ----------------------------
25-8月 -13 26-8月 -13 27-8月 -13
隐式<-à显式
16.1、TO_CHAR 函数对日期的转换
TO_CHAR(date, 'format_model')
必须包含在单引号中而且大小写敏感。
可以包含任意的有效的日期格式。
日期之间用逗号隔开。
对数字的转换
TO_CHAR(number, 'format_model')
将字符转换成数字:
TO_NUMBER(char[, 'format_model'])
函数将字符转换成日期:
TO_DATE(char[, 'format_model'])
1、 :将空值转换成一个已知的值:
NVL(commission_pct,0)[z17]
NVL函数使分组函数无法忽略空值
SELECT COUNT(DISTINCT department_id)
2 FROM employees;
COUNT(DISTINCTDEPARTMENT_ID)
----------------------------
11
select avg(commission_pct) from employees;
AVG(COMMISSION_PCT)
-------------------
0.222857142857143
NVL2 (expr1, expr2,expr3) : expr1不为NULL,返回expr2;为NULL,返回expr3
NULLIF (expr1, expr2) : 相等返回NULL,不等返回expr1
COALESCE 与 NVL相比的优点在于COALESCE可以同时处理交替的多个值。
如果第一个表达式为空,则返回下一个表达式,对其他的参数进行COALESCE。
即:找第一个不为空的值。
使用GROUP BY 子句数据分组。使用HAVING 子句过滤分组结果集
组合函数:avg,count,max,min,sum
组合函数语法:
SELECT [column,] group_function(column),...
FROM table
[WHERE condition]
[GROUPBY column]
[ORDERBY column
返回 expr非空且不重复的记录总数
SELECT COUNT(DISTINCT department_id)
2 FROM employees;
COUNT(DISTINCTDEPARTMENT_ID)
----------------------------
11
SELECT column, group_function(column)
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[ORDER BY column];
可以使用GROUPBY 子句将表中的数据分成若干组
例子[z18]
包含在 GROUP BY 子句中的列不必包含在SELECT 列表中
条件:
1、行已经被分组。
2. 使用了组函数。
3. 满足HAVING子句中条件的分组将被显示。
语法:
SELECT column,group_function
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING group_condition]
[ORDER BY column]
使用外连接可以查询不满足连接条件的数据。
外连接的符号是 (+)。
希望:在最后的结果中包含某些不成立的记录
elect d.deptno, d.dname, count(e.empno) 人数 from emp e,dept d
where e.deptno(+)=d.deptno group by d.deptno,d.dname;
where e.deptno=d.deptno不成立的时候,等号左边代表的表任然被包含
where e.deptno=d.deptno不成立的时候,等号右边代表的表任然被包含
(用比较少)
会以两个表中具有相同名字的列为条件创建等值连接。
在表中查询满足等值条件的数据。
如果只是列名相同而数据类型不同,则会产生错误。
内容:在NATURALJOIN 子句创建等值连接时,可以使用 USING 子句指定等值连接中需要用到的列。
使用 USING 可以在有多个列满足条件时进行选择。
不要给选中的列中加上表名前缀或别名。
NATURAL JOIN 和 USING子句经常同时使用。
自然连接中是以具有相同名字的列为连接条件的。
可以使用ON 子句指定额外的连接条件。
这个连接条件是与其它条件分开的。
ON 子句使语句具有更高的易读性。
SELECT employee_id, city, department_name
FROM employees e
JOIN departments d
ON d.department_id = e.department_id
JOIN locations l
ON d.location_id = l.location_id;
操作数据对象;接受参数返回一个结果;只对一行进行变换;每行返回一个结果;可以转换数据类型;可以嵌套;参数可以是一列或一个值
在SQL 语句中使用IF-THEN-ELSE逻辑
1、 if语句格式:
If 条件 then 语句1;
语句2;
End if;
1.1 例子:在键盘上输入都是字符串[z23]
2. IF 条件 THEN 语句序列1;
ESLE 语句序列 2;
END IF;
3. IF 条件 THEN 语句;
ELSIF 语句 THEN 语句;
ELSE 语句;
END IF;
单表查询比较简单这里就不做详细介绍
查询奖金是null的查询语句
--查询奖金为null的员工
1、select * from empwhere comm=null
第一种查出来是null的
2、select * from empwhere comm is null
通过表的别名,将同一张表视为多张表
SQL> select d.ename||'的老板是'||b.ename
2 from emp d,emp b
3 where d.mgr=b.empno
什么时候用子查询:在查询是基于未知的值时应使用子查询
注意问题:
1、 括号
2、 合理书写风格
3、 可以在子查询的where,select,having[z26] ,from 后面放置
4、 不可以在group by 后面放置子查询
5、 强调from后面的子查询
6、 主查询和子查询可以不是同一张表,只要子查询返回的结果主查询可以使用即可
7、单行子查询(返回值只有一条)只能使用单行操作
主查询里面可以有多个子查询
只返回一行。
使用单行比较操作符。
In:等于列表中的任何一个
Any:集合中任意一个值
All:和子查询返回的所有值比较
使用等值和不等值连接在SELECT 语句中查询多个表中的数据。
使用自连接
关键字:insert update delete select 增删改查数据库里面的数据
Insert : insert : insert into table (cloum,….)values();
地址符&(增删改查都可以用)
当输入地址符,并带参数的时候会让我们自己在输入
Update table set colum = value ………. Where id =?
update emp set sal=700,ename='lisi' where empno=1000
在update中使用子查询
delete和truncate区别:
1、delete是DML(可以回滚)语句,truncate是DDL语句(不可以回滚)
2、delete不回释放空间,truncate会
3、delete会产生碎片,truncate不会 (碎片会影响查询效率)
4、delete可以闪回,truncate不可以
5、.(MYSQL中讲) delete是逐条删除;truncate先摧毁表 再重建
Oracle 中delete 比truncate 快
格式: Delete from table where id =?
6.删除中使用子查询
Oracle 中delete 比truncate 快
由增删改组成,
事务步骤:
1、 起始标志 :DML语句
2、 结束标志:提交-à显示
事务是不能跨越(DML和DDL)
回滚存储点[z28] :savepoint a;
Oracle事务隔离级别:3个
串行会影响性能(锁)
Read only oracle事务
是针对数据库表,表结构字段的操作
关键词:create/alter/drop/truncatetable
create/drop view/sequence/index/synonym
1、 子查询建表
Create tabletablename as select * from table;
2、 修改表
2.1追加新的列
ALTER TABLE table
ADD (column datatype [DEFAULT expr]
[, column datatype]...);
例子:alter table test1add photo blob;
2.2修改现有的列
ALTER TABLE table
MODIFY (columndatatype [DEFAULT expr]
[, column datatype]...);
2.3删除一个列
ALTER TABLE table
DROP column (column);
例子:alter table test1drop column photo;
2.4 重命名表(改变表的名称)
ALTER TABLE table_namerename column old_column_name
tonew_column_name
例子:alter table test1rename column tname to username;
3、 删除
3.1数据和结构都被删除
3.2所有正在运行的相关事物被提交
3.3所有相关索引被删除
3.4DROP TABLE 语句不能回滚,但是可以闪回
drop table tablename;
集合运算关键字:union,union all,INTERSECT
union 去掉重复元素后的所有记录(并集)
显示员工当前和之前的工作情况,每次记录显示一次。
select * from emp where deptno=10
union
select* from emp where deptno=20;
union All:返回两个集合的所有记录,包括重复的
INTERSECT 运算符返回同时属于两个集合的记录
集合注意事项
1. 参与运算的各个集合必须列数相同 且类型一致
2. 采用第一个集合的表头作为最后的表头
3. 如果排序,必须在每个集合后使用相同的orderby
select deptno,job,sum(sal) from emp groupby deptno,job
union
select deptno,to_char(null),sum(sal) from emp group by deptno
union
select to_number(null),to_char(null),sum(sal) from emp;