一.查询部分(s)
1.1 select关键字
作用:检索“列”
注意:1.select后面的列可以起别名(查询的显示结果)
-
列名后面一个空格后添加别名(别名中不许有“空格”)
-
列名后面一个空格后使用双引号添加别名
-
列名后面一个空格后使用as关键字,在as后面添加别名
2.distinct用于对显示结果的去重
-
distinct必须放在select后面
-
如果查询有多列,必须满足多列值都相同时,方可去重。
from关键字
作用:检索“表”
注意:检索的表后可以添加别名(别名不需要被双引号引起)
1.2 where关键字
作用:过滤“行”记录(record)
用法:
1.=,!=,<>,<,>,<=,>=,any,some,all
**Domo: *selectfrom emp where sal>1500;
2. is null,is not null
Domo::select *from emp where ename is not null;
- between x and y
例子:select ename from salgrade where sal between losal and hisal;
**Domo:** -- between x and y
--查询员工薪水在2000-3000的员工信息
select * from emp where sal between 2000 and 3000
4.and 、 or 、 not
Domo:
--and、or 、not
select * from emp where sal >= 2000 and sal <=3000
5.in(list),not in(list)
Domo:
-- in(list),not in(list)
--查询职务为MANAGER和ANALYST的员工信息
select * from emp where job in ('MANAGER','ANALYST')
--查询工资不为3000和5000的员工信息
select * from emp where sal not in (3000,5000)
-- exists(sub-query)、not exists(sub-query)
select * from emp where exists(select * from dept where deptno != 50)
-- like _ ,%,escape ‘\‘ _% escape ‘\’
1.2.1 like关键字
定义:模糊查询,有两个特殊的符号"%" ,"_"
用法:
--“%”表示匹配零个或若干字符
--“_”表示匹配一个字符
Domo:
--查询:员工姓名中含有“M”的员工信息
select * from emp where ename like '%M%'
--查询:员工姓名中第二个字母是“M”的员工信息
select * from emp where ename like '_M%'
--查询:员工姓名中第三个字母是“O”的员工信息
select * from emp where ename like '__O%'
--查询:员工姓名中倒数第二个字母为“E”的员工信息
select * from emp where ename like '%E_'
--查询:员工姓名中含有“%”的员工信息
select * from emp where ename like '%%%' escape ''
--插入一条信息:insert into emp(empno,ename) values(9527,'huan%an');
1.3 order by关键字
作用:用于对查询结果进行排序
用法:
1.利用asc 、desc对排序列进行升序或降序
2.order by后可以添加多个列(逗号分隔),当一个列的值相同时,在按第二列进行排序,依次类推
Domo:
select * from emp where deptno = 20 order by sal
--1.如何决定升序还是降序?
select * from emp where deptno = 20 order by sal asc
select * from emp where deptno = 20 order by sal desc
--2.如果排序的列值相同时,如何处理?
select * from emp where deptno = 20 order by sal desc,ename desc
1.4集合
1.union 并集
2.union all 全集
3.intersect 交集
4.minus 差集
注意:
1.保证两个sql查询的列数是个数一致的
2.保证两个sql查询的列的数据类型是一致的
3.保证两个sql查询的列是相同的,否则查询的结果是无意义的
Domo:
--计算字段(列):不在于表中,通过 + 、-、* 、/操作和列进行计算得到的列
-- 获取员工的年薪
select (ename ||'的年薪为:'|| sal*12) info from emp;
--集合:每次查询结果可以看作一个集合
select * from emp where deptno = 20;
select * from emp where sal > 2000;
-- union 并集
select * from emp where deptno = 20
union
select * from emp where sal > 2000;
-- union all 全集
select * from emp where deptno = 20
union all
select * from emp where sal > 2000;
--union和union all的区别在于:union all会重复显示两个集合相同的部分
--intersect 交集
select * from emp where deptno = 20
intersect
select * from emp where sal > 2000;
--minus 差集
--注意两条sql语句的顺序
select * from emp where deptno = 20
minus
select * from emp where sal > 2000;
--other
select * from emp where sal > 2000
minus
select * from emp where deptno = 20;
--使用集合操作注意:两条sql语句必须保证查询的列是一致的
错误1:列数不匹配
select * from emp where sal > 2000
minus
select empno from emp where deptno = 20;
错误2:数据类型不匹配
select ename from emp where sal > 2000
minus
select empno from emp where deptno = 20;
错误3:该条sql无意义
select sal from emp where sal > 2000
minus
select empno from emp where deptno = 20;
1.5函数
1.5.1****单行函数
单行函数:对单个数值进行操作,并返回一个值。
分类:
1.字符函数
1)concat(a,b) 拼接a,b两个字符串数据
2)initcap(x) 将每个单词x首字母大写
3)lower() / upper() 将字符串小写/将字符串大写
4)length() 获取字符串的长度
5)lpad(a,b,c) /rpad() 将a字符串左边填充至b长度,用c字符填充,如果c字符不填写,默认用空格填充
6)ltrim(a,b) / rtrim() 去除a字符串左边的b字符,如果b不传参,默认去除空格
7)replace(a,b,c) 将a中的b字符串替换为c
8)substr(a,b,c) 将a的字符串,从b位置开始截取,截c个长度
9)trim( a from b) 将b左右两边的a字符去除掉
2.数字函数
abs() 求取绝对值
ceil() 向上取整
floor() 向下取整
round() 四舍五入
power(x,y) x的y次幂
3.日期函数
sysdate 返回系统当前日期,注意没有括号
add_months(d1,d2) 在d1日期上,增加d2个月份
months_between(d1,d2) 返回d1和d2之间的相隔月份
last_day(d) 返回d日期所在月份最后一天的日期
next_day(d,X) 返回下一个“星期X”的日期
4.转换函数
to_char() 将数字、或日期转化为字符串
to_date() 将字符串转化为日期
to_number() 将字符串转化为数字
5.其他函数
nvl(x,y) 如果x为null,则显示为y,x和y的类型保持一致
sys_guid() 生成一个的32位随机字符串
decode() 条件取值,类同java的switch
case when then else end 条件取值,类同java的if-else if-else
Domo:
dual是一个虚表,为了满足sql句式而设置这么一个表
单行函数
--1.字符函数
--concat 拼接两个字符串
select concat(concat(ename,'的职位是'),job) from emp;
--initcap 将每个单词的首字母大写
select initcap('wang yi kun') from dual;
--lower 将字符串中的字符小写
--upper 将字符串中的字符大写
select lower('LAOWANG') from dual;
select lower(ename) from emp;
select upper('laowang') from dual;
--length 获取字符串的长度
select ename,length(ename) from emp;
--lpad
--rpad
select lpad(ename,10) from emp;
select rpad(ename,10,'*') from emp;
--注意:第二个参数要设定合理的值,否则数据就不完整!
select lpad(ename,6) from emp;
--ltrim 去除字符串左边指定字符,如果不设定第二个参数,则默认去除空格
--rtrim 去除字符串右边指定字符,如果不设定第二个参数,则默认去除空格
select ltrim('a abccba ','a') from dual;
select rtrim(' abccba aaaa','a') from dual;
--replace 替换字符串
select replace('he love you','he','i') test from dual;
--substr 截取子字符串
select substr('130888881234',3,8) test from dual;
--trim 去除字符串
select trim('a' from 'a ba a') from dual;
--2.数字函数
--abs() 求取绝对值
select abs(-5) from dual;
--ceil() 向上取整
select ceil(3.1) from dual;
--floor() 向下取整
select floor(3.9) from dual;
--round() 四舍五入
select round(4.5),round(4.4) from dual;
--power(x,y) x的y次幂
select power(2,10) from dual;
--3.日期函数
--sysdate 返回系统当前日期,没有括号
select sysdate from dual;
--add_months(d1,d2) 返回d1的基础上,添加d2个月后的日期
select hiredate,add_months(hiredate,12) from emp;
select add_months(sysdate,6) from dual;
--months_between(d1,d2) 返回d1,d2日期相隔的月份,返回的不是一个整数
select months_between(sysdate,hiredate)/12 from emp;
--last_day() 返回当前日期的月份的最后一天
select hiredate,last_day(hiredate) from emp;
--next_day() 返回下一个星期X的日期
select hiredate,next_day(hiredate,'星期一') from emp;
select sysdate,next_day(sysdate,'星期日') from dual;
--4.转化函数
--to_date()
select to_date('1999-12-12 12:12:12','yyyy-mm-dd hh24:mi:ss') from dual;
--to_char()
select to_char(sal, '$9,999.00') from emp;
--to_number()
select to_number('876') from dual;
--5.其他函数
--nvl如果例的值为null,则转为另外结果显示
select ename,nvl(comm,0) from emp;
--sys_guid() --UUID
select sys_guid() from dual;
--decode
--类似于java中switch
select ename,sal,decode(sal,800,'屌丝',2000,'白领',3000,'小资',5000,'高富帅','一般人') from emp;
--case when then else end
--类似于java中的if - else if - else
select ename,sal,case when sal<1000 then '屌丝'
when sal<2000 then '白领'
when sal<3000 then '小资'
when sal<4000 then '高富帅'
else '王宝强' end from emp;
1.5.2组函数
组函数又被称作聚合函数,用于对多行数据进行操作,并返回一个单一的结果
avg()求平均值,只能对数字类型进行处理,不处理空字段
sum()求和,只能对数字类型进行处理
count()计数,对任何类型生效,不处理空字段
max() 求最大值,对任何类型生效
min() 求最小值,对任何类型生效
Domo:
--组函数
avg
--求20部门的平均薪水为多少?
select avg(sal) avgsal from emp where deptno = 20
sum
--求20部门的员工的总薪水
select sum(sal) sumsal from emp where deptno = 20;
count
--求20部门的员工有几个
select count(1) from emp where deptno = 20;
max
--求20部门员工工资最高的是多少
select max(sal) from emp where deptno = 20;
select max(hiredate) from emp;
min
--求20部门员工工资最低的是多少
select min(sal) from emp where deptno = 20;
--组函数:可以用在分组中的函数
select min(comm) from emp;
1.6 group by关键字
作用:对查询结果进行分组处理
用法:
1.分组之后,不能将除分组字段之外的字段放在select后面
2.group by 后面可以跟多个字段,则这多个字段值都相同时,才分为一组
3.分组之后,可以使用组函数对每个组进行数据处理
having 关键字
作用:用于对分组数据进行过滤
用法:
类似于where的用法
小知识点:
sql顺序分为两类:
1.sql的书写顺序
select from where group by having order by [asc/desc]
2.sql的执行顺序
from where group by having select order by [asc/desc]
Domo:
select * from emp;
--分组可以按多个列分组
select e.job,e.sal from emp e group by e.job,e.sal;
--group by分组的列可以不出现在select里,检索字段(select后面跟着的字段)必须出现在分组列表里。
--错误的:select e.job,e.detpno from emp e group by e.job;
--正确的:select e.deptno from emp e group by e.deptno,e.sal,e.job;
--如果分组列中具有null值,则null将作为一个分组返回。如果列中有多行null值,他们将分为一组。
select comm from emp e group by e.comm;
--group by 子句必须出现在where子句之后,order by 子句之前。
select e.deptno from emp e where e.sal>800 group by e.deptno having e.deptno=20 order by e.deptno desc
--where过滤行记录 having 过滤组记录
--select 后面只能跟列( group by 出现的列)或组函数
--不能在 WHERE 子句中使用组函数
--错误的:select e.deptno from emp e where avg(e.sal) group by e.deptno;
--求部门下雇员的平均工资>2000 人数
select e.deptno ,count(1),avg(e.sal) from emp e group by e.deptno having avg(e.sal) > 2000;
Sql语句执行过程:
1.读取from子句中的基本表、视图的数据,[执行笛卡尔积操作]。
2.选取满足where子句中给出的条件表达式的元组
3.按group子句中指定列的值分组,同时提取满足Having子句中组条件表达式的那些组
4.按select子句中给出的列名或列表达式求值输出
5.Order by子句对输出的目标表进行排序。
Sql语句执行顺序:
from - where - group by - having - select - order by
1.7 联表查询
Sql****1992
sql分类
1.笛卡尔积 (表乘表)
2.等值连接 表的连接条件使用“=”
3.非等值连接 表的连接条件使用“>、>=、 <、<=、!=、any等”
4.自连接 自己连接自己
5.外连接
1.左外连接,“(+)”在等号右边
2.右外连接,“(+)”在等号左边
3.“(+)”在哪一边的列,该表就补充null
Sql****1999
sql分类
1.cross join 交叉连接 (笛卡尔积) ,不需要on关键字
2.natural join 自然连接 (找两个表中相同的列,进行等值匹配),不需要on关键字
3.inner join 内连接
1)必须有on关键字,on表示连接条件
2)inner关键字可以省略
4.outer join 外连接,outer关键字可以省略
-
left outer join
-
right outer join
-
full outer join
二.修改的部分
2.1 DML
insert关键字
作用:往表中插入一条(多条)数据
语法1:元祖值式的插入
语法1:insert into tablename(column1,column2,...,columnN) values(value1,value2,...,valueN);
语法2:查询结果式的插入
语法2:insert into tablename sub-query
delete关键字
作用:从表中删除数据
语法:delete [from] tablename [where condition]
update关键字
作用:更新表中的数据
语法:update tablename set column1=value1,column2=value2,...,columnN=valueN [where condition]
2.2 事务
事务(Transaction)是一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位,是数据库环境中的逻辑工作单位。
目的:保证数据库的完整性
特点:事务不能嵌套
如何开启事务:
一个DML语句(insert、delete、update)的执行
如何关闭事务:
1.显示的调用commit或rollback
2.当执行DDL(Create、Alter、Drop)语句事务自动提交
3.用户正常断开连接时,事务自动提交。
4.系统崩溃或断电时事务自动回滚
2.3 序列
一、概念:
序列(sequence):oracle专有的专有对象
二、作用:
产生一个自动递增的数列
三、创建一个序列:
create sequence seq_name
increment by 1
start with 1
四、使用序列:
序列名.nextval
序列名.currval
2.4 视图
一、定义:
视图(view):一种不占用物理空间的虚表。
二、作用:
将一些查询复杂的SQL语句变为视图,便于查询
三、语法:
create [or replace] view v$_name
as sub-query
[with read only]
四、需要注意的点:
1.视图也可以从视图中产生
2.我们把用于产生视图的表称之为基表
3.我们对视图进行数据修改就是对基表进行数据修改,反之亦然
4.不能对多张表的数据,通过视图进行修改。
五、使用视图需要注意
1.一般来讲,只有重复出现非常多次的SQL语句,才会创建视图
2.数据库迁移,视图也得随之迁移,否则在新数据中是不能用的
3.创建视图时,尽量不要带or replace
2.5数据类型
数据类型分类:
1.number(x,y) 数字类型,x表示最大长度,y表示精度
2.varchar2(x) 可变字符串,x表示最大长度
3.char(x) 定长字符串,x表示最大长度
4.long 长字符串,最大2G
5.Date,日期(年月日时分秒)
6.TIMESTAMP 时间戳,精确到微秒
要掌握oracle数据类型,在java中的对应数据类型
<u>https://www.cnblogs.com/softidea/p/7101091.html</u>
三.创建表格部分
3.1 DDL
1.create关键字
作用:用于创建数据库对象(表、视图、序列等)
语法: create table tablename(column1 dataType, column2 dataType,...,columnN dataType)
语法2:create table tablename as subquery
2.alert关键字
作用:用于修改数据库对象(表、视图、序列等)
语法:
1)alter table tablename add(columnname dataType)
2)alter table tablename modify( columnname dataType)
3)alter table tablename drop [column] columnname
3.drop关键字
作用:用于删除数据库对象(表、视图、序列等)
语法:
drop table tablename
3.2约束
一、定义
约束(constraint):在建表时,为某些列添加一些特定的规则,保证数据库的数据满足某种用户的要求。添加约束之后,在往表中(插入、更新)数据时,如果数据不满足约束,则该条语句不能执行
二、约束的分类
①非空约束 not null
②唯一约束 unique
③自定义检查约束 check
④主键约束 primary key
⑤外键约束 foreign key
三、如何添加约束
1)在建表的同时,可以为某一列添加约束
①在列后面直接追加约束
②在填写完所有列之后,添加约束
- 在建表之后,通过修改表结构来添加约束
3.3三范式
第一范式
列不可分
第二范式
不能部分依赖
第三范式
不能存在传递依赖
3.4索引
索引:类似于“书”的目录,索引可以加快对表的查询速度。
作用:在数据库中用来加速对表的查询,通过使用快速路径访问方法快速定位数据,减少了磁盘的I/O
使用:
CREATE INDEX index ON table (column[, column]...);
条件:
1.当数据量非常大的时候
2.当该列的值不经常重复的情况下
3.当该列的值不容易发生变化的情况下
重点:数据库会为我们的表自动创建索引,为表中的唯一键列自动的添加索引
网友评论