Oracle day1

来源:互联网 发布:企业电话搜索软件 编辑:程序博客网 时间:2024/06/06 10:05

ORACLE SQL

SQL(structured query language)

 

data 持久化(保存)

 

文件

数据库(database)

table

SQL操作table

DDL(data definition language数据定义语言)

create table 创建表:colmn,structure

colmn():colmn name(列名),data type(数据类型),length(长度),constraint(约束)

 

alter table修改表结构

修改列(add colmn增加列,modify colmn修改列,drop colmn删除列)

drop table 从数据库中删除表

 

 

DML(data manipulation language数据操作语言):row,data

row()

insert into tabame 插入一条记录

update tabname 修改一条记录的某列的值

delete from tabname 删除一条记录

 

TCL(transaction 事务 control language事务控制语言):ATM(交易)

commit(提交):dml操作产生的数据入库

rollback(回滚):dml操作失效

 

DQL(data query language数据查询语言)

select

 

DCL(data control langauge 数据控制语言)

usera,userb

usera

grant select on tabname to userb;

revoke

revoke select on tabname from userb;

 

使用频度高的语句

DQL,DML,TCL

 

oracle oracle10g mysql

IBM db2

MS  SQL server

.....

 

DBA(database administrator 数据库管理员)

install RDBMS(relationship database management system关系型(二维表:,)数据库管理系统)--> create Database(open)-->create user-->(跟数据库建连接(登录,身份认证)-->SQL(DDL DML...),程序员的操作)

 

solaris

oracle server oracle数据库服务器

oracle for solaris

sqlplus

192.168.0.26 

192.168.0.20

192.168.0.23

 

远程登录 telnet

Linux终端: telnet 192.168.0.26(登录到26服务器上)

patch补丁 bug

login:openlab

password:open123

sunv210% echo $ORACLE_SID

tarena

sunv210%

%sqlplus

SQL>

提示符

sunv210% shell(cmd),os命令

SQL> :where am i

SQL> show user(Who am I)

 

JDBC TCP/IP

(ip address port(端口 1521)数据库服务器名字用户名密码)

(端口号标识了唯一的应用)

emp employee(员工)

dept department(部门)

 

create table dept_hiloo

             *

ERROR at line 1:

ORA-00955: name is already used by an existing object

 

DQL select

emp_jsd1301

 

newtab不存在

create table newtab(自己起的)

as

select * from oldtab(已经存在的);

 

newtab表存在,没有数据(也可以有数据)

insert into newtab

select * from oldtab;

 

emp,dept select

SQL 4GL 描述语言

select语句

源表结果集

结果集是表里的部分列:投影操作

结果集是表里的部分行:选择操作

结果集来在多张表的记录的组合:连接操作

 

单表操作

多表操作

 

select语句基本语法:

select colname1,... from tabname;

投影操作用select子句实现

 

sql语句经sqlplus送给server process(连接建好后标志创建server process进程),对语句进行语法分析,语义分析,产生执行计划并执行,生成结果集,把结果集传回sqlplus.

 

select子句

后面跟列名,函数,表达式(数值,字符),运算功能,投影操作

对记录(可能是单列,可能是多列)去重

 

null的概念

null,insert into (null)

bonus列不存占空间,未知的

null被看成无穷大

1,(5000+null)*12 = null表达式中有null,结果为null

空值转换函数

nvl(p1,p2) p1,p2参数

if p1 is null then

   return p2;

else

   return p1;

end if;

 

2 如果有多个null,distinct处理后,保留一个.

 

 

字符串的拼接 ||

 

dual 单列单行用于常量的调用

 

where子句

where 条件表达式

列名比较运算符值

后面有多个条件,and,or连接

 

课堂练习

1列出每个员工的名字和他的工资?

select ename,salary from emp_hiloo;

2列出部门表的所有信息?

select * from dept_hiloo;

*表示所有列

3列出每个员工的名字和他的年薪?

select ename,salary*12

from emp_hiloo;

4列出每个员工的名字和他一年的总收入

select ename,(salary+bonus)*12 ann_sal

from emp_hiloo

ann_sal 列别名

(这里的本质:把列名当做了变量在数据库服务器中进行操作)

select ename,(salary+bonus)*12 "Ann Sal"

from emp_hiloo

如果列别名中包含空格或希望大小写敏感,用双引号括起来.

(5000+null)*12 = null

(15000+null)*12 = null

(4000+null)*12 = null(说明算术运算有null,其结果一定是null

需要重新解读null值。

select ename,

(salary+nvl(bonus,0))*12 ann_sal

from emp_hiloo;

nvl(p1,p2)控制转换函数,

if p1 is null then

         return p2

else

         return p1;

 

 

 

 

注意:双引号表示变量(列名),单引号表示字符串。

From用于循环遍历数据,select跟的是循环体(即循环要处理的表达式)。

Dual表单行单列,用于算术运算。

学到本质了快!

 

5

zhangwuji's job is Manager.

liucangsong          Analyst

liyi                 Analyst

guofurong            Programmer

zhangsanfeng         President

yanxiaoliu           Manager

luwushuang           clerk

huangrong            Manager

weixiaobao           salesman

guojing              salesman

 

' 二义性表示字符串的定界符,单引号本身

''''表示单引号本身.(外面两个单引号表示中间的是字符串,中间两个单引号表示一个单引号)

 

select ename||'''s job is '||job

            || '.'  emp

from emp_hiloo

注意:编程中拼接字符串使用“+”,而这里使用“||

6公司里有哪些职位?

小感:应该这样去思考,

(1)     思考表的结构

(2)     思考结果集是神马样子的。

distinct:对记录做去重的,结果集的记录是唯一的.

select distinct job from emp_hiloo

 

7公司里有哪几类奖金?

select distinct bonus from emp_hiloo;

空值将作为一类

8各个部门有哪些不同的职位?

select distinct deptno,job

from emp_hiloo

distinct后面跟多列,多列联合去重.(即将多个列联合起来去重复【使其唯一】)

这是本质!!!

Select核心是运算。!

 

 

小感:一定要把本质理解清楚了啊!

 

9哪些员工的工资比5000?

select ename,salary(循环体【表达式】)

from emp_hiloo(循环)

where salary > 5000(循环体中的判断,满足条件的放入结果集)

假如让我编程来实现这段描述语言呢?

 

 

 

10哪些员工的工资比5000,列出名字,年薪

select ename,salary*12 ann_sal

from emp_hiloo

where salary > 5000

 

(1)     遍历每一行

(2)     salary > 5000的记录放入结果集一

(3)     在结果集一中将salary*12放入最终结果集。

(4)     还回最终结果集。

 

11哪些员工的年薪大于60000?列出名字,年薪

select ename,salary*12 ann_sal

from emp_hiloo

where salary*12 > 60000;

 

select ename,salary*12

from emp_hiloo

where salary > 5000

 

select ename,salary*12 ann_sal

from emp_hiloo

where ann_sal > 60000;

ORA-00904: "ANN_SAL": invalid identifier

无效的标识符(没有这个列名)

结论:得出了执行顺序

formàwhereà最后select

一定要明白结果集是怎样产生出来的!

 

select语句中各个子句的执行顺序

from --> where --> select

 

12 zhangwuji的年薪是多少?

select ename,salary*12 ann_sal

from emp_hiloo

where ename = 'zhangwuji'

怎么存怎么写,数据有规则

忽略大小写,upper(p1),返回值大写,lower(p1)小写,initcap(p1)首字符大写

 

select ename,salary*12 ann_sal

from emp_hiloo

where ename = 'Zhangwuji'

区分大小写,它的编码(ASCII)的值不一样

no rows selected(即判断不存在)

 

 

课外练习

1不知道ename存储的大小写,找出zhangwuji的年薪?

2哪些员工的工资在[5000,10000]之间.

3 哪些员工的奖金是400,500,1000

4 哪些员工的工资不在[5000,10000]之间.

5 哪些员工的奖金不是400,500,1000.

 

小结:

(1)     sql语句执行顺序(一定要想要下是你写的执行程序)

先遍历每一条数据,将满足where的记录(一行数据)放入结果集,

如果select有算数表达式,就将列名当做变量,在次遍历所有行,将对应值赋给变量并将计算的结果放入结果集,最后将最终结果集返回。

 

 

(2)     null值处理