forked from HappySnailSunshine/JavaInterview
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Oracle.md
2195 lines (1550 loc) · 61.3 KB
/
Oracle.md
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
# Oracle
## 目录
<!-- TOC -->
[TOC]
<!-- /TOC -->
> 这一部分内容我忘记了参考的文章。 有些是我写的,有很多不是我写的。当时看到觉得很好,就保存下来了。方便后续查阅。
## Oracle和Mysql区别
<img src="../media/pictures/Oracle.assets/image-20200814101957056.png" alt="image-20200814101957056" style="zoom: 33%;" />
<img src="../media/pictures/Oracle.assets/image-20200814102008896.png" alt="image-20200814102008896" style="zoom:33%;" />
Oracle的结构和PostgreSql 很像,公司用PostgreSql很多。好多资料上也是这个数据库,除了Mysql以外算是用的也挺多的一个数据库。
## navicat创建Oracle表
参考 https://www.cnblogs.com/sugarwxx/p/12696852.html
# 一、概述
数据库就是用户存放数据、访问数据、操作数据的存储仓库用户的各种数据被存放在数据库中。在需要的时候可以被有权限的用户查询、统计,新的数据可以被添加进去,不需要的数据可以被别除,一些旧的数据可以被修改。所以:数据库就是组织在一起的数据集合
数据库管理系统( Database Management System,DBMS)就是管理一个数据库的软件。
**RDBMS**是所有数据的知识库,并对数据的存储、安全、一致性、并发操作、恢复和访问负责;
**RDBMS**有一个数据词典(有时被称为系统目录),用于贮存它拥有的每个事物的相关信息,例如名字、结构、位置和类型,这种关于数据的数据也被称为**元数据( metadata)**;
## 1.数据库发展
手工管理阶段:
- 数据不被保存。这个时候基本上没有文件的概念,也没有专门的软件系统对文件进行管理。这时,通常一组数据与一个程序直接对应
文件管理阶段:
- 数据以文件的形式存在,有大量的数据需要保存,此时已使用了文件系统,有操作系统存储数据并负责逻辑与物理存储结构的转换。此时的典型特点是,数据量大,数据和程序缺乏独立性,数据还是直接面向应用的,也就是一个应用对应与一组数据,应用之间不能共享数据
数据管理阶段:
- 数据量增大,同时有大量的用户需要共享数据。此时为了解决这种多用户,多应用共享数据的需求,需要专『门的数据库管理系统
## 2.数据库的类型
**数据模型**是**数据库系统的核心和基础**,通常由**数据结构**,**数据操作**和**完整性约束**3部分组成.各种DBMS软件都是基于某种数据模型的,所以通常也安装数据模型的特点将传统的数据系统分成网络性数据库,层次性数据库,关系型数据库
### 1.关系型数据库的组成
- 多个表数据之同存在着关系
- 在这些表上的数据操作依赖于关系
- 关系用来描述多个表之间的数据依存,包括了一对一、一对多、多对多的关系
- 这些关系在 Oracle数据库中表现为主键、外键这些约東条件
- RDBMS就是一个建立在这些关系模型基础上的
- Oracle从7.3的版本就完全支持关系型数据库
### 2.oracle数据库的特点
- 支持大数据库、多用户的高性能的事务处理
- Oracle遵守数据存取语言、操作系统、用户接口和网络通信协议的工业标准(SQL)
- 实施安全性控制和完整性控制
- 支持分布式数据库和分布处理
- 具有可移植性、可兼容性和可连接性
- 全球化、跨平台的数据库
## 3.数据库安全
用户:
- 数据库中的用户,用于组织和管理数据库对象的。通常一个应用软件的数据库对象被存放在一个数据库用户下。使用数据库用户连接数据库后,可以对这些数据库对象进行操作
方案:
- 一组数据库对象的集合。一个方案对应一个唯一的数据库用户,方案名和用户名完全相同。在访问数据库对象的时候,可以才用“方案名.对象名”的方式进行访问
权限:
- 权限决定了数据库用户在数据库中可以作什么。如果用户没有权限,那么对数据库就不能进行任何操作。权限由高权限用户授予
角色:
- 一组命名的权限,用于简化对权限的管理操作。可以次将多个权限(一个用户的权限)授予一个或多个用户
## 4.数据库文件与存储
数据文件:
- 用于存放数据的操作系统文件。数据库包含一个或多个数据文件
表空间:
- 数据被存储在文件中,但是在数据库中数据文件组织在一起,被按照表空间的方式来进行管理。表空间是一个或多个数据文件的集合,在数据库中的存储空间表现为表空间,在操作系统中表现为数据文件。 一个数据库包含一个或多个表空间
控制文件:
- 数据库的核心文件,存放着数据库的重要信息。例如数据库的名称和数据库的结构(数据文件,重做日志文件的名称和目录)
重做日志文件:
- 记录数据库中数据变化的文件。所有数据的修改都被记录在日子文件中,主要用于保证数据库的可恢复性
初始化参数文件:
- 存在数据库初始化参数的文件。用于设置关于数据库的一些参数,在数据库启动的时候需要读取,并根据初始化参数的设置分配数据库的内存空间;
## 5.数据库网络访问
数据库名:数据库的名称
实例名:数据库的内存区域和后台进程集合的总称
服务名:数据库在操作系统上被当作一个服务对待
连接字符串:
- 通过网络访问远端服务器上的数据库时,用于描述数据库访问地址的字符串。通常的结构是:“主机名(或IP):端口号:服务名”,例如:192.168.2.200:1521:orcl
监听器:
- 在服务器端运行的一个进程。用于监听客户端到数据库的连接请求。在通过网络访问时必须启动
---
---
# 二、数据库管理
说明:因为在win7中安装的Oracle11g没有发现有图形管理用户,也能不好重建OEM,就戒指跳过了使用图形界面的方式来管理用户等操作了,直接使用命令的方式来操作;
转自:https://blog.csdn.net/ly510587/article/details/95459299
oracle数据库的权限系统分为系统权限与对象权限。
- 系统权限( database system privilege )
可以让用户执行特定的命令集。例如,create table权限允许用户创建表,grant any privilege 权限允许用户授予任何系统权限。
- 对象权限( database object privilege )
可以让用户能够对各个对象进行某些操作。例如delete权限允许用户删除表或视图的行,select权限允许用户通过select从表、视图、序列(sequences)或快照(snapshots)中查询信息。
## 1.登录系统管理员
> 先是打开sqlplus,
>
> 再输入 `sqlplus /nolog` 或 `connect / as sysdba` 或 `system/as sysdba`
## 2.创建、删除、修改用户
> 创建用户:----
>
> ```sql
> create user username identified by password;
> ```
>
> 例如:
>
> ```sql
> alter user user1 identified by 234556;
> ```
>
> ---
>
> 删除用户:----
>
> ```sql
> drop user user1;
>
> ```
>
> 修改用户:----
>
> ```sql
> alter user user1 identified by 234556;
> ```
## 3.授权、撤销授权
oracle提供三种标准角色(role):connect/resource和dba.
connect role(连接角色)
> 临时用户,特指不需要建表的用户,通常只赋予他们connect role.
>
> connect是使用oracle简单权限,这种权限只对其他用户的表有访问权限,包括select/insert/update和delete等。
> 拥有connect role 的用户还能够创建表、视图、序列(sequence)、簇(cluster)、同义词(synonym)、回话(session)和其他 数据的链(link)。
resource role(资源角色)
> 更可靠和正式的数据库用户可以授予resource role。
>
> resource提供给用户另外的权限以创建他们自己的表、序列、过程(procedure)、触发器(trigger)、索引(index)和簇(cluster)。
dba role(数据库管理员角色)
> dba role拥有所有的系统权限
>
> 包括无限制的空间限额和给其他用户授予各种权限的能力。
---
为用户授权:
```sql
grant connect, resource to user1;
```
撤销用户权限:
```sql
revoke connect, resource from user;
```
## 4.常用查询
> 1.查看所有用户:
> select * from dba_users;
> select * from all_users;
> select * from user_users;
>
> 2.查看用户或角色系统权限(直接赋值给用户或角色的系统权限):
> select * from dba_sys_privs;
> select * from user_sys_privs;
>
> 3.查看角色(只能查看登陆用户拥有的角色)所包含的权限
> sql>select * from role_sys_privs;
>
> 4.查看用户对象权限:
> select * from dba_tab_privs;
> select * from all_tab_privs;
> select * from user_tab_privs;
>
> 5.查看所有角色:
> select * from dba_roles;
>
> 6.查看用户或角色所拥有的角色:
> select * from dba_role_privs;
> select * from user_role_privs;
>
> 7.查看哪些用户有sysdba或sysoper系统权限(查询时需要相应权限)
> select * from V$PWFILE_USERS
>
> 比如我要查看用户 wzsb的拥有的权限:
> SQL> select * from dba_sys_privs where grantee='WZSB';
>
> GRANTEE PRIVILEGE ADMIN_OPTION
>
> ------------------------------ ---------------------------------------- ------------
>
> WZSB CREATE TRIGGER NO
> WZSB UNLIMITED TABLESPACE NO
>
> ==========
>
> 比如我要查看用户 wzsb的拥有的角色:
> SQL> select * from dba_role_privs where grantee='WZSB';
>
> GRANTEE GRANTED_ROLE ADMIN_OPTION DEFAULT_ROLE
>
> ------------------------------ ------------------------------ ------------ ------------
>
> WZSB DBA NO YES
>
> ==========
>
> 查看一个用户所有的权限及角色
> select privilege from dba_sys_privs where grantee='WZSB'
> union
> select privilege from dba_sys_privs where grantee in
> (select granted_role from dba_role_privs where grantee='WZSB' );
# 三、SQL语句 -- 查询
> SQL语句分为三种类型:
>
> DML: Data Manipulation Language数据操纵语言
>
> DDL: Data Definition Language数据定义语言
>
> DCL: Data Control Language数据控制语言
DML用于查询与修改数据记录,包括如下SQL语句:
- INSERT:添加数据到数据库中
- UPDATE:修改数据库中的数据
- DELETE:删除数据库中的数据
- SELECT:选择(查询)数据
- SELECT是SQL语言的基础,最为重要。
DDL用于定义数据库的结构,比如创建、修改或删除数据库对象,包括如下SQL语句:
- CREATE TABLE:创建数据库表
- ALTER TABLE:更改表结构、添加、删除、修改列长度
- DROP TABLE:删除表
- CREATE INDEX:在表上建立索引
- DROP INDEX:删除索引
- ....
DCL用来控制数据库的访问,包括如下SQL语句:
- GRANT:授予访问权限
- REVOKE:撤销访问权限
- COMMIT:提交事务处理
- ROLLBACK:事务处理回退
- SAVEPOINT:设置保存点
- LOCK:对数据库的特定部分进行锁定
- ....
---
---
## 1.简单查询
基本的查询语句框架:
```sql
select .... from ....;
```
**数字和日期**可以使用的算术运算符:
| 操作符 | 描述 |
| ------ | ---- |
| + | 加 |
| - | 减 |
| * | 乘 |
| / | 除 |
**空值不同于0或空格,凡是空值参与的运算,结果都为空值(null)**
**空值不同于0或空格,凡是空值参与的运算,结果都为空值(null)**
### 1.取别名
给查询的结果取别名,有三中方式:
- 直接在要查询的字段后面加上想要取的别名,注意,字段和别名之间要有空格;
- 在字段后面加上as和别名,注意,字段、as和别名之间要有空格;
- 这种方式也是前面两种方式的改变,因为在Oracle中,默认是将所有的表名、字段名等转换成大写的,但是我们想要的别名是小写,前面的两种方式就不能解决了,方法:直接给别名加上引号即可,这样设置的别名是什么,结果就是什么了;
- 若查询结果中的字段是由多个单词组成的,那么我们也是要用引号把单词括起来;
> 取个例子:
>
> ```sql
> select id, name as na, name "na" from account;
> ```
>
> ID NA na
> \---------------------
> 21fjj jiodf jiodf
> djoi32 wwwj wwwj
============
### 2.连接符
把列与列,列与字符连接在一起;用 `||` 表示;作用:可以用来“合成”列;
类似在java中字符串的拼接;
作用:查询到的结果都是用一列一列来表示的,那么能不能够让多个结果列合成一个列显示出来那?
> ```sql
> select id || '---' || name as na from account;
> ```
>
> na
> \---------------------
> 21fjj---jiodf
> djoi32---wwwj
===========
### 3.字符串
- 字符串可以是 SELECT 列表中的一个字符、数字、日期
- 日期和字符只能在**单引号**中出现。
- 每当返回一行时,字符串被输出一次。
> select id || '2020-2-15' || name as na from account;
### 4.重复行
默认情况下,查询会返回全部行,包括重复行。
若想去除掉重复的数据,可以使用 **distinct** 关键字:
> select distinct id from account;
### 5.按条件查询
> 基本框架:
>
> select count from account where count > 300;
> select count,name from account where name = 'wwj';
#### 1.字符和日期
- 字符和日期要包含在**单引号**中。
- **字符`大小写敏感`,日期格式敏感**。
- 默认的日期格式是 DD-MON月-RR-->: 7-6月-1996
> select count,name from account where date = '7-6月-1996';
>
> --可以使用一个函数来给时间格式化:
>
> select count,name from account where to_char(myDate, 'yyy-mm-dd')= '1990-2-1';
> select count,name from account where to_char(myDate, 'yyy')= '1990';
>
> select count,name from account where to_char(myDate, 'yyy-mm-dd') between '1908-2-2' and '1990-2-1';
#### 2.比较符运算符
> 操作符 含义
>
> = 等于(不是==)
> \> 大于
> \>= 大于、等于
> < 小于
> <= 小于、等于
> <> 不等于(也可以是!=)
> := 赋值符号
> BETWEEN ...AND... 在两个值之间(包含边界)
> IN(...) 等于值列表中的一个
> LIKE 模糊查询
> IS NULL 空值
>
> -----
> select count from account where count between 300 and 5000;
> select count from account where count >= 300 and count <= 5000;
>
> select * from account where id = 1 or id = 3;
> select * from account where id IN(1,3);
>
> select * from account where name LIKE '%j%';
> select * from account where name LIKE '%d\_';
> select * from account where name LIKE '%d\\_' escape '\\'; --说明:使用关键字和转义符将通配符符号的作用取消
>
> select * from account where name is NULL;
> select * from account where name is NOT NULL;
#### 3.逻辑运算符
> 操作符 含义
>
> and 逻辑并
> or 逻辑或
> Not 逻辑否
### 6.排序
- 使用 ORDER BY 子句排序
- **ASC**( ascend):**升序**
- **DESC**( descend):**降序**
- ORDER BY 子句在 SELECT 语句的**结尾**。
- 可以有多层排序,只用在后面使用逗号隔开,并指定每一层的排序规则;
> select * from account order by id DESC;
> select * from account where count > 100 order by count ASC;
> select * from account order by id DESC,name asc; // 先是按数量降序排序,再按名字升序排序
---
## 2.单行函数
单行函数:
- 操作数据对象
- 参数返回一个结果
- **只对一行进行变换**
- **每行返回一个结果**
- 可以转换数据类型
- 可以嵌套
- 参数可以是一列或一个值
多行函数:
- 既是查询到的多行结果集,但是只返回一个结果
目标:
- 在 SELECT语句中使用字符,数字,日期和**转换函数**以及通用函数
- 使用**条件表达式**
### 1.字符函数
#### 1.大小写控制函数
作用:因为Oracle默认是大小写敏感的,所以当我们在写查询条件的时候,不知道是要写小写还是大写,也许就是因为大小写这个问题导致查询不出结果;
> select * from account where lower(name) LIKE '%j%'; -- 这是将字段name的所有结果转换成小写,再和我们定义的查询条件进行比较;
>
> select * from account where upper(name) LIKE '%J%'; -- 这是将字段name的所有结果转换成大写,再和我们定义的查询条件进行比较;
#### 2.字符控制函数
> concat('hello', 'world') helloworld // 连接字符
> substr('helloworld',1,5) hello // 从1开始,输出5个
> lengte('helloworld') 10 // 返回字符串的个数
> instr('helloworld','w') 6 // 判断指定字符出现的位置
> lpad(salary,10,'\*') \*\*\**\*24000 //
> rpad(salary,10,'\*') 24000\*\*\*\*\*
> trim('H' from 'Helloworld') elloworld // 去除收尾指定的字符
> replaace('abcd','b','m') amcd // 替换所有符合的字符
>
> ----
### 2.数字函数
**四舍五入:round()**:
> select round(435.467,2) from dual; 结果:435.47
> 取小数点后两位,进行四舍五入
>
> select round(435.467) from dual; 结果:435
> 取小数点,进行四舍五入
>
> select round(435.467,-2) from dual; 结果:400
> 取小数点前两位,进行四舍五入
>
> ---
**截断: trunc()**:
> select trunc(435.467,2) from dual; 结果:435.46
> 从小数点后两位截断,不进行四舍五入
>
> select trunc(435.467) from dual; 结果:435
> 从小数点截断,不进行四舍五入
>
> select trunc(435.467,-1) from dual; 结果:430
> 从小数点前一位截断,不进行四舍五入
>
> ---
**取余:mod()**:
> select mod(1100,300) from dual; 结果:200
---
---
### 3.日期函数
Oracle中的日期型数据实际含有两个值:**日期和时间**。
#### 1.日期的数学运算
- 在日期上加上或减去一个数字结果仍为日期。
- 两个日期相减返回日期之间相差的**天数**。
- 日期之间不允许做加法运算,无意义
- 可以用数字除24来向日期中加上或减去天数。
自定义日期格式,可以使用 **to_char(myDate, 'yyy-mm-dd hh-mi-ss)** 函数;可以看条件查询的字符和日期节点;
| 函数 | 描述 |
| -------------- | -------------------------------- |
| months_between | 两个日期相差的月数 |
| add_months | 向指定日期中加上若干月数 |
| next_day | 指定日期的下一个星期* 对应的日期 |
| last_day | 本月的最后一天 |
| round | 日期四舍五入 |
| trunc | 日期截断 |
> select months_between(sysdate, mydate) from dual; //结果是相差的约束
>
> select sysdate, add_months(sysdate, 3) from dual; //当前日期加3个月
>
> select sysdate, next_day(sysdate, '星期三') from dual; // 下个星期三对应日期
>
> select sysdate, last_day(sysdate)-1 from dual; // 本月的倒数第二天
>
> select sysdate, round(sysdate,'month|year|mm|...')-1 from dual;
---
### 4.转换函数
#### 1.隐式
自动完成数据类型的转换;
dae <--> varcha2/char <--> number
#### 2.显式
> <-- to_date <-- to_char
>
> date <------------> character <------------> number
> to_char --> to_unmber -->
> select * from dual where to_char(myDate, 'yyyy-mm-dd')= '1990-2-1';
>
> select * from dual where to_char(myDate, 'yyyy"年"mm"月"dd"日"')= '1990年2月1日';
>
> select * from dual where to_date('1990-2-1', 'yyyy-mm-dd')= myDate;
>
> // to_char; `0`表示零,`9`表示数字;`$`表示美元符,`L`表示本地货币符号;`.`表示小数点;`,`表示千位符;
>
> select to_date(345432234.4234, '999,999,999,999.999') from dual;
> select to_date(345432234.4234, '$000,000,000,000.000') from dual; 美元
> select to_date(345432234.4234, 'L000,000,000,000.000') from dual; 本地
>
> // to_unmber -- 将字符转换成数字再做运算
>
> select to_unmber('L345432234.4234', '999,999,999,999.999') + 8 from dual;
----
### 5.通用函数
这些函数**适用于任何数据类型,同时也适用于空值**:
- nvl(expr1,expr2)
- nvl2(expr1,expr2,expr3)
- nullif(expr1,expr2)
- coalesce(expr1,expr2,....,exprn)
**nvl函数**:
- 当要查询的值为null是,将空值转换成一个已知的值:
- 可以使用的数据类型有日期、字符、数字。
- 函数的一般形式:
- nvl(nullZhi,0)
- nvl(nullZhi,'erwe')
- nvl(nullZhi,'01-JAN-97')
> select numbetOne+nvl(numberTwo,0) as number from mytable;
**nvl2(expr1,expr2,expr3)函数**:
- 和nvl函数相似,当expr1不为null时,返回expr2;为null时,返回expr3;
**nullif(expr1,expr2)**:
- 相等返回null,不等返回expr1;
**coalesce(expr1,expr2,....,exprn)**:
- COALESCE与NVL相比的优点在于 COALESCE可以同时处理交替的多个值。
- 如果第一个表达式为空,则返回下一个表达式,对其他的参数进行 COALESCE
### 6.条件表达式
- 在SQL语句中使用IF-THEN-ELSE逻辑
- 使用两种方法
- CASE表达式
- DECODE函数
#### 1.case表达式
```sql
case expr when comparison1 then return_expr1
[when comparison2 then return_expr2
when comparison3 then return_expr3
else else_expr]
end
```
例子:
> 练习:查询部门号为10.20,30的员工信息,若部门号为10.则打印其工资的1.1倍,20号部门.则打印其工资的12倍,30号部门打印其工资的1.3倍数;
>
> ```sql
> select id,name,case department_id when 10 then salary * 1.1
> when 10 then salary * 1.1
> when 20 then salary * 1.2
> else salary * 1.3 end as new_salary
> from emp
> where department_id in (10,20,30);
> ```
---
#### 2.DECODE函数
> 上面case表达式的例子:
>
> ```sql
> select id,name,decode(department_id,10,salary*1.1,20,salary*1.2,salary*1.3) as new_salary
> from emp
> where department_id in (10,20,30);
> ```
---
---
## 3.多表查询
目标:
- 使用**等值**和**不等值**连接在 SELECT语句中查询多个表中的数据。
- 使用**自连接**。
- 使用**外连接**查询不满足连接条件的数据。
**笛卡尔集**:(就是查询结果为多个表的记录总数相乘)
- 笛卡尔集会在下面条件下产生:
- 省略连接条件
- 连接条件无效
- 所有表中的所有行互相连接
- 为了避免笛卡尔集,可以在 WHERE加入**有效**的连接条件。
### 1.等值连接
> select a.id,a.name,a.count,e.name,e.par
> from account a,emp e
> where a.emp_id = e.id;
**连接n个表,至少需要n-1个连接条件。例如:连接三个表,至少需要两个连接条件**。
### 2.外连接
内连接:合并具有同一列的两个以上的表的行,**结果集中不包含一个表与另一个表不匹配的行**;
外连接:两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行,这种连接称为左(或右)外连接。没有匹配的行时,结果表中相应的列为空(ULD).外连接的 WHERE子句条件类似于内部连接,但连接条件中没有匹配行的表的列后面要加外连接运算符,即用圆括号括起来的加号(+).
> 左外连接
>
> select a.id,a.name,a.count,e.name,e.par
> from account a,emp e
> where a.emp_id = e.id(+);
>
> 结果:返回account表中的所有结果集,即使emp表的id值为null
> 右外连接
>
> select a.id,a.name,a.count,e.name,e.par
> from account a,emp e
> where a.emp_id(+) = e.id;
### 3.自然连接
- NATURAL JOIN子句,**会以两个表中具有相同名字的列为条件创建等值连接**。
- 在表中查询满足等值条件的数据。
- 如果只是列名相同而**数据类型不同**,则会产生错误。
> select id,name,count,parname,par
> from account natural join emp
>
> 结果:上面连接是以id作为连接点;
>
> 自然连接的优缺点:优点是自动查询多个表的相同字段作为连接点;缺点是作为连接点的字段必须是名字、类型相同,而且还要确定多个表中相同的字段有多少个,若有多个相同的字段,则会进行多次判断查询;
>
> 既然有问题,那就要解决问题了,在连接中,既使有多个字段相同,但我们也是可以指定要连接的字段的:
>
> select id,name,count,parname,par
> from account join emp
> using(id);
>
> 不过使用这中方式还是不怎么保险,可以使用下面的几种方式;
>
> ---
自然连接除了上面的有局限性的连接方式外,还具有等值连接、外连接的功能;
#### 1.等值连接
> select a.id,a.name,a.count,e.name,e.par
> from account a join emp e
> on a.emp_id = e.id
> join car c
> on e.carId = c.id;
#### 2.外连接
> 左外连接
>
> select a.id,a.name,a.count,e.name,e.par
> from account a left outer join emp e
> on a.emp_id = e.id;
> 右外连接
>
> select a.id,a.name,a.count,e.name,e.par
> from account a right outer join emp e
> on a.emp_id = e.id;
> 满外连接(有左有右)
>
> select a.id,a.name,a.count,e.name,e.par
> from account a full outer join emp e
> on a.emp_id = e.id;
#### 3.自表连接
也就是把一个表当成是多个表来写连接信息;
## 4.分组函数
分组函数就是多行函数;
**分组函数作用于一组数据,并对一组数据返回一个值**。
目标:
- 了解组函数。
- 描述组函数的用途。
- 使用 `GROUP BY` 子句对数据分组。
- 使用 `HAVING` 子句过滤分组结果集
### 1.组函数
> avg 平均值 ---返回值不为空的记录;
> count 总数---返回值不为空的记录;
> max 最大值
> min 最小值
> stddev 方差(标准差)
> sum 求和
>
> 可以使用nvl函数使分组函数无法忽略空值:nvl(expr,1/0/*)
**distinct 关键字**:
- count(distinct expr) -- 返回expr非空且不重复的记录总数
### 2.GROUP BY
> 例子:求出emp表中各部门的平均工资:
>
> select empId,avg(salary)
> from emp
> group by empId;
> 例子:求出emp表中各部门的不同工种的平均工资:
>
> select empId,jobId,avg(salary)
> from emp
> group by empId,jobId;
总结:select要查询的列,只要不是函数,就应该出现相爱group by 子句中;反过来说,出现在group by 子句中的可以不出现在select查询的列中;所有包含于 SELECT列表中,而未包含于组函数中的列都必须包含于 GROUP BY子句中。
**不能在 WHERE子句中使用组函数。**
**可以在 HAVING子句中使用组函数。**
### 3.HAVING
> 例子:求出emp表中各部门中平均工资大于6000的部门,以及其平均工资:
>
> select empId,avg(salary)
> from emp
> group by empId
> having avg(salary) > 6000;
**不能在 WHERE子句中使用组函数。**
**可以在 HAVING子句中使用组函数。**
having子句相当于给分组添加条件;
---
## 5.子查询
目标:
- 描述子查询可以解决的问题。
- 定义子查询。
- 列出子查询的类型。
- 书写单行子查询和多行子查询。
> select select_list
> from table1
> where expr operator (
> select select_list2
> from table2)
>
> 总结:
>
> - 子查询(内查询)在主查询之前一次执行完成;
> - 子查询的结果被主查询(外查询)使用。
注意事项:
- **子查询要包含在括号内。**
- **将子查询放在比较条件的右侧。**
- 单行操作符对应单行子查询,多行操作符对应多行子查询。
### 1.子查询的类型
**单行子查询**:子查询只返回一条记录;
- 单行子查询使用的比较符:`=、>、>=、<、<=、<>`
- 若要使用分组函数进行判断条件的话,则使用having函数
**多行子查询**:子查询返回多条记录;
- 使用多行比较操作符:`in、 any、 all`
- in ---含义:等于列表中的**任意一个**
- any ---含义:和子查询返回的**某一个**值比较
- all ---含义:和子查询返回的**所有值**比较
> 多行比较操作符案例:-------
>
> 返回其它部门中比 job_id为'T_PROG'部门**任一**工资低的员工的员工号、姓名、 job_id以及 salary
>
> select id,name,job_id,salary
> from emp
> where job_id <> 'T_PROG' and salary < any (
> select salary
> from emp
> where job_id = 'T_PROG')
---
---
# 四、SQL语句 -- 创建和管理表
> SQL语句分为三种类型:
>
> DML: Data Manipulation Language数据操纵语言
>
> DDL: Data Definition Language数据定义语言
>
> DCL: Data Control Language数据控制语言
DML用于查询与修改数据记录,包括如下SQL语句:
- INSERT:添加数据到数据库中
- UPDATE:修改数据库中的数据
- DELETE:删除数据库中的数据
- SELECT:选择(查询)数据
- SELECT是SQL语言的基础,最为重要。
DDL用于定义数据库的结构,比如创建、修改或删除数据库对象,包括如下SQL语句:
- CREATE TABLE:创建数据库表
- ALTER TABLE:更改表结构、添加、删除、修改列长度
- DROP TABLE:删除表
- CREATE INDEX:在表上建立索引
- DROP INDEX:删除索引
- ....
DCL用来控制数据库的访问,包括如下SQL语句:
- GRANT:授予访问权限
- REVOKE:撤销访问权限
- COMMIT:提交事务处理
- ROLLBACK:事务处理回退
- SAVEPOINT:设置保存点
- LOCK:对数据库的特定部分进行锁定
- ....
---
目标:
- 描述主要的数据库对象
- 创建表
- 描述各种数据类型
- 修改表的定义
- 删除,重命名和清空表
## 1.数据库对象
| 对象 | 描述 |
| --------- | -------------------------------- |
| 表-table | 基本的数据存储集合,由行和列组成 |
| 视图-view | 从表中抛出的逻辑上相关的数据集合 |
| 序列 | 提供有规律的数值 |
| 索引 | 提高查询的效率 |
| 同义词 | 给对象起别名 |
表:
- 用户定义的表:
- 用户自己创建并维护的一组表
- 包含了用户所需的信息
- 如, SELECT FROM user tables;查看用户创建的表
- 数据字典:
- 由 Oracle Server自动创建的一组表
- 包含数据库信息
## 2.创建表