oracle学习之基本查询和条件过滤,分组函数使用

oracle是殷墟出土的甲骨文的第一个单词,所以在中国叫做甲骨文,成立于1977年,总部位于美国加州。

在安装好后,主要有两个服务需要开启:

1,实例服务,OracleServiceORCL,决定是否可以连接上数据库

2,监听服务,OracleOraDb11g_home1TNSListener,决定是否可远程连接数据库

在安装好客户端后,登录方式:

sqlplus 用户名/密码

如果是远程登录,需要加上连接别名,或者IP:

sqlplus 用户名/密码@//IP地址/实例名
or
sqlplus 用户名/密码@连接名

数据库基本查询:

select * from tab;

tab是一个数据字典,字义了当前用户有哪些表,以及类型,查看表结构:

desc dept

  注意,如果显示行大小和宽度不正确,可以通过修改登录设置文件改变:

路径:\app\Administrator\product\11.2.0\client_1\sqlplus\admin
set linesize 140;//设置行大小
set pagesize 120;//设置页宽度
col empno for 99999;//修改数值型字段长度
col ename for a20;//设置字符型字段长度

  sql语法的注意事项:关键字不能缩写,不能换行,以分号结尾!

查看sqlplus的所有命令:

? topic

查询SQL语句语法:

select [distinct]*|column_name|expr|alias from tablename

 查询员工号,姓名,月薪,奖金,年薪:

注意,奖金字段有为null的结果,可以通过虑空函数解决,即:nvl(a,b),如果a为null,返回b,否则返回a

如果需要查看员工表不同的部门编号,并且去除重复的,可以这么做:

通常,我们还可以借助伪表来进行一些的数学计算或函数操作:

select 3+20*5,sysdate from dual;

  比较运算符的查询条件过滤: = != <> < > <= >= (between and)

case1: 查询入职日期为1981年11月17日的员工信息:

select * from emp where hiredate = ‘1981-11-17‘

  这里要注意,如果显示文字与格式字符串不匹配的问题,通常必须按照具体日期格式写:

如果自己想修改这个日期格式,可以进入管理员用户后修改,如下:

SQL> select sysdate from dual;
//修改会话日期格式
SQL> alter session set nls_date_format=‘yyyy-mm-dd‘;
//后面就可以这样查询了:
SQL> select * from emp where hiredate =‘1981-11-17‘;

  逻辑运算符 and or not,这里特别说明一下,查找工资在1000~2000的员工信息:

select * from emp where sal >= 1000 and sal <= 2000;
//或者
select * from emp where sal between 1000 and 2000;

  between and 是属于闭区间,从小到大!

如何正确查询奖金为空的员工信息 - null

select * from emp where comm is null;

  当and or 存在多个条件写,如何来写才更优?

sql语句是从右到左执行,and情况,应该将易假的放在右侧,or情况,应该将真的放在右侧。

like ->模糊查询,‘%‘匹配任意多个字符,‘_‘匹配任意一个字符

重点:查询带在下划线‘_‘的应该怎么查询:

select * from emp where ename like ‘%/_%‘ escape ‘/‘;

  排序:group by; having; order by;语法如下:

order by col|expr|alias|number

  员工薪水按从大到小排序(序号)

select * from emp order by sal desc;
//或者
select * from emp order by 6 desc;
//或者
select empno,ename,job,mgr,sal,comm,deptno from emp order by 5 desc;

  这里更要注意null的情况,默认无穷大:

解决办法是:

select * from emp where deptno = 30 order by comm desc nulls last;//或者select * from emp where deptno = 30 order by nvl(comm,-1) desc;

  oracle的单行函数:

什么叫单行函数,即对一行进行变换,只产生一个结果。

lower(小写),upper(大写),initcap(首字母大写),||(可以进行字符串连接)

select lower(‘hello WorLD‘) one,upper(‘HeLLo woRld‘) two,initcap(‘hello WOrld‘) from dual;
select ‘aaaa‘||‘bbbb‘||‘cccc‘ from dual;

  substr(字符串,位置,长度),从位置开始截取长度,长度可以省略,代表截取到未尾:

select substr(‘helloworld‘,1,3) one,substr(‘helloworld‘,1) two ,substr(‘helloworld‘,-3) three from dual;

  length求字符串长度,lengthb求字节长度:

instr(str1,str2) ,判断str2是否在str1中,如果存在返回出现的首位置,否则返回0:

select instr(‘hello world‘,‘llo‘) from dual;

  lpad,rpad,左右填充l(r)pad(str,len,char) 返回len长度的字符串,如果str不够长度,则是char字符填充:

select lpad(‘hello‘,10,‘#‘) from dual;

  trim(str)去首尾空格,replace(str,substr,strto)替换

select ‘aaa‘||trim(‘ hello world ‘)||‘bbb‘ from dual;

  还能这么玩:

重要:数值函数,round四舍五入,trunc截断,mod取模

select round(45.926, 2) 一, round(45.926, 1) 二, round(45.926, 0) 三,  round(45.926, -1) 四, round(45.926, -2) 五 from dual;
select trunc(45.926, 2) 一, trunc(45.926, 1) 二, trunc(45.926, 0) 三,  trunc(45.926, -1) 四, trunc(45.926, -2) 五 from dual;
select mod(600,1000),mod(1000,600) from dual;
//ceil 和floor 向上取整,向下取整
select ceil(121/60),floor(121/60) from dual;

 重要:转换函数,to_char,to_number,to_date 

把薪水转换为本地货币字符型:

select sal,to_char(sal,‘L9,999‘) from emp;

如果要将这个在转回数值型,语句是一样的:

select to_number(‘¥1,250‘,‘L9,999‘) from dual;

  to_char 与 to_date 显示 ‘yyyy-mm-dd hh24:mi:ss 今天是 星期几‘

select to_char(sysdate,‘yyyy-mm-dd hh24:mi:ss "今天是" day‘) from dual;

  将上述字符串反转为日期:

select to_date(‘2017-11-10 15:48:13 今天是 星期五‘,‘yyyy-mm-dd hh24:mi:ss "今天是" day‘) from dual;

  此处可以解决一个隐式日期转换问题:

select * from emp where to_char(hiredate,‘yyyy-mm-dd‘)=‘1981-11-17‘;

 上面的能显示转换,尽量显示转换。

重要:日期函数

1,显示昨天,今天,明天:

select sysdate-1 昨天,sysdate 今天,sysdate+1 明天 from dual;

  2,计算员工工龄,可以按日,周,月,年,日期差减方法

时间: 2024-08-25 10:19:58

oracle学习之基本查询和条件过滤,分组函数使用的相关文章

Oracle学习之简单查询

使用scott用户下的表, 1.查询所有内容SELECT * FROM emp; 2.查询员工信息,包括员工编号,姓名,职位3个信息SELECT empno,ename,job FROM emp; 3.查询所有职位SELECT JOB FROM emp; 4.查询所有职位并去掉重复用DISTINCTSELECT DISTINCT job FROM emp; 5.查询员工编号,姓名,职位SELECT empno,ename,job FROM emp; 6.查询所有员工的编号,姓名,月薪,年薪sal

Oracle学习之简单查询语句

--以特定格式显示日期 select ename,to_char(hiredate,'YYYY"年"MM"月"DD"日"') from emp; --排除重复行 select distinct deptno,job from emp; select deptno,job from emp; --使用nvl函数处理NULL select ename ,sal,comm,nvl(comm,0.00),sal+nvl(comm,0) from emp;

oracle之5多行函数之过滤分组函数

Hanving子句: 例如: Select deptid avg(sal) from emp group by deptid having avg(sal)>2000 Where和having的区别: Where后面不能使用多行函数. 原文地址:https://www.cnblogs.com/txf0324/p/11038267.html

Oracle学习(二):过滤和排序

1.知识点:可以对照下面的录屏进行阅读 SQL> --字符串大小写敏感 SQL> --查询名叫KING的员工信息 SQL> select * 2 from emp 3 where ename = 'KING'; SQL> --日期格式敏感 SQL> --查询入职日期为17-11月-81的员工 SQL> select * 2 from emp 3 where hiredate='17-11月-81'; --正确例子 SQL> ed 已写入 file afiedt.b

Oracle学习(六):子查询

1.知识点:可以对照下面的录屏进行阅读 SQL> --子查询所要解决的问题:问题不能一步求解 SQL> --查询工资比SCOTT高的员工信息 SQL> --(1)使用普通方法 SQL> --1. SCOTT的工资 SQL> select sal from emp where ename='SCOTT'; SQL> --2. 查询比3000高的员工 SQL> select * 2 from emp 3 where sal>3000; SQL> --(2)

Oracle学习笔记(5)——查询

基本查询语句 SELECT [DISTINCT] column_name1,...|* FROM table_name [WHERE conditions] 在SQL*PLUS中设置格式 更改显示字段名:COLUMN column_name HEADING new_name   (注意COLUMN可以简写成COL) 例如: col username heading 用户名; select * from users; 设置显示结果的格式:COLUMN column_name FORMAT data

Silverlight学习(四) domainservice动态多条件查询

上次讲了silverlight+MVVN+EF的简单框架,能够实现简单的数据CURD,但是多条件动态的查询一直没有实现.在网上查阅了很多资料,发现自己走了很多误区,代码很难调试正确. 这次的查询是基于上次的查询,只是增加了一个查询条件,动态多条件的查询的重点是获取查询的语言. 1 private string GetSql() 2 { 3 string query = "1=1"; 4 if (!string.IsNullOrEmpty(searchText.name)) 5 { 6

Oracle学习笔记五 SQL命令(三):Group by、排序、连接查询、子查询、分页

GROUP BY和HAVING子句 GROUP BY子句 用于将信息划分为更小的组每一组行返回针对该组的单个结果 --统计每个部门的人数: Select count(*) from emp group by deptno; --根据部门分组,并统计 Select deptno, count(*) form emp group by deptno; select deptno, avg(sal) from emp group by deptno; --每个部门的平均工资 HAVING子句 用于指定

sql 查询条件过滤替换特许符号(‘,",+,!等)

查询条件过滤替换特许符号 public static string SpecialSymbols(string strText) { strText = strText.Trim(); strText = strText.Replace("!", "' + char(33) + '"); strText = strText.Replace("\"", "' + char(34) + '"); strText = st