数据库基础 01

来源:互联网 发布:网络十大热词 英文 编辑:程序博客网 时间:2024/06/16 09:10


###select语句


字符串 '' 字符串的拼接||


特殊: 


1. 查询s_emp表格中的姓和名 ,要求在姓名中间 添加一个英文单引号


select last_name||'''||first_name from s_emp;


在字符串中表达英文单引号 , 需要使用4个单引号


select last_name||''''||first_name from s_emp;




2. null值的处理 , 在Oracle中 null值经过运算后永远是null , 对于null值的运算, 一定要尽早处理


nvl(par1,par2) : 判断参数1是否为null , 为null则返回参数2,不为null则返回参数1


nvl(提成,0);

查询员工的月薪 和 提成


select salary,commission_pct from s_emp;




计算年薪:  月薪*12   +  月薪*提成/100*12

select salary ,commission_pct,salary*12+salary*12*commission_pct/100 from s_emp;




上面的语句 查询时出现了问题 , 改良后: 


select salary ,commission_pct,salary*12+salary*12*nvl(commission_pct,0)/100 from s_emp;


3. distinct 数据排重关键字


查询月薪


select distinct salary from s_emp;




排重多个字段


查询月薪 与 领导编号 
#多字段排重:  必须多字段完全重复时, 才进行排重操作
select distinct salary,manager_id from s_emp;






###where子句 


对于查询进行条件的添加  ,  对于结果进行过滤 , 匹配规则的将被查询到, 而不匹配规则的结果 将被舍弃!


格式: select 查询的列 from 查询的表名 where 查询的条件!


常用的比较运算符 : = ,!= ,> ,< ,>= ,<=


举例: 


查询员工的id : 


select id from s_emp;


加上条件 查询员工的id , 要求员工的id必须是5




//进行等于判断时 , 跟java不同, java是双等, oracle是一个等号
select id from s_emp where id=5;




1. 特殊的极限条件: 永真条件与永假条件
永真条件:
select id from s_emp where 1=1;
永假条件:
select id from s_emp where 1=100;
select id from s_emp where 1!=1;


2. number类型的条件
1. 查询所有员工的last_name 与 id , 要求查询的条件为id大于5 !


select last_name , id from s_emp where id>5;


2. 查询所有员工的last_name 与 id , 要求查询的条件为 manager_id为1
select last_name , id from s_emp where manager_id=1;
3. 查询所有的员工的salary 与 id , 要求查询的条件为 salary小于等于1450
select salary,id from s_emp where salary<=1450;


3. 字符串类型的条件


- 在oracle中书写字符串时 需要添加单引号 ! '字符串'
- 在oracle中字符串参与比较时 , 大小写敏感


查询员工的id 与salary , 条件是 last_name是Chang


select id,salary from s_emp where last_name='Chang';


4. SQL所提供的一些 关键字 运算符


##
between  表示一个闭区间 

使用方式:  ... where 字段 between 初始范围 and 最大范围! 


查询员工的last_name 与工资, 条件为工资在1000 到 1450之间的员工 !


select last_name ,salary from s_emp where salary between 1100 and 1450;


##


in (取值1,取值2,取值3)


使用方式:  ...where 字段 in(取值1,取值2,取值3);


条件匹配取值列表中任意一个, 就会被查询到


查询员工的last_name 与 id 条件为id为 1或2 或3 或4的员工

select last_name , id from s_emp where id in(1,2,3,4);


##


对于null值的判断


查询所有的manager_id等于1的用户
select id from s_emp where manager_id=1;


查询所有的manager_id不等于1的用户
select id from s_emp where manager_id!=1;


查询所有员工的id last_name manager_id


select id,last_name,manager_id from s_emp;




通过上面的案例 发现 , 使用其他数据类型的条件 对null值无效 !


需要使用 is null 来判断null值


... where 字段 is null;


获取所有员工的last_name , 条件为manager_id为null


select last_name , id from s_emp where manager_id is null;


##


模糊查询


1. 龙龙
2. 龙龙漏气版
3. 龙龙钛合金版
4. 龙龙会旋转版
5. 龙龙免充气版
6. 龙龙电动马达



模糊查询
like


使用方式:  ... where 字段名 like '模糊查询的文本';


两个通配符 : 


1. _ : 表示一个任意字符 


2. % : 代表0-n个任意字符


查询以龙开头的文本: 


... where 字段 like '龙%';


查询里面包含气的文本


... where 字段 like '%气%';


查询倒数第二个字符为'转'的文本

... where 字段 like '%转_';


查询第二个字符为'龙'的文本

... where 字段 like '_龙%';




练习: 


- 查询s_emp表格中  last_name中包含a的员工!  查询他的last_name与id信息 !
select last_name,id from s_emp where last_name like '%a%';
-查询s_emp表格中  last_name中开头为N的员工!  查询他的last_name与id信息 !
select last_name,id from s_emp where last_name like 'N%';
-查询s_emp表格中  last_name中第二个字符为e的员工!  查询他的last_name与id信息 !
select last_name,id from s_emp where last_name like '_e%';
-查询s_emp表格中  last_name中倒数第二个字符为a的员工!  查询他的last_name与id信息 !
select last_name,id from s_emp where last_name like '%a_';


特殊的疑问: 


我要模糊查询的文本中包含_文本 ,怎么办 !


user_tables : 描述了当前登录数据库的用户的 所有表格


: table_name :  所有的表的名称


查询user_tables表格中的所有的table_name列的值 , 条件为 ,table_name列的值是s_开头的


select table_name from user_tables where table_name like 'S_%';
escape 描述转义字符 
select table_name from user_tables where table_name like 'S\_%' escape '\';




5. 逻辑条件连接符


and


- 查询员工id为2 , 领导编号为1的员工的 id , last_name


select id,last_name from s_emp where id=2 and manager_id=1;

or


- 查询员工的id为2 或者 员工id为3的员工的id,last_name


select id,last_name from s_emp where id=2 or id=3;


not   




闭区间的应用:
原来的方式:取闭区间范围内的数据 between 小 and 大


 取不属于闭区间范围内的数据 not between 小 and 大 ;


获取员工的id和salary , 条件为 月薪的范围 小于1000或大于1450


select id,salary from s_emp where salary not between 1000 and 1450;




in的应用


where 字段名称 in(取值1,取值2,取值3...);


取出不匹配取值列表的数据


where 字段名称 not in(取值1,取值2,取值3...);


获取员工id 不为 1 , 2, 3, 4的员工的last_name , id


select last_name,id from s_emp where id not in (1,2,3,4);


is null的应用


where 字段名称 is null ; 取出指定列为空的 数据行


where 字段名称 is not null ; 取出指定列不为null的 数据行


获取员工的manager_id 不为null的员工


select id,last_name,manager_id from s_emp where manager_id is not null;





条件的优先级


获取员工的 id , last_name ,salary ,条件是员工工资小于1450,并且部门的id为31或者为42




select id,last_name,salary 
from s_emp 
where salary<1000 and (dept_id=31 or dept_id=42);


##排序 order by 子句   


order by 子句  只能放在 select语句的最后面


对于查询的结果 ,按照指定的排序规则 进行排序   , 升序 (asc默认), 降序(desc)


在查询时 , 我们查询的字段会有很多个 , 所以要指定排序的字段


格式: order by 排序字段 排序方式


查询所有用户的id


select id from s_emp;


select id , dept_id from s_emp;


按照部门编号 进行排序 , 升序 (自然排序 , 字典排序)


select id,dept_id from s_emp order by dept_id asc;


按照id 进行排序 ,降序


select id,last_name from s_emp order by id desc;




null值的排序 , null是最大的


select id, manager_id from s_emp order by manager_id desc;


##
多字段排序


格式: 


order by 排序字段1 排序规则1,排序字段2 排序规则2

按照部门id 降序排列 ,  如果部门id相同, 则按照id降序排列

select id,dept_id from s_emp order by dept_id desc,id desc;




#单行函数


2017/7/19 15:17:21 


----




Oracle中 函数的分类 : 


单行函数  :  返回的结果  针对每一行数据 会计算出一个结果


单行函数案例:  select upper(last_name) from s_emp;




组函数 : 返回的结果  无论结果为多少数据, 都只返回一个结果


组函数要求: 返回的列的结果 要一一对应
组函数案例: select count(last_name),id from s_emp;(错误案例)
  select count(manager_id) from s_emp;



count(manager_id)       id
-------------------------------------
25 1
25 2






###常用的单行函数: 


dual 表用来测试单行函数


#####字符串的操作


把字符串 变大写
select upper('abcde') from dual;
把字符串 变小写
select lower('AAABBBCCC') from dual;


单词首字母大写
initcap  
select initcap('hello longlong') from dual;


获取字符串的长度
length
select  length('1234567890') from dual;


截取字符串


substr(par1,par1,par3);




参数1. 要被截取原字符串
参数2. 截取的开始下标  从1开始 , 可以输入负数
参数3. 截取的长度 

select substr('1234567890',1,5) from dual;   \
得到的结果完全一致
select substr('1234567890',0,5) from dual;   /


开始下标 指定负数


select substr('1234567890',-3,3) from dual;


拼接字符串 


concat


select concat('baolin','sb') from dual;


nvl函数 
判断参数1 是否为null , 如果为null则返回参数2 , 如果不为null则返回参数1



替换字符串
replace(par1,par2,par3); 



参数1. 原字符串
参数2. 在参数1中存在的, 要被替换的字符串片段
参数3. 替换的新的字符串片段


select replace('1234561237890123','123','abc') from dual;




#####number类型的操作


round  四舍五入 


参数1. 要四舍五入的数字 


参数2. 保留的小数点后的位数 , 可以省略不写, 默认为0 (默认取整)


select round(15.55555) from dual;


select round(15.55555,3) from dual;




trunc 截取数字


参数1. 要截取的数字
参数2. 要保留的小数点后的位数,可以省略不写, 默认为0 (默认取整)




select trunc(15.55555) from dual;
select trunc(15.55555,3) from dual;


yyyy-MM-dd HH:mm:ss:sss




格式化显示函数


¥025,000.00


FM$999
to_char();


1. 要被格式化的数字
2. 格式化的模版
FM: format 格式的开头  可以省略


L : 本地货币单位, Oracle语言环境


$ : 美元符号


9 :  两种情况: 
1. 出现在小数点的前面: 表示0-9的任意数字
2. 出现在小数点的后面: 表示1-9的任意数字


0 : 两种情况:
1. 出现在小数点的前面:  表示强制显示前导零
2. 出现在小数点的后面:  表示0-9的任意数字


, : , 分隔符


. : . 小数点


FML099,999.99


查询s_emp表格中的 所有员工的月薪, 并将其进行格式化, 格式:FML099,999.99


select to_char(salary,'FML099,999.99'),id from s_emp;
//建议在小数点的后面描述数字时 , 使用0
select to_char(salary,'FML099,999.00'),id from s_emp;




###函数的嵌套 


把一个函数返回的结果, 当作另一个函数 所需要的参数


1. 把s_emp表格中的所有的last_name的后三位更改为大写字母 显示出来




select upper(substr(last_name,-3,3)) from s_emp;



select upper(substr(last_name,length(last_name)-3,3)) from s_emp;
































<br>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>



































































<div id="content_table"><br>
###s_emp表格的结构 名称 是否为空? 类型<br>
----------------------------------------- -------- ----------------------------<br>
ID 员工编号 NOT NULL NUMBER(7)<br>
LAST_NAME 姓 NOT NULL VARCHAR2(25)<br>
FIRST_NAME 名 VARCHAR2(25)<br>
USERID 用户编号 VARCHAR2(8)<br>
START_DATE 入职日期 DATE<br>
COMMENTS 备注 VARCHAR2(255)<br>
MANAGER_ID 领导的员工编号 NUMBER(7)<br>
TITLE 职位 VARCHAR2(25)<br>
DEPT_ID 部门编号 NUMBER(7)<br>
SALARY 月薪 NUMBER(11,2)<br>
COMMISSION_PCT 提成 NUMBER(4,2)<br>


</div>