数据库查询基本命令

oracle 数据库的scott帐号。

<>作为查询条件时,可以使用!= 来替换。

SQL> select * from emp;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO


7369 SMITH CLERK 7902 1980-12-17 800.00 20
7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30
7521 WARD SALESMAN 7698 1981-2-22 1250.00 500.00 30
7566 JONES MANAGER 7839 1981-4-2 2975.00 20
7654 MARTIN SALESMAN 7698 1981-9-28 1250.00 1400.00 30
7698 BLAKE MANAGER 7839 1981-5-1 2850.00 30
7782 CLARK MANAGER 7839 1981-6-9 2450.00 10
7788 SCOTT ANALYST 7566 1987-4-19 3000.00 20
7839 KING PRESIDENT 1981-11-17 5000.00 10
7844 TURNER SALESMAN 7698 1981-9-8 1500.00 0.00 30
7876 ADAMS CLERK 7788 1987-5-23 1100.00 20
7900 JAMES CLERK 7698 1981-12-3 950.00 30
7902 FORD ANALYST 7566 1981-12-3 3000.00 20
7934 MILLER CLERK 7782 1982-1-23 1300.00 10
14 rows selected

单表查询:

SQL> select ename,job,sal from emp;

ENAME JOB SAL


SMITH CLERK 800.00
ALLEN SALESMAN 1600.00
WARD SALESMAN 1250.00
JONES MANAGER 2975.00
MARTIN SALESMAN 1250.00
BLAKE MANAGER 2850.00
CLARK MANAGER 2450.00
SCOTT ANALYST 3000.00
KING PRESIDENT 5000.00
TURNER SALESMAN 1500.00
ADAMS CLERK 1100.00
JAMES CLERK 950.00
FORD ANALYST 3000.00
MILLER CLERK 1300.00
14 rows selected

查询全部列:

select * from emp;

查询经过计算的值:

SQL> select ename,job,6000-sal from emp;

ENAME JOB 6000-SAL


SMITH CLERK 5200
ALLEN SALESMAN 4400
WARD SALESMAN 4750
JONES MANAGER 3025
MARTIN SALESMAN 4750
BLAKE MANAGER 3150
CLARK MANAGER 3550
SCOTT ANALYST 3000
KING PRESIDENT 1000
TURNER SALESMAN 4500
ADAMS CLERK 4900
JAMES CLERK 5050
FORD ANALYST 3000
MILLER CLERK 4700
14 rows selected

列出ename,job,sal,并用小写字母来表示job,ename :

SQL> select lower(ename),lower(job),sal from emp;

LOWER(ENAME) LOWER(JOB) SAL


smith clerk 800.00
allen salesman 1600.00
ward salesman 1250.00
jones manager 2975.00
martin salesman 1250.00
blake manager 2850.00
clark manager 2450.00
scott analyst 3000.00
king president 5000.00
turner salesman 1500.00
adams clerk 1100.00
james clerk 950.00
ford analyst 3000.00
miller clerk 1300.00
14 rows selected

别名的使用:在select语句的执行顺序中,from子句最先被执行,然后就是where子句,最后才是select子句。当在from子句中指定表别名后,表的真实名称将被替换。同时,其他的子句只能使用表别名来限定列。

SQL> select ename 名字,job 工作,sal from emp;

名字 工作 SAL


SMITH CLERK 800.00
ALLEN SALESMAN 1600.00
WARD SALESMAN 1250.00
JONES MANAGER 2975.00
MARTIN SALESMAN 1250.00
BLAKE MANAGER 2850.00
CLARK MANAGER 2450.00
SCOTT ANALYST 3000.00
KING PRESIDENT 5000.00
TURNER SALESMAN 1500.00
ADAMS CLERK 1100.00
JAMES CLERK 950.00
FORD ANALYST 3000.00
MILLER CLERK 1300.00
14 rows selected

SQL> select ename "名字",job "工作",sal from emp;(此处双引号只能为英文双引号,汉字双引号报错)

查询的时候,比如job='clerk'这里是英文单引号
关于别名,比如select ename "名字",job "工作",sal from emp; 这里是英文双引号;这里也是英文的,中文无效

在使用列别名时,如果列别名区分大小写,并且还包含一些特殊字符,那么必须使用双引号将列别名引起来。
名字 工作 SAL


SMITH CLERK 800.00
ALLEN SALESMAN 1600.00
WARD SALESMAN 1250.00
JONES MANAGER 2975.00
MARTIN SALESMAN 1250.00
BLAKE MANAGER 2850.00
CLARK MANAGER 2450.00
SCOTT ANALYST 3000.00
KING PRESIDENT 5000.00
TURNER SALESMAN 1500.00
ADAMS CLERK 1100.00
JAMES CLERK 950.00
FORD ANALYST 3000.00
MILLER CLERK 1300.00
14 rows selected

SQL> select ename “名字”,job “工作”,sal from emp;

select ename “名字”,job “工作”,sal from emp

ORA-00911: 无效字符
消除取值重复的行:

SQL> select deptno from emp;

DEPTNO

20
30
30
20
30
30
10
20
10
30
20
30
20
10

14 rows selected

SQL> select distinct deptno from emp;

DEPTNO

30
20
10

此处: select deptno from emp; 等同于 select all deptno from emp;默认没有指定distinct关键词,则缺省值为all,即保留结果表中取值重复的行。
查询满足条件的元组: where 语句来实现!

查询关于工资的比较:

SQL> select ename,job,sal from emp where sal='800';

ENAME JOB SAL


SMITH CLERK 800.00

SQL> select deptno,ename,job from emp where ename='KING';(oracle这里区分大小写)

DEPTNO ENAME JOB


10 KING       PRESIDENT

SQL> select ename,job,sal from emp where sal>=2000;

ENAME JOB SAL


JONES MANAGER 2975.00
BLAKE MANAGER 2850.00
CLARK MANAGER 2450.00
SCOTT ANALYST 3000.00
KING PRESIDENT 5000.00
FORD ANALYST 3000.00
6 rows selected

SQL> select ename,job,sal from emp where sal between 1000 and 2000;(此处not between...and...相同使用方法)

ENAME JOB SAL


ALLEN SALESMAN 1600.00
WARD SALESMAN 1250.00
MARTIN SALESMAN 1250.00
TURNER SALESMAN 1500.00
ADAMS CLERK 1100.00
MILLER CLERK 1300.00
6 rows selected
确定集合,谓词In 可以用来查找属性值属于指定集合的元组。(IN 的相对是 NOT IN)

SQL> select ename,job,sal from emp where deptno in ('10','20');

ENAME JOB SAL


SMITH CLERK 800.00
JONES MANAGER 2975.00
CLARK MANAGER 2450.00
SCOTT ANALYST 3000.00
KING PRESIDENT 5000.00
ADAMS CLERK 1100.00
FORD ANALYST 3000.00
MILLER CLERK 1300.00
8 rows selected

字符匹配:

SQL> select ename,job, sal from emp where empno like '7369';

ENAME JOB SAL


SMITH CLERK 800.00

SQL> select ename,job, sal from emp where empno='7369';

ENAME JOB SAL


SMITH CLERK 800.00

SQL> select ename,job, sal from emp where empno like '7%9';

ENAME JOB SAL


SMITH CLERK 800.00
ALLEN SALESMAN 1600.00
KING PRESIDENT 5000.00

SQL> select ename,job, sal from emp where empno like '7__9';

ENAME JOB SAL


SMITH CLERK 800.00
ALLEN SALESMAN 1600.00
KING PRESIDENT 5000.00

SQL> select ename,job, sal from emp where empno like '7_9_';

ENAME JOB SAL


ALLEN SALESMAN 1600.00
BLAKE MANAGER 2850.00
(一个汉字要占两个字符的位置,所以匹配汉字的时候要注意)
涉及空值的查询:(此处is 不能用等号(=)代替)

SQL> select ename,job,sal from emp where mgr is null;

ENAME JOB SAL


KING PRESIDENT 5000.00

多重条件查询: 逻辑运算符and 和or 可用来联结多个查询条件,and优先级比or高,可以通过括号来改变优先级。

SQL> select ename,job,sal from emp where deptno='20' and sal>2500;

ENAME JOB SAL


JONES MANAGER 2975.00
SCOTT ANALYST 3000.00
FORD ANALYST 3000.00

order by 子句:
用户可以用order by 子句对查询结果按照一个或多个属性列的升序(asc)或降序(desc)排列,缺省值为升序。

SQL> select empno,ename,job,sal from emp where deptno='20' order by sal,empno;

EMPNO ENAME JOB SAL


7369 SMITH CLERK 800.00
7876 ADAMS CLERK 1100.00
7566 JONES MANAGER 2975.00
7788 SCOTT ANALYST 3000.00
7902 FORD ANALYST 3000.00

聚集函数:
count([distinct|all]*) 统计元组个数
count([distinct|all]<列名>) 统计一列中值的个数
sum([distinct|all]<列名>) 计算一列值的总合(此列必须是数值型)
avg([distinct|all]<列名>) 计算一列值的平均值(此列必须是数值型)
max([distinct|all]<列名>) 求一列值中的最大值
min([distinct|all]<列名>) 求一列值中的最小值

SQL> select count(*) from emp;

COUNT(*)

    14

SQL> select count(sal) from emp;

COUNT(SAL)

    14

SQL> select avg(sal) from emp where deptno='20';

AVG(SAL)

  2175

SQL> select max(sal) from emp where deptno='20';

MAX(SAL)

  3000

SQL> select ename,job, min(sal) from emp where deptno='20';

select ename,job, min(sal) from emp where deptno='20'

ORA-00937: 不是单组分组函数

SQL> select min(sal) from emp where deptno='20';

MIN(SAL)

   800

SQL> select sum(sal) from emp ;

SUM(SAL)

 29025

Group by句子:

SQL> select avg(sal),max(sal),deptno from emp group by deptno;

AVG(SAL) MAX(SAL) DEPTNO


1566.66666 2850 30
2175 3000 20
2916.66666 5000 10

SQL> select avg(sal),min(sal),job,deptno from emp group by deptno,job;

AVG(SAL) MIN(SAL) JOB DEPTNO


   950        800 CLERK         20
  1400       1250 SALESMAN      30
  2975       2975 MANAGER       20
   950        950 CLERK         30
  5000       5000 PRESIDENT     10
  2850       2850 MANAGER       30
  1300       1300 CLERK         10
  2450       2450 MANAGER       10
  3000       3000 ANALYST       20

9 rows selected

having的用法。就是起到限制,group by 后面的限制。

SQL> select avg(sal),deptno from emp group by deptno having avg(sal)<2000;

AVG(SAL) DEPTNO


1566.66666 30

对数据分组的总结:
1 分组函数只能出现在选择列表、having、order by子句中
2 如果在select 语句中同时包含有group by,having,order by 那么他们的顺序是group by,having,order by
3 在选择列中如果有列、表达式、和分组函数,那么这些列和表达式必须有一个出现在group by 子句中,否则就会出错
如select deptno,avg(sal),max(sal) from emp group by deptno having avg(sal)<2000;这里deptno就一定要出现在group by 中。

在使用group by 子句时,必须满足下面的条件:
在select 子句的后面只可以有两类表达式:统计函数和进行分组的列名。
在select子句中的列名必须是进行分组的列,除此之外添加其他的列名都是错误的,但是,group by子句后面的列名可以不出现在select子句中。
如果使用了where子句,那么所有参加分组计算的数据必须首先满足where子句指定的条件。

下面是衣蛾错误的查询,犹豫在select子句后面出现了salary列,而该列并没有出现在group by 子句中,所以该语句是一个错误的查询。
select job_id,salary,avg(salary),sumsalary),max(salary),count(*) from employees group by job_id;
这里是错误的!!!!

857e9db0gd932b3281f93&690.jpeg

如果处理null值
select sal13+nvl(comm,0)13 "年工资",ename,comm from emp;

857e9db0gd933621a03b5&690.jpeg
857e9db0gd933486c8d33&690.jpeg
857e9db0gd9335e4db2f4&690.jpeg
857e9db0gd9335a5ec910&690.jpeg
857e9db0gd9332a02ed75&690.jpeg
857e9db0gd984dcef45fe&690.jpeg
857e9db0gd984c3b95479&690.jpeg
857e9db0gd932f561058e&690.jpeg
857e9db0gd932dcca035b&690.jpeg
857e9db0gd932c7c454ee&690.jpeg
857e9db0gd932b3281f93&690.jpeg
857e9db0g7c26e250fcbe&690.jpeg
857e9db0g7c26e2c88cee&690.jpeg

1:子查询
子查询的类型:基本有两种:单行子查询和多行子查询
单行子查询
多行子查询
另外,子查询还有3种子类型,这3种子类型返回一行或者多行的查询结果。
多列子查询
关联子查询
嵌套子查询

单行子查询:
select start_date,end_date,job_id from job_history where employee_id=(select employee_id from employees where first_name='jennifer' and last_name='whalen');
多列子查询是指返回多列数据的子查询语句。当多列子查询返回单行数据时,在where自居中可以使用单行比交付:单色如果需要返回多行数据时,那么where自居中必须使用多行比较符(in、any、all)
1:使用In操作符实现制定匹配查询
当在多行子查询中使用In操作符时,会处理匹配与子查询中任一个值的行。
以下代码查询Jobs表中最高工资分别为10000、20000、30000的职位信息。
select job_id,max_salary from jobs where max_salary in(10000,20000,30000);
2:使用any操作符实现任意匹配查询
any操作符必须与单行操作符结合使用,并且返回行只需匹配与子查询的任一个结果即可。
首先查询jobs表中最高工资小于10000的工作职位,然后在外部查询中查找最低工资大于这些工资的任意一个工作职位信息。
select job_id,min-salary,max_salary from jobs where min_salary>any(select max_salary from jobs where max_salary<10000);
3:使用all操作符实现全部匹配查询
首先查询jobs表中最高工资小于10000的工作职位,然后在外部查询中查找最低工资大于这些工资的任意一个工作职位信息。
select job_id,min_salary,max_salary from jobs where min_salary>all(select max_salary from jobs where max_salary<10000);

在update语句中使用子查询
update jobs set min_salary=min_salary+100 where min_salary>all(select max_salary from jobs where max_salary <10000);
在delete 语句中使用子查询
delete from job_history where employee _id=(select employee_id from employees where first_name='jennifer' and last_name='whalen');

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • 5.多表查询 多表查询 目的:从多张表获取数据 前提:进行连接的多张表中有共同的列 等连接 通过两个表具有相同意义...
    乔震阅读 1,194评论 0 0
  • 1.简介 数据存储有哪些方式?电子表格,纸质文件,数据库。 那么究竟什么是关系型数据库? 目前对数据库的分类主要是...
    乔震阅读 1,699评论 0 2
  • 1. select * from emp; 2. select empno, ename, job from em...
    海纳百川_4d26阅读 1,878评论 0 4
  • SQL ==SQLPLUS== DML(Data Manipulation Language,数据操作语言)---...
    蝌蚪1573阅读 577评论 0 4
  • 5.DML DML 语句 语句操作语言 INSERT UPDATE DELETE MERGE INSERT 方法:...
    乔震阅读 910评论 0 0