oracle数据库(关系型数据库1)

来源:互联网 发布:ardupilot 源码 分析 编辑:程序博客网 时间:2024/06/12 19:15

一.概念。
1.RDBMS(关系型数据库管理系统)
(1)对象或者关系的集合。
(2)基于关系的操作集合。
(3)因数据精确性和一致性而带来的数据完整性。
2.每个表由行和列组成
3.可以通过SQL来操作表中的数据。
4.表中的每一行数据可通过主键即primary key来唯一标识。(联合主键)
5.表与表之间可通过外键即foreign key来关联。
6.关系型数据库中的对象:
(1)表:存储的基本单元,由行和列组成。
(2)视图:由一个或多个表的数据子集的一逻辑表示。
(3)序列:用来产生主键。
(4)索引:提高查询速度。
(5)同义词:一个对象的别名。
(6)编程单元:包括过程、函数或包以及pl或者sql中的声明。
7.oracle的RDBMS也成为Oracle的服务器
oracle:
(1)一个存储数据的地方。
(2)能快速的获得数据。
(3)数据库安全性。
(4)分布式数据库。
(5)客户端和服务器的配置。

二.简化版常见SQL语句。
(1)l 命令可以查看当前缓存的SQL命令。
(2)/ 可以查看缓存的SQL查询结果
(3)修改日期语言设置:
alter session set nls_date_language=english;退出后又恢复
(4)清屏:clear scre;
(5)执行某个sql文件:@或者start文件地址
(6)查看表结构:desc 表名
(7)1.数据定义语言Data definition language (DDL)
create(创建表)
alert(修改表,像一些约束等)
drop(删除表、约束、用户)
rename(改名)
(8)2.数据操作语句Data manipulation
language(DML)
insert(插入数据)
update(修改)
delete(删除)
(9).取值语句 select
1.查询当前系统时间select sysdate from dual
2.查询所有表 select table_name from user_tables(oracle自带的)
(10).事物控制语句 Transaction control
commit(提交事务)
rollback(回滚事务)
savepoint(事物回滚点)**
(11).数据控制语句Data control language(DCL)
grant(分配权限)
revoke(回收权限)

SQL> select table_name from user_tables;

三.SELECT语句(查询)
1.select语法(不区分大小写):
select [distinct(不重复的记录)] {*,列名[别名],…} from 表名或者视图;
select后面可以跟列名、列的别名、通配符*(表示所有的列)
from子句后面可以跟上要查找的表名或者视图的名字
distinct:查找不重复的记录。修改列宽度(col id(列名) format 9999(显示四位数据);
例如:有两列,DISTINCT 列1,列2 :列1可以重复,但是列2不能重复。
col name format a20;显示20位字符的长度)

    SQL> select * from users;
     数字列值靠右对齐,字符串日期靠左对齐。

(1)算术表达式
查找的列可使用加减乘除进行计算
只能对两种数据类型:数字和日期
先乘除后加减,从左到右,可以通过括号改变优先级。

SELECT last_name,salary*12,commission_pct from s_emp;

(2)null值
在加减乘除中,如果某一项为null,那么结果为null
null表示不可用、为赋值、未知的或者不适用的,和零或者空格是不同的。

SELECT last_name,title,salary*commission_pct/100 COMM(salary*commission_pct/100的别名) from s_emp;

采用nvl()函数将null转换成某个数值
nvl(列名,’字符串’)或者nvl(列名,数值)

SELECT last_name,title,salary*nvl(commission_pct,0)/100 COMM(salary*commission_pct/100的别名) from s_emp;
例如:nvl(start_date,'01_JAN_95');            nvl(title,'No Title Yet');            nvl(salary,1000);

(3)列的别名
一个别名里包含了空格、特殊的字符或者要区分大小写,那就使用双引号。
||:代表字符串的链接
例如

 SELECT first_name||last_name "Employees" from s_emp; SELECT first_name||''||last_name||','||title "Employees" from s_emp; //输出结果:Carmen Velasqueaz,President

四.排序和条件查询
1.order by:
SELECT [DISTINCT]{*,column[alias],…} from table [order by {column,expr,alias}[ASC|DESC]];
(1)order by子句在整个SELECT语句中的最后
(2)order by后面可以是列名、列的别名、表达式、列出现在SELECT关键字后列的顺序号。
(3)order by后面可以跟多列,表示先按第一列排序,如第一列有相同值再按第二列排序,如第二列有相同值,再按第三列排序…
(4)ASC表升序,可以省略,DESC表降序。
(5)NULL(空)值永远最大。

SELECT last_name EMPLOYEE,start_date from s_emp order by EMPLOYEE(别名) DESC;SELECT last_name EMPLOYEE,start_date from s_emp order by 2(代表序列号为2的start_date)等价于SELECT last_name EMPLOYEE,start_date from s_emp order by start_date;SELECT last_name EMPLOYEE,dept_id,salary from s_emp order by dept_id,salary DESC;//dept_id按升序排列,salary按降序排列

2.where子句
select [distinct]{*,column[alias],…}
from table
[where condition(s)]
[order by {column,expr,alias}[ASC|DESC]];
(1)对SQL语句返回的数据集进行筛选。
(2)紧跟在from子句后
(3)由一至多个限定条件组成,限定条件由表达式、字符串和字面值组成。
(4)所有字符串和日期要用单引号括起来,数值不需要单引号。
(5)日期在Oracle里有特定的格式,‘DD-MON-YY’(具体看日期的显示格式),否则作为一个字符串
注意:select last_name,dept_id,salary from s_emp where dept_id = 42;
和select last_name,dept_id,salary from s_emp where 42= dept_id ;两种写法都可以。
(6)where子句中的运算符
1.比较运算符:
=,>,>=,<,<=,!=,<>,^=
between…and…、in(list)、like、is null
not between、not in、not like、is not null
(1)between…and(包括起止值):

select first_name,last_name,start_date      from s_emp         where start_date between '09-may-91' and '17-jur-01';

(2)in(限定内容):

select id,name,region_id  from s_dept where  region_id in (1,3);//指定范围是1和3(in后边可以有空格也可以没有)

(3)模糊查询(通过like关键字和通配符

select last_name  from s_emp  where last_name like 'M%';//M开头的所有last_name(只能以M开头的,m开头的查不出来,可以将所有m转换成M)select last_name,start_date from s_emp where start_date like '%91';//%:0至多个字符select last_name  from s_emp  where last_name like '\_a%' escape '\';//_:单个字符  escape '\':表示\是转义字符;匹配字符就是以_a开头,后边匹配0或者多个字符。 

(4)is null(查找某一列是否为空):

select id,name,credit_rating  from s_customer  where sales_rep_id is null;//不能使用=运算符

2.逻辑运算符
not and or(优先级not>and>or)可以通过括号改变优先级
(1)and(同时满足两个条件):

select last_name,salary,dept_id,title             from s_emp where dept_id = 41 and title = 'Stock Clerk';

(2)or(满足一个条件):

select last_name,salary,dept_id,title             from s_emp where dept_id=41 or title='Stock Clerk';

(3)and和or的优先级:

select last_name,salary,dept_id              from s_emp where salary>=1000                            and dept_id=44                            or dept_id=42;//查询结果是编号是44号的员工,工资必须大于1000,或者是编号是22号,工资没有要求。

五.单行函数
1.函数简介:
(1)Oracle数据库中的函数:
a.对数据进行计算
b.数据统计
c.修改数据的显示
d.数据类型转换
(2)函数主要分为两类:
a.singlerow(单行函数)
b.multirow(多行函数也叫组函数,group函数)
(3)单行函数
字符函数、数值函数、日期函数、转换函数
(4)单行函数的使用
a.作用在单行(单条记录)上
b.每行都可返回一个结果
c.可操作数据项
d.接受参数并返回结果
e.修改数据类型
f.可以嵌套
function_name(column|expression,[arg1,arg2,…])
2.字符函数
(1)lower:转换成小写
(2)upper:转换成大写
(3)initcap:首字母变成大写,其余都小写
(4)concat:字符串的连接
(5)substr(str、start、end):字符串的截取
(6)length:求字符串的长度
(7)nvl:空值置换

    select lower('YYYYYeTTy') from dual;//yyyyyetty    select upper('YYYYYeTTy') from dual;//YYYYYETTY    select initcap('yyYYYeTTy') from dual;//Yyyyyetty    select concat('hello','sql') from dual;//hellosql    select substr('hellosql',1,5) from dual;//从1开始截取其后5位(编号从1开始而不是0)hello    select length('hellosql') from dual;//8
    //查找last_name=patel,不区分大小写    select first_name,last_name from s_emp            where upper(last_name)='PATEL';//统一将last_name这一列的数据转换成大写
`  `3.字符函数

(1)round:四舍五入
(2)trunc:截取,不进行四舍五入
(3)mod:取余

    round(49.923,2);//45.92,2代表精确到小数点以后的第二位    round(49.923,0);//46    round(49.923);//46    round(49.923,-1);//50,精确到整数位的十位    trunc(45.923,2);//45.92,截取到小数后的两位    trunc(45.923);//45    trunc(45.923,-1);//40,截取到十位    mod(1600,300)//100,取余

4.日期函数
(1)months_between(date1,date2):两个日期之间的月数
(2)add_months(date,n):在指定日期上增加月数(也可减少,将n设置为负数就可以)
(3)next_day(date,’friday’):指定日期的下一天(如:下一个星期五)是哪天
(4)last_day(data):指定日期的最后一天。
(5)round(date,’year’):对指定日期进行四舍五入,逢16日往月份进一,逢七月往年份进一。
(6)trunc(date,’year’):对指定日期进行截取(把小时分秒截取掉,从0开始)
在Oracle中日期包括世纪、年、月、日、小时、分、秒、毫秒(timestemp)。
默认显示DD-MON-YY
函数SYSDATE、SYSTIMESTAMP(更加精细)可以返回系统时间
通过dual表可以使用SYSDATE和SYSTIMESTAMP来查看系统时间

        select months_between('01-SEP-95','11-JAN-94') from dual;//19.6774194        select add_months('11-JAN-94',6) from dual;//'11-JUL-94'        select next_day('01-SEP-95','friday') from dual;//'08-SEP-95'        select last_day('01-SEP-95') from dual;//'30-SEP-95'        select round(to_date('25-MAY-95'),'MONTH') from dual;//01-JUN-95        select round(to_date('25-MAY-95'),'YEAR') from dual;//01-JAN-95        select trunc(to_date('25-MAY-95'),'MONTH') from dual;//01-MAY-95        select trunc(to_date('25-MAY-95'),'YEAR') from dual;//01-JAN-95        select trunc(to_date('25-MAY-95')) from dual;//25-MAY-95:默认按日截取        //to_char()将date类型按特定的格式转换成字符类型。        select trunc(to_char(to_date('25-MAY-95')),'DD-MON-YY hh24:mi:ss') from dual;        //25-MAY-95 00:00:00        //to_date():将字符串类型的日期转换成日期类型
    //查询最近一周购买的图书        select * from book             where book_date between trunc(sysdate-7) and sysdate;    //查询本周日归还的图书        select * from book             where trunc(res_date)=trunc(next_day(sysdate,'SUNDAY'));//sysdate包含小时分秒    //查询最近一个月购买的图书        select * from book             where book_date between trunc(add_months(sysdate,-1)) and sysdate;    //查询本周购买的图书        select * from book             where book_date between trunc(next_day(sysdate,'SUNDAY')-7) and sysdate;

5.转换函数
(1)to_char():将日期转换成字符串
to_char(date,’fmt’);第一个参数是日期,第二个参数是转换成的格式。
1.使用format制定日期的格式
2.使用fm来去除空格或者0
3.使用逗号分隔。
日期格式模型的元素:(可大写可小写)
1.year:英文年份
2.month:英文月份
3.mon:英文月份的缩写
4.day:星期几的英文单词
5.DY:星期几的前三个字母
6.ddsp:英文拼写的天
7.ddspth:英文拼写的第几天
8.d:一个星期的数字表示,星期天为1,星期六为7
9.dd:一个月的第几天
10.ddd:一年的第几天
11.yyyy:四位数的年
12.mm:二位数的月
13.hh24:24小时制 mi:分钟 ss:秒
14.AM:上午 PM:下午
注:YY显示两位的年,后两位。YYYY显示四位的年。所以,尽量用四位的年。

    select to_char('2-mar-2007') from dual;//2-mar-2007(本身就是字符串日期,所以大小写不变)    select to_char(to_date('2-mar-2007')) from dual;//2-MAR-2007(大写,将字符串日期转换成了日期型,所以输出的是大写)    select to_char('2-mar-2007','year-month-day') from dual;//2-mar-2007(小写)    select to_char('2-mar-2007','YEAR-MONTH-DAY') from dual;//2-MAR-2007(大写)

RR日期格式:
RR:0-49代表本世纪,50及以上代表上世纪(默认)。
YY:代表和当前时间所处的同一个世纪。

    insert t_date into(1,to_date('23-FEB-90',dd-mm-rr));//1990-02-23    insert t_date into(1,to_date('23-FEB-17',dd-mm-rr));//2017-02-23    insert t_date into(1,to_date('23-FEB-17',dd-mm-yy));//2017-02-23    //当不指定RR或者YY,默认为RR格式
    select last_name,start_date('fmddspth "of" MONTH YYYY fmHH24:MI:SS AM') HIREDATE        from s_emp where start_date like '%91';

(2)to_char():将数值转换成字符串
to_char(number,’fmt’);
0:强制显示0来填充未满数据位数(实际的位数超出设定的位数,会报错)
9:代表一个数字 (一般使用这种方式,位数不满不会补)
$:设置一个浮点型的美元符号
L:使用本地货币符号

    select 'Order'||to_char(id)||            'was filled for a total of'||                    to_char(total,'fm$9,999,999')                        from s_ord where date_shipped='21-SEP-92';    // Order 107 was filled for a total of $142,171

(3)to_number():将一个数值字符串转换成数值
to_number(char);
(4)to_date():将一个日期字符串转换成日期
to_date(char,’fmt’);

    select to_number('23233') from dual;//23233    select to_date('10-september-1992','dd-month-yyyy') from dual;//10-sep-1992

(5)函数嵌套(从里往外执行)

原创粉丝点击