1、准备
1.1、SQL*Plus回顾
1.1.1、配置客户端
1.安装oracle客户端。
2.在$ORACLE_HOME/network/admin/tnsnames.ora(客户端安装目录)这个文件中登记你要链接的数据库。
3.或者不配置tnsnames.ora远程连接到远程服务器,见连接数据库的第二种方法。
1.1.2、连接数据库
下面几种方式通过sqlplus窗口连接到数据库,如果不想显示登陆到数据库后的提示可以加上/nolog选项
sqlplus username/password@ora11r2.
sqlplus username@ora11r2,然后输入密码。
sqlplus /nolog,然后connect username/password@ora11r2.
sqlplus /nolog,然后connect jusername@ora11r2.
exit退出。
注意:ora11r2就是你在tnsnames.ora里面配置的名称。
下面是不需要配置tnsnames.ora文件的连接方法:还有一种在plsql里面配置database那个选项的配置:192.168.1.6:1521/VP VP为远程数据库的SID,这样本地tnsnames.ora就不需要配置了
plsql连接:在plsql里面配置database那个选项的配置dbhost:1521/SID。
sqlplus连接:sqlplus username/password@//dbhost:1521/SID
1.1.3、配置sqlplus环境
在sql>命令提示符下输入help index
查看所有命令,输入help 命令
查看命名详细用法,例如set命令定制环境基本命令。
值得注意的是你配置的环境当你关闭或者退出时这些设置就失效了,如何才能长久生效呢?那么先要理解sqlplus启动读取的文件顺序:启动时它默认会读取两个文件,$ORACLE_HOME/sqlplus/admin下的gloin.sql,如果找到这个文件就会读取进来,文件中命令也会执行;在读取万glogin文件后会再去读取login.sql文件,这个文件必须在sqlplus启动文件夹中或者包含在环境变量SQLPATH所指向的文件夹中,login.sql命令会覆盖glogin.sql命令,所以你可以创建一个login.sql文件,或者在上面文件中添加内容,例如:SET LINES 3000
sqlplus中语句后面加;然后回车执行,或者/回车;
1.2、SQL基础
1.2.1、select语句执行顺序
顺序 | 关键字 | 语句 | 扩展 |
---|---|---|---|
5 | SELECT | c.customer_id,count(o.order_id) as orders_ct | |
1 | FROME | oe.customers c | |
1.1 | 或者FROME | oe.customers c | join oe.orders o on c.customer_id=o.customer_id |
2 | WHERE | c.gender=’F’ | |
3 | GROUP BY | c.customer_id | |
4 | HAVING | count(o.order_id)>4 | |
6 | ORDER BY | orders_ct,c.customer_id |
很明显,oracle处理过程并不是按照顺序来的,一个处理语句分为很多小过程,你可以想象成每一个小过程步骤都会生成一个临时的数据集,下一个过程步骤会针对上一个过程步骤产生的临时数据集进一步做处理,直至产生最终的结果。
一般查询语句处理过程:
FROME子句(或者如上1.1的联接类型的FROME子句)-->WHERE子句-->GROUP BY子句-->HAVING子句-->SELECT子句-->ORDER子句
所以我们可以根据oracle逻辑处理方式来优化我们的sql语句,首先能最大成都过滤掉很大部门的条件让它先执行。
1.2.2、insert语句
- 格式:
insert into tableName(name1,name2)values(value1,value2)
注意:如果插入表中定义的所有的值,则列的列表可以省略,否则列的列表不能省略。
- 查询插入:
insert into scott.bonus(ename,job,scal) select ename,job,scal*10 from scott.emp
- 多表插入
insert all when orders<1000 then into small_customers when orders<10000 then into big_customers else into middle from orders
1.2.3、update与delete
- update格式
update tableName/sql set key=value/sql where key1=value1/sql
- delete格式
delete from tableName/sql where key=value/sql
1.2.4、merge语句
在进行SQL语句编写时,我们经常会遇到大量的同时进行Insert/Update的语句 ,也就是说当存在记录时,就更新(Update),不存在数据时,就插入(Insert)。
- merge格式
MERGE INTO tableName alias1
USING table/view/sql alias2 ON condition
WHEN MATCHED THEN updateSql
WHEN NOT MACHED THEN insertSql
在alias2中Select出来的数据,每一条都跟alias1进行 ON (join condition)的比较,如果匹配,就进行更新的操作(Update),如果不匹配,就进行插入操作(Insert)。因此,严格意义上讲,在一个同时存在Insert和Update语法的Merge语句中,总共Insert/Update的记录数,就是Using语句中alias2的记录数。
例子:
MERGE INTO copy_emp c
USING employees e
ON (c.employee_id=e.employee_id)
WHEN MATCHED THEN
UPDATE SET
c.first_name=e.first_name,
c.last_name=e.last_name,
c.department_id=e.department_id
WHEN NOT MATCHED THEN
INSERT VALUES(e.employee_id,e.first_name,e.last_name,
e.email,e.phone_number,e.hire_date,e.job_id,
e.salary,e.commission_pct,e.manager_id,
e.departmetn_id);