oracle ----数据库
emis
DB -----FILE
DBMS ----数据库管理系统
IBM -----RDBMS ----关系型数据库
管理系统
DB -----RDB
DB2
甲骨文----oracle----mysql
关系型数据库
基于二维表
行 row 列 column
第一行 -----表头 header
每一行 -----具体的数据行
数据库语言的分类:
数据查询语言 -----sql----select
数据操作语言 -----dml----insert delete
update
事务控制语言 -----tcl----commit rollback
savepoint
数据定义语言 -----DDL----create
drop
alter
DBA
数据控制语言 -----DCL----grant
revoke
如何连接oracle 来查询数据
SQLPLUS-----oracle 公司提供的访问数据
库的工具
远程访问服务器上的oracle数据库
172.30.1.6
telnet 172.30.1.6
openlab
open123
telnet 192.168.0.20
openlab
open123
telnet 192.168.0.23
openlab
open123
telnet 192.168.0.26
openlab
open123
oracle 10g 9i 8i
SQL> 进入了oracle的操作环境
查询数据------DB------二维表
二维表是数据库存储数据的基本单元
表中存储数据的基本单元是一行
表名------二维表的标识
表头------表的数据描述
根据表名查看表结构-----desc 表名
Name
------------------
ID 员工编号
LAST_NAME 姓
FIRST_NAME 名
USERID #用户说明
START_DATE 入职日期
COMMENTS 员工备注
MANAGER_ID 领导的员工编号
TITLE 职位
DEPT_ID 部门编号
SALARY 月薪
COMMISSION_PCT 提成
查询
选择:所有列都选中 部分行选中
投影:部分列选中 全部的行选中
表连接:数据来自于多张表 表和表之间建立
连接关系
查询:
A.from 子句
1.从表中查询一个字段的数据
select 字段 from 表;
select salary from s_emp;
750-2500$
搭建环境:sql脚本
1.把脚本上传对应的服务器
2.运行脚本
@路经/脚本名
2.查询多个字段
把first_name salary 列出来
select first_name,salary from s_emp;
3.把表中所有的字段的值列出来
select id,first_name ....;
*号可以代表所有的字段名
select * from s_emp;
4.字段的数学运算
算每个人的年薪
select salary*12 from s_emp;
可以用小括号改变的优先级
12*salary+100
12*(salary+100)
1/2 0.5
select 1/2 from dual;
5.字段的别名
紧跟在字段名后
select first_name name,12*salary yearsal from s_emp;
别名中有特殊字符 空格
select first_name name,
12*salary "year sal" from s_emp;
双引号-----原样显示
6.sql如何表达字符串
sql中的字符串
'a' '' ' ' 'hello world'
= 判断相等
7.字符串连接 ---oracle独特的 ||
first_name last_name salary
select first_name,last_name,salary from s_emp;
select first_name||last_name,salary from s_emp;
在first_name 和last_name 加一个下划线
select first_name||last_name,salary from s_emp;
在first_name 和last_name 加一个
单引号
select first_name||'''||last_name,salary
from s_emp;
翻译不了单引号----转义单引号
select first_name||''''||last_name,salary
from s_emp;
两个单引号表达一个单引号
在first_name 和last_name 之间
拼接一个双引号
select first_name||''''''||last_name
from s_emp;
8.NULL值的处理
月薪*12*(1+提成/100)
select salary*12,
salary*(1+commission_pct/100)*12
from s_emp;
NULL值和任何值做运算都是NULL
NULL值处理函数
nvl(参数1,参数2)
参数1 要处理的值或者字段
参数2 如果参数1为NULL则返回参数2的值
如果参数1不为NULL则返回参数1的值
注意:参数1和参数2必须有相同的类型
select salary*12,
salary*nvl((1+commission_pct/100)*12,0)
from s_emp; //logic error
NULL要尽早处理
select salary*12,
salary*(1+nvl(commission_pct,0)/100)*12 yearsal
from s_emp;
把first_name,manager_id
如果manager_id 为NULL则显示-1
select first_name,nvl(manager_id,-1)
from s_emp;
9.排重显示
显示所有的工资
select salary from s_emp;
不同的工资 -----distinct
select distinct salary from s_emp;
select distinct title from s_emp;
多个字段的排重
select distinct salary,id from s_emp;
select first_name,last_name,title from s_emp;
select distinct last_name,title
from s_emp;
B.where 子句-----限制行的返回
1.符合where后条件的数据返回
不符合where后条件的就过滤掉
查询工资大于1200的first_name,salary
select first_name,salary
from s_emp
where salary>1200;
2.字符串和数字的对比
查询工资等于2500的人的first_name
select first_name,salary
from s_emp
where salary=2500;
查询first_name是Carmen的工资
select first_name,salary
from s_emp
where first_name='Carmen';
select first_name,salary
from s_emp
where first_name='carmen';
//no rows selected
字符串的值是区分大小写的
字符串是大小写敏感
'a' 'A' 是不同的
3.sql中的运算(比较)符号
1.逻辑比较运算符号
= < > >= <=
2.sql的比较运算符号
between 值 and 值
表达一个闭区间[1500,2500]
找出工资在[1500,2500]之间的
first_name,salary
select first_name,salary
from s_emp
where salary
between 1500 and 2500;
in (列表)
列表 -----用逗号隔开的一组值
找出id 是1或者是3或者是9的first_name,
salary
select first_name,salary
from s_emp
where id in(1,3,9);
in:列表中的顺序和数据组成相关
把出现概率高的放前面
3.is null ----判断一个值是不是NULL
找出提成是NULL的first_name,salary
select first_name,salary from
s_emp where commission_pct is null;
4.模糊查询
like '字符串'
龙 成龙 李小龙 龙孩儿 龙龙
找出所有的first_name 带a的
like '通配字符串'
sql的通配符
% 代表任意字符 0-n
_ 代表一个任意字符 1(能且只能是一个)
select first_name from s_emp where
first_name like '%a%';
找出第二个字符是a的first_name
select first_name from s_emp where
first_name like '_a%';
数据字典表:
user_tables
table_name 表名
s_emp s_dept
select table_name from user_tables;
把s_开头的表名列出来
select table_name from user_tables
where table_name like 's_%';
数据字段表把所有数据的值 默认处理成
大写
select table_name from user_tables
where table_name like 'S_%';
通配符的转义:
select table_name from user_tables
where table_name like 'S\_%'
escape '\';
3.条件连接符号
c 和c++
int a=10;
if(5<a<9){
printf("shenma shidao");
}
与 and
或 or
非 not
找出工资在[1500,2500]之间的
first_name,salary
select first_name,salary from s_emp
where salary>=1500 and salary<=2500;
找出工资在(1500,2500)之间的
first_name,salary
select first_name,salary from s_emp
where salary>1500 and salary<2500;
找出id 是1或者是3或者是9的first_name,
salary
select first_name,salary from s_emp
where id=1 or id=3 or id=9;
找出提成不是NULL的first_name,salary
> <=
< >=
= != ^= <>
between and not between and
in not in
like not like
is null is not null
找出提成不是NULL的first_name,salary
select first_name,salary from s_emp
where manager_id is not null;
4.条件的优先级问题
那个sql语句查出的结果可能会多
p37
C.order by 子句
数据的排序
order by 肯定是出现在sql语句最后
order by 排序标准 排序的形式
(升序 asc 可以省略 默认的顺序
降序 desc 不可省略 反自然顺序)
按照工资排序 显示id,first_name
select id,first_name,salary from
s_emp order by salary;
等价于
select id,first_name,salary from
s_emp order by 3;
等价于
select id,first_name,salary from
s_emp order by salary asc;
多字段排序 第一排序字段 第二排序字段
按工资排序 显示first_name ,salary
如果工资相同则按照first_name 降序
select id,first_name,salary from
s_emp order by
salary asc,first_name desc;
第一排序字段不同则按照第一排序字段排序
第一排序字段相同 则启用第二排序字段规则
D.单行函数
单行函数:sql语句影响多少行 就针对
每一行返回一个结果
select upper(first_name),first_name
from s_emp;
select upper(first_name) from s_emp
where salary>3500;
组函数:对一组数据处理之后得到一个结果
count 统计个数
select count(first_name) from s_emp;
select count(first_name) from s_emp
where salary>1500;
select count(first_name) from s_emp
where salary>3500;
测试当行函数----测试表-----dual
这个表是一个单行单列的表
单行函数:
1.字符串处理函数
upper-----把数据变大写
lower-----把数据变小写
initcap ----把字符串的每个单词首字母
变大写
select initcap('one world one dream')
from dual;
concat ----连接两个字符串
select concat('hello','world') from dual;
substr(参数1,参数2,参数3)
参数1 要截取的字符串
参数2 从什么地方开始截取 第一个是1
参数3 截取多长
select substr('hello',0,3) from dual;
select substr('hello',1,3) from dual;
第二个参数可以是负数
select substr('hello',-3,3) from dual;
显示first_name 的后三个字符
使用两种不同的方式完成
length -------得到字符串的长度
select length('hello') from dual;
select first_name,
upper(substr(first_name,1,3))
from s_emp;
E.多表查询
F.分组和组函数
G.子查询
emis
DB -----FILE
DBMS ----数据库管理系统
IBM -----RDBMS ----关系型数据库
管理系统
DB -----RDB
DB2
甲骨文----oracle----mysql
关系型数据库
基于二维表
行 row 列 column
第一行 -----表头 header
每一行 -----具体的数据行
数据库语言的分类:
数据查询语言 -----sql----select
数据操作语言 -----dml----insert delete
update
事务控制语言 -----tcl----commit rollback
savepoint
数据定义语言 -----DDL----create
drop
alter
DBA
数据控制语言 -----DCL----grant
revoke
如何连接oracle 来查询数据
SQLPLUS-----oracle 公司提供的访问数据
库的工具
远程访问服务器上的oracle数据库
172.30.1.6
telnet 172.30.1.6
openlab
open123
telnet 192.168.0.20
openlab
open123
telnet 192.168.0.23
openlab
open123
telnet 192.168.0.26
openlab
open123
oracle 10g 9i 8i
SQL> 进入了oracle的操作环境
查询数据------DB------二维表
二维表是数据库存储数据的基本单元
表中存储数据的基本单元是一行
表名------二维表的标识
表头------表的数据描述
根据表名查看表结构-----desc 表名
Name
------------------
ID 员工编号
LAST_NAME 姓
FIRST_NAME 名
USERID #用户说明
START_DATE 入职日期
COMMENTS 员工备注
MANAGER_ID 领导的员工编号
TITLE 职位
DEPT_ID 部门编号
SALARY 月薪
COMMISSION_PCT 提成
查询
选择:所有列都选中 部分行选中
投影:部分列选中 全部的行选中
表连接:数据来自于多张表 表和表之间建立
连接关系
查询:
A.from 子句
1.从表中查询一个字段的数据
select 字段 from 表;
select salary from s_emp;
750-2500$
搭建环境:sql脚本
1.把脚本上传对应的服务器
2.运行脚本
@路经/脚本名
2.查询多个字段
把first_name salary 列出来
select first_name,salary from s_emp;
3.把表中所有的字段的值列出来
select id,first_name ....;
*号可以代表所有的字段名
select * from s_emp;
4.字段的数学运算
算每个人的年薪
select salary*12 from s_emp;
可以用小括号改变的优先级
12*salary+100
12*(salary+100)
1/2 0.5
select 1/2 from dual;
5.字段的别名
紧跟在字段名后
select first_name name,12*salary yearsal from s_emp;
别名中有特殊字符 空格
select first_name name,
12*salary "year sal" from s_emp;
双引号-----原样显示
6.sql如何表达字符串
sql中的字符串
'a' '' ' ' 'hello world'
= 判断相等
7.字符串连接 ---oracle独特的 ||
first_name last_name salary
select first_name,last_name,salary from s_emp;
select first_name||last_name,salary from s_emp;
在first_name 和last_name 加一个下划线
select first_name||last_name,salary from s_emp;
在first_name 和last_name 加一个
单引号
select first_name||'''||last_name,salary
from s_emp;
翻译不了单引号----转义单引号
select first_name||''''||last_name,salary
from s_emp;
两个单引号表达一个单引号
在first_name 和last_name 之间
拼接一个双引号
select first_name||''''''||last_name
from s_emp;
8.NULL值的处理
月薪*12*(1+提成/100)
select salary*12,
salary*(1+commission_pct/100)*12
from s_emp;
NULL值和任何值做运算都是NULL
NULL值处理函数
nvl(参数1,参数2)
参数1 要处理的值或者字段
参数2 如果参数1为NULL则返回参数2的值
如果参数1不为NULL则返回参数1的值
注意:参数1和参数2必须有相同的类型
select salary*12,
salary*nvl((1+commission_pct/100)*12,0)
from s_emp; //logic error
NULL要尽早处理
select salary*12,
salary*(1+nvl(commission_pct,0)/100)*12 yearsal
from s_emp;
把first_name,manager_id
如果manager_id 为NULL则显示-1
select first_name,nvl(manager_id,-1)
from s_emp;
9.排重显示
显示所有的工资
select salary from s_emp;
不同的工资 -----distinct
select distinct salary from s_emp;
select distinct title from s_emp;
多个字段的排重
select distinct salary,id from s_emp;
select first_name,last_name,title from s_emp;
select distinct last_name,title
from s_emp;
B.where 子句-----限制行的返回
1.符合where后条件的数据返回
不符合where后条件的就过滤掉
查询工资大于1200的first_name,salary
select first_name,salary
from s_emp
where salary>1200;
2.字符串和数字的对比
查询工资等于2500的人的first_name
select first_name,salary
from s_emp
where salary=2500;
查询first_name是Carmen的工资
select first_name,salary
from s_emp
where first_name='Carmen';
select first_name,salary
from s_emp
where first_name='carmen';
//no rows selected
字符串的值是区分大小写的
字符串是大小写敏感
'a' 'A' 是不同的
3.sql中的运算(比较)符号
1.逻辑比较运算符号
= < > >= <=
2.sql的比较运算符号
between 值 and 值
表达一个闭区间[1500,2500]
找出工资在[1500,2500]之间的
first_name,salary
select first_name,salary
from s_emp
where salary
between 1500 and 2500;
in (列表)
列表 -----用逗号隔开的一组值
找出id 是1或者是3或者是9的first_name,
salary
select first_name,salary
from s_emp
where id in(1,3,9);
in:列表中的顺序和数据组成相关
把出现概率高的放前面
3.is null ----判断一个值是不是NULL
找出提成是NULL的first_name,salary
select first_name,salary from
s_emp where commission_pct is null;
4.模糊查询
like '字符串'
龙 成龙 李小龙 龙孩儿 龙龙
找出所有的first_name 带a的
like '通配字符串'
sql的通配符
% 代表任意字符 0-n
_ 代表一个任意字符 1(能且只能是一个)
select first_name from s_emp where
first_name like '%a%';
找出第二个字符是a的first_name
select first_name from s_emp where
first_name like '_a%';
数据字典表:
user_tables
table_name 表名
s_emp s_dept
select table_name from user_tables;
把s_开头的表名列出来
select table_name from user_tables
where table_name like 's_%';
数据字段表把所有数据的值 默认处理成
大写
select table_name from user_tables
where table_name like 'S_%';
通配符的转义:
select table_name from user_tables
where table_name like 'S\_%'
escape '\';
3.条件连接符号
c 和c++
int a=10;
if(5<a<9){
printf("shenma shidao");
}
与 and
或 or
非 not
找出工资在[1500,2500]之间的
first_name,salary
select first_name,salary from s_emp
where salary>=1500 and salary<=2500;
找出工资在(1500,2500)之间的
first_name,salary
select first_name,salary from s_emp
where salary>1500 and salary<2500;
找出id 是1或者是3或者是9的first_name,
salary
select first_name,salary from s_emp
where id=1 or id=3 or id=9;
找出提成不是NULL的first_name,salary
> <=
< >=
= != ^= <>
between and not between and
in not in
like not like
is null is not null
找出提成不是NULL的first_name,salary
select first_name,salary from s_emp
where manager_id is not null;
4.条件的优先级问题
那个sql语句查出的结果可能会多
p37
C.order by 子句
数据的排序
order by 肯定是出现在sql语句最后
order by 排序标准 排序的形式
(升序 asc 可以省略 默认的顺序
降序 desc 不可省略 反自然顺序)
按照工资排序 显示id,first_name
select id,first_name,salary from
s_emp order by salary;
等价于
select id,first_name,salary from
s_emp order by 3;
等价于
select id,first_name,salary from
s_emp order by salary asc;
多字段排序 第一排序字段 第二排序字段
按工资排序 显示first_name ,salary
如果工资相同则按照first_name 降序
select id,first_name,salary from
s_emp order by
salary asc,first_name desc;
第一排序字段不同则按照第一排序字段排序
第一排序字段相同 则启用第二排序字段规则
D.单行函数
单行函数:sql语句影响多少行 就针对
每一行返回一个结果
select upper(first_name),first_name
from s_emp;
select upper(first_name) from s_emp
where salary>3500;
组函数:对一组数据处理之后得到一个结果
count 统计个数
select count(first_name) from s_emp;
select count(first_name) from s_emp
where salary>1500;
select count(first_name) from s_emp
where salary>3500;
测试当行函数----测试表-----dual
这个表是一个单行单列的表
单行函数:
1.字符串处理函数
upper-----把数据变大写
lower-----把数据变小写
initcap ----把字符串的每个单词首字母
变大写
select initcap('one world one dream')
from dual;
concat ----连接两个字符串
select concat('hello','world') from dual;
substr(参数1,参数2,参数3)
参数1 要截取的字符串
参数2 从什么地方开始截取 第一个是1
参数3 截取多长
select substr('hello',0,3) from dual;
select substr('hello',1,3) from dual;
第二个参数可以是负数
select substr('hello',-3,3) from dual;
显示first_name 的后三个字符
使用两种不同的方式完成
length -------得到字符串的长度
select length('hello') from dual;
select first_name,
upper(substr(first_name,1,3))
from s_emp;
E.多表查询
F.分组和组函数
G.子查询