??xml version="1.0" encoding="utf-8" standalone="yes"?>
?D:\Program Files\IBM\Rational\SDP\6.0\rationalsdp.exe" -data E:\EE-workspace\1600
]]>
]]>
import javax.servlet.http.*;
import java.io.*;
public abstract class HttpFilter implements Filter
{
private FilterConfig config;
//////////////////////////////////
public void init(FilterConfig config) throws ServletException
{
this.config = config;
init();
}
public void init() throws ServletException
{
}
///////////////////////////////
public FilterConfig getFilterConfig()
{
return config;
}
public String getInitParameter(String name)
{
return config.getInitParameter(name);
}
public ServletContext getServletContext()
{
return config.getServletContext();
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException
{
doFilter((HttpServletRequest)request, (HttpServletResponse)response, chain);
}
public abstract void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws IOException, ServletException;
public void destroy()
{
}
}
一.JDBC原理概述
1QJDBC是一套协议,是JAVA开发h员和数据库厂商达成的协议Q也是由Sun定义一l接口,由数据库厂商来实玎ͼq规定了JAVA开发h员访问数据库所使用的方法的调用规范?/p>
2QJDBC的实现是由数据库厂商提供Q以驱动E序形式提供?/p>
3QJDBC在用前要先加蝲驱动?/p>
JDBC对于使用者要有一致性,对不同的数据库其使用Ҏ都是相同的?/p>
驱动开发必要实现Driver接口?/p>
数据库驱动的实现方式
JDBC-ODBC桥接?/p>
JDBC|络驱动Q这U方式是通过中间服务器的协议转换来实现的
JDBC+本地驱动Q这U方式的安全性比较差?/p>
JDBC驱动Q由数据库厂商实现?/p>
?JDBC的API
java.sql包和javax.sql?/p>
Driver接口(驱动),在加载某一 Driver cLQ它应该创徏自己的实例ƈ?DriverManager 注册该实例。这意味着用户可以通过调用以下E序加蝲和注册一个驱动程?
Class.forName("oracle.jdbc.driver.OracleDriver")
DriverManagerc(驱动理器)Q它可以创徏q接Q它本n是一个创建Connection的工?Factory)?/p>
Connection接口Q会Ҏ不同的驱动生不同的q接
Statement接口Q发送sql语句
ResultSet接口Q结果集Q,是用来接收select语句q回的查询结果的。其实质cM于集合?/p>
下午:
?JDBC应用步骤
1Q注册加载一个driver驱动
2Q创建数据库q接QConnectionQ?/p>
3Q创Z个StatementQ发送sqlQ?/p>
4Q执行sql语句
5Q处理sqll果Qselect语句Q?/p>
6Q关闭Statement
7Q关闭连接Connection?/p>
注意Q?Q?两个步骤势必要做的Q因些资源是不会自动释放的,必须要自己关?/p>
讉KOracle的数据库的驱动名字叫ojdbc14.jar,要用这个驱动程序,要先他加到环境变量CLASSPATH中?/p>
注册加蝲驱动driverQ也是强制cd?/p>
Class.forName(Driver包名.Drivercd)?/p>
Driver d=new Driverc?);//注意:q个Ҏ不能用参数来构?/p>
DriverManager.registerDriver(d);
Oracle的Driver的全名oracle.jdbc.driver.OracleDriver
mysql的Driver的全名com.mysql.jdbc.Driver
SQLServer的Driver的全名com.microsoft.jdbc.sqlserver.SQLServerDriver
创徏q接
DriverManager.getConnection(String url,String username,String password);
Connectionq接是通过DriverManager的静态方法getConnection(.....)来得到的Q这个方法的实质是把参数传到实际的Driver中的connect()Ҏ中来获得数据库连接的?/p>
Oracle的URL值是p接数据库的协议和数据库的IP地址及端口号q有要连接的数据库的库名QDatebaseNameQ?/p>
Oracle URL的格?/p>
jdbc:oracle:thin:Q协议)@XXX.XXX.X.XXX:XXXXQIP地址及端口号Q?XXXXXXXQ所使用的库名)
例:jdbc:oracle:thin:@192.168.0.20:1521:tarenadb
MySql URL的写?/p>
例: jdbc:mysql://localhost:3306/tarena
SQLServer URL的写?/p>
例:jdbc:microsoft:sqlserver://localhost:1433/test
java -Djdbc.drivers=驱动的完整类?/p>
使用虚拟机参?加蝲驱动 -D表示拟机参数赋?/p>
java -Djdbc.drivers=oracle.jdbc.driver.OracleDriver:com.mysql.jdbc.Driver
?JDBC基本Ҏ
DriverManager:如果有多个驱动可用的?DriverManager会选择其中一?
Driver:可以选择固定的驱?/p>
Driver driver = new oracle.jdbc.driver.OracleDriver();
String user = "sd0613";
String password = "sd0613";
Properties prop = new Properties();
prop.setProperty("user",user);
prop.setProperty("password",password);
driver.connect(url,properties);
executeQuery(sqlString);//q回l果?/p>
executeUpdate(sqlString);//q回gؓ该次操作影响的记录条?create tableq回0
execute(sqlString);
//适用于不知道具体的操作是什?q回值是booleancd?/p>
//如果q回值是true,代表执行查询操作;否则代表执行更新操作.
ResultSet
next()Ҏ:
1.判断是否存在下一条记?/p>
2.游标移向下一条记录 ?
getXXX(字段名或字段序号)//注意:字段序号?开?/p>
关闭问题:
使用Connection对象获得一个StatementQStatement中的executeQuery(String sql) Ҏ可以使用select语句查询Qƈ且返回一个结果集 ResultSet通过遍历q个l果集,可以获得select语句的查询结果,ResultSet的next()Ҏ会操作一个游标从W一条记录的前边开始读取,直到最后一条记录。executeUpdate(String sql) Ҏ用于执行DDL和DML语句Q可以updateQdelete操作?/p>
注意Q要按先ResultSetl果集,后StatementQ最后Connection的顺序关闭资源,因ؓStatement和ResultSet是需要连接时才可以用的Q所以在使用l束之后有可能其他的Statementq需要连接,所以不能先关闭Connection?br />
1.回忆下昨天的一些JDBC的配|?br /> (1) 驱动Q ?
ojdbc14.jar (Oracle)
mysql-connector-java-3.1.11-bin.jar(MySql)
(2) 实现了Driver接口的驱动类(E序中要加蝲的类)Q?br /> jdbc.oracle.driver.OracleDriver (Oracle)
com.mysql.jdbc.Driver (MySql)
(3)q接数据库的URL
jdbc:oracle:thin:@192.168.0.24:1521:tarena (Oracle)
jdbc:mysql://192.168.0.24:3306/test (MySql)
2.PreparedStatement概述
SQL语句传到数据库后Q数据库会先对其~译再执行。在使用StatementӞ如果要执行一l类似的SQL操作Ӟq样做效率很低,而且把不同类型的数据直接写在SQL语句中是比较ȝ的。这时应该用PreparedStatement来代替StatementQPreparedStatement 接口l承 StatementQƈ和他在两斚w有所不同Q?br /> (1)PreparedStatement 实例包含已编译的 SQL 语句。这是使语句先“准备好”。包含于 PreparedStatement对象中的SQL 语句可具有一个或多个 IN 参数。IN参数的值在 SQL 语句创徏时未被指定。相反的Q该语句为每?IN 参数保留一个问P?”)作ؓ占位W。每个问L值必d该语句执行之前,通过适当的setXXX Ҏ来提供?br /> (2)׃ PreparedStatement 对象已预~译q,所以其执行速度要快?Statement 对象。因此,多次执行?SQL 语句l常创徏?PreparedStatement 对象Q以提高效率?br />
作ؓ Statement 的子c,PreparedStatement l承?Statement 的所有功能。另外它q添加了一整套ҎQ用于设|发送给数据库以取代 IN 参数占位W的倹{同Ӟ三种Ҏ execute()?executeQuery() ?executeUpdate() 已被更改以之不再需要参数。这些方法的 Statement 形式Q接?SQL 语句参数的Ş式)不应该用?PreparedStatement 对象?/p>
3.创徏 PreparedStatement 对象
以下的代码段Q其?con ?Connection 对象Q创建包含带两个 IN 参数占位W的 SQL 语句?PreparedStatement 对象Q?br /> PreparedStatement pstmt = con.prepareStatement("UPDATE table4 SET m = ? WHERE x = ?");
pstmt 对象包含语句 "UPDATE table4 SET m = ? WHERE x = ?"Q它已发送给DBMSQƈ~译好ؓ执行作好了准备?/p>
4.传?IN 参数
在执?PreparedStatement 对象之前Q必设|每?? 参数的倹{这可通过调用 setXXX Ҏ来完成,其中 XXX 是与该参数相应的cd。例如,如果参数hJava cd longQ则使用的方法就?setLong。setXXX Ҏ的第一个参数是要设|的参数的序C|??开?Q第二个参数是设|给该参数的倹{例如,以下代码第一个参数设?123456789Q第二个参数设ؓ 100000000Q?br /> pstmt.setLong(1, 123456789);
pstmt.setLong(2, 100000000);
5.ResultSetMetaData
元数据是用来描述数据的数据,ResultSetMetaData是来描q结果集的列的类型和属性信息,比如可以通过它得到结果集的列敎ͼ列名{。具体可在API中查阅java.sql.ResultSetMetaData?br /> ResultSetMetaData对象可以通过ResultSet对象的getMetaData()来得到?br /> ResultSetMetaData对象有以下三个方法比较常用:
getColumnCount()Q获得实际列?br /> getColumnName(int colnum)Q获得指定列的列?br /> getColumnType(int colnum)Q获得指定列的数据类?Types里面的类?存放的是整数)
6.JDBC是持久层的技术,是JAVAq接数据库目前最通用的手Dc其他的持久层技术,比如接下来我们要学的HibernateQ底层也是由JDBC实现的。持久层是与业务无关的,具体的业务由业务层完成,当业务层需要和数据库进行交互时Q就需要通过持久层来操作?/p>
7.BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
׃System.in是字节流Q我们需要把他{成字W流。ƈ用BufferedReader包装后方便我们的操作?br />
8.Z区分表中不同的数据,我们要给攑օ表中持久化的每个对象都加上一个唯一的标识,q就是IDQID是与业务无关的。ID的生成方法有很多Q在Oracle数据库中我们一半利用Sequence来生成?/p>
9.d配置文gӞ我们采用Properties对象。它是HashTable的子c,它有个load(InputStream inStream) 的方法可以直接从输入中d属性列?键值对)。getProperty(String key) Ҏ用指定的键在此属性列表中搜烦倹{?/p>
1.Registering a driver
2.Establishing a connection to the datebase
3.Creating a statement
4.Executing a SQL
5.Processing the results
6.Closing down JDBC objects
JDBCW三?br />上午:
一.事务QTransactionQ?br />原子操作:不可再分的操?一个操作不能再分成比它更细的操作.
事务是针对原子操作的Q要求原子操作不可再分,q且必须同时成功同时p|?br />事务是把一些非原子操作,变成原子操作,由应用服务器来提?由数据库服务器来执行操作.
在JDBC中默认是自动提交?如果要想使用事务,需要按以下步骤执行:
1.要调用con.setAutoCommite(false)Ҏ(打开事务边界)Q把自动提交QcommitQ置为false?br />2.q行正常的数据库操作
3.如果操作成功了可以选择con.commit(),或者操作失败时选择con.roolback()------
Q回滚:数据恢复C前的情况Q?/p>
注意:打开事务p关闭自动提交,当不需要再使用事务的时候调?br />setAutoCommite(true).
事务性资源(监控完整性)
?事务q发产生的问?br /> 三种q发产生的后?
1Q脏?一个事务读取到了另外一个事务没有提交的数据。(Dirty ReadQ?br />2Q重复读:一个事务读取到了另外一个事务提交的数据。它是要保持在同一旉点上d到的数据相同Q希望在一D|间内的数据是不变的?br />3Q?一个事务读取到了另外一个事务提交的数据。用同样的操作读取两?得到的记录数不相同?/p>
?事务隔离U别
五种控制U别:
TRANSACTION_NONE不用事务?br />TRANSACTION_READ_UNCOMMITTED 允许脏读?br />TRANSACTION_READ_COMMITTED防止脏读Q最常用的隔ȝ?q且是大多数数据库的默认隔离U别----------------------
TRANSACTION_REPEATABLE_READ可以防止脏读和不可重复读Q?br />TRANSACTION_SERIALIZABLE可以防止脏读Q不可重复读取和q读Q(事务串行化)会降低数据库的效?
以上的五个事务隔ȝ别都是在ConnectioncM定义的静态常量,使用setTransactionIsolation(int level) Ҏ可以讄事务隔离U别?br />?con.setTransactionIsolation(Connection.REPEATABLE_READ);
下午:
?JDBC2.0新特?br />1.可滚动特性和可更新特?br />JDBC1.0中是指游标的Ud的方向和方式是单?单步(相对)Ud,功能比较?
JDBC2.0中游标可以双?相对或者绝对移?
可滚动结果集:q种l果集不但可以双向滚动,相对定位Q绝对定位,q且q可以修Ҏ据信息?/p>
1)滚动Ҏ?br />定位函数:aaa
boolean absolute(int row)Q定位到指定的记录位|。定位成功返回trueQ不成功q回false?br />void afterLast() Q把游标Ud到最后一条记录的后面(逻辑位置)?一定会有的
void beforeFirst() Q把游标Ud到第一条记录的前面(逻辑位置)?br />//׃W一条记录的前面和最后一条记录的后面q两个位|肯定存?所以无需判断是否存在,q回D为void.
boolean first()Q把游标定位到第一条记录,相对定位Q?br />boolean last()Q把游标定位到最后一条记录 ?也是相对的概c?/p>
//当结果集为空的时?q两个方法会q回false.
boolean next()Q此Ҏ是游标向下一条记录移动?br />boolean previous() Q此Ҏ可以使游标向上一条记录移动,前提是前面还有记录?/p>
boolean relative(int rows) Q相对定位方法,参数值可正可负,参数为正Q游标从当前位置向后Ud指定值条记录Q参Cؓ负,游标从当前位|向前移动指定值条记录?/p>
判断函数:
ifBeforeFirst()判断是否在在W一条记录之?
ifAfterLast()判断是否在在最后一条记录之?
ifFirst()判断是否为第一条记?
ifLast()判断是否为最后一条记?
要用可滚动l果集时Q需要一ơ设|更新特性与滚动Ҏ?不能分开.
1.更新Ҏ常?
CONCUR_READ_ONLY 只读l果集 ?(默认?
CONCUR_UPDATABLE 可更新结果集
2.滚动Ҏ常?
TYPE_FORWARD_ONLY Q该帔R表示指针只能向前Ud?ResultSet 对象的类型?默认)
双向滚动Q?br /> 不敏感:TYPE_SCROLL_INSENSITIVE Q该帔R指示可滚动但通常不受其他更改影响?ResultSet 对象的类型?
敏感的:TYPE_SCROLL_SENSITIVE Q该帔R指示可滚动ƈ且通常受其他更改媄响的 ResultSet 对象的类型?br />//敏感:数据库改?l果集改?
语法:
Statement st=null;
st=con.createStatement(ReusltSet.TYPE_SCROLL_INSENSITIVE,ResuleSet.CONCUR_UPDATABLE)
在创建Statement的时候就要指定这两个参数,使用Statement,W一个参C表滚动特性常?W二个代表更新特性常?/p>
----------------------------------------
2)可更新特?br />a.moveToInsertRow();记录当前游标位置,游标移到和l果集结构类似的~冲?
b.使用updateXxx(int column,columnType value)Ҏ来更新指定列数据;
c.使用insertRow() Ҏ插入记录Q加信结果集Q更?br />d.游标指回原位,moveToCurrentRow() ?/p>
2Q?步,可@?br />-----------------------------------------------------
能否使用JDBC2.0 ResultSet的新Ҏ,要看使用的数据库驱动是否支持.
q有只能用于单表且表中有主键字段Q可能会是联合主键)Q不能够有表q接Q会?br />可更新操作必L以下条?
a.查询只能引用一张表.
b.不能包含Mq接操作.
c.必须把完整的主键查到l果集里?
d.保证所有字Dؓ非空字段q且没有默认倹{?/p>
?数据库元数据:
DatabaseMetaData dbmd = con.getMetaData();//得到数据库元数据
dbmd.supportsResultSetConcurrency(ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_UPDATABLE);//判断是否支持可更新操?/p>
?扚w更新
优势:
1.节省传递时?br />2.q发处理
PreparedStatement:
1.addBatch() 一l参数添加到 PreparedStatement对象内部
2.executeBatch() 一批参数提交给数据库来执行Q如果全部命令执行成功,则返回更新计数组成的数组?/p>
Statement:
addBatch(String sql)Ҏ会在批处理缓存中加入一条sql语句
executeBatch()执行批处理缓存中的所有sql语句?/p>
注意QPreparedStatement中用批量更新时Q要先设|好参数后再使用addBatch()Ҏ加入~存?br />扚w更新中只能用更新或插入语句
//
Statement stm=con.createStatement(int resultSetType,int resultSetConcurrency);创徏的时候就要指明要什么样的结果集?br /> 先可滚,后可更新
boolean absolute (int row)l对定位Q?/p>
afterLast()定位到最后一条记录的后面
恢复l习表命令:
sqlplus openlab/open123 @summit2.sql
登陆oracle的命令:
sqlplus 用户?密码
show user 昄当前登陆的n?
set pause on
set pause off 分页昄.
oracle中默认日期和字符是左寚wQ数字是叛_?br />table or view does not exist ; 表或C图不存?/p>
edit 命o用于自动打开vi修改刚修执行q的sql的命令?br />修改Ҏ二:
l 3 先定位到行 ?c /旧串/C
执行出错Ӟ利用错误h查错?
!oerr ora 942 (装完pȝ后会装一个oerr工具Q用于通过错误h查看?/p>
误的具体信息)
惛_sql中执行unix命oӞ把所有的命o前加一?可以, 或者host( ?/p>
于从sql从切换至unix环境中去)
/*** 初次使用时注意?****
q行角本时的命oQ?br />先切换到unix环境下,cd $oracle_home cd sqlplus cd demo 下面有两
个角本徏表语句?br />@demobld.sql
sqlplus nanjing/nanjing @demobid.sql 直接q行角本Q后面跟当前目录?/p>
者是l对路径
保存刚才的sql语句Q ?save 命o W二ơ保存时要替换之前的角本
save 文g名 ?replace
把刚才保的sql重新攑օ buffer?/p>
spool 文g?br />此命令会把所有的操作存在某个文g中去
spool off
l习1Q查看s_emp表中员工的年工资
select first_name , salary*12 salary from s_emp;
l列起别名的命oQ?br />利用关键字?as 或者用I格 "别名" 双引号内大小写敏感保持引号内?/p>
原样输出Q如果不加双引号Ӟ默认为大?/p>
拼接字段Q?br />select first_name||last_name "employees" from s_emp ;
oracle中表辑֭W串用单引号来表达:
select first_name||' '||last_name from s_emp;(在两个字D之间拼?/p>
一个空?
查看当前用户所有的表:
l习2Q?常用于批量更Ҏ?
set echo off
spool selecttab.sql;
select 'select * from ' || table_name ||' ; ' "table name " from
user_tables;
spool off;
set head off(去除W一?
set feed off(去除最后一?
l习3Q?查出s_emp表中所有员工的一q的L?
select first_name , salary*12*( 1+nvl(commission_pct/100 , 0 ) ) "
year salary " from s_emp;
nvl函数 专用于处理空值的影响.
*******************************************************************
***************************************************************
下午Q?br />column 定义格式化输?br />column last_name Heading format a15;
column last_name;
column salary justify left format $99,999.00 ( 定义工资的显CŞ?
)
$ echo $LANG
zh_CN.hp15CN
$ echo $NLS_LANG
simplified chinese_china.zhs16cgbk
ORDER BY 排序 升序和降序 ?ASC 升序(默认) DESC 降序
select * from s_emp order by dept_id , salary desc 部门号升序,?/p>
资降?br />关键字distinct也会触发排序操作?/p>
qo操作Q?where 子句
select * from s_emp where dept_id=42; 查看部门号ؓ42的所有员?br />select * from s_emp where salary>1000 查看工资高于1000的所有员?br />select salary from s_emp where first_name='Geroge' 扑և名字?/p>
Geroge的员工的工资?br />select table_name from user_tables where table_name='S_EMP'; ?/p>
某个具体表名Ӟ表名的字W串必须要ؓ大写
日期的默认的格式 DD-MON-RR(??q?
BETWEEN AND 在什么之闾b ?NOT BETWEEN AND
注意区间Q[ ]是一个闭区间
IN( LIST) 在某个集合中 NOT IN (list)
Ig有媄响 ?({于list其中M一个就行,为提高效率常把比?/p>
高的攑֜前面)
LIKE 模糊配置 NOT LIKE
通配比较
IS NULL 是空
AND
OR
NOT
l习4:(扑և表名以S_开头的所有表)对于一些特D字W,要用到escape转义,
q不是一定要用\Qescape后面定义是什么字Wؓ转义字符Q那q哪个字符
select table_name from user_tables where table_name like 'S\_%'
escape '\';
当有多个条gӞ要用逻辑q算W:AND OR
写对where语句:正确的数据类型判断、逻辑q算W?/p>
sql函数的作用:
sql函数的分c:单行函数、多行函?br />单行函数Q?(dual 哑表 )
字符函数Q?br />lower 转小写 ?select lower('SQLPLUS') from dual;-->
对纯字符串处理的时?br />upper 转大写 ?select upper('sqlplus') from dual;
initcap 首字W大写 ?select initcap('tarena') from dual;
concat q接字符串 ?select concat(first_name , last_name)
from s_emp;{效于||
substr 求子串 ?select substr('tarenasd0603' ,1,6) from
dual; (取前六个字符) select substr('tarenasd0603',-2) from dual;
(取后两个字符)
length 求字W长度 ?select length('tarena') from dual;
nvl I值函敊W ?两个参数的类型要匚wQ统一的,表示Q如果有Q?/p>
则返回前面的参数Q如果没有就q回后面的参?br />eg:select first_name,salary from s_emp where lower(first_name)
='george';
select first_name , substr(first_name , -2 ) from s_emp; (查出
s_emp表中所有用户名字的最后两个字W?
默认的是从左向右Q如果是-2则表CZ叛_左数
l习5Q ?select first_name , salary from s_emp where lower
(first_name)='george';
数值函敎ͼ
round 函数(四舍五入) select round(45.935, 2) from dual; 不带?/p>
数时默认?位小?br />trunc 函数(截取Q不后面的数字) select trunc(45.995, 1) from
dual;
日期函数QDD-MON-RR ,默认不显CZU、时、分、秒 日期格式敏感
世纪、年、月、日
sysdate q回当前pȝ旉 select sysdate from dual;
更改当前会话的设|格式:
alter session set nls_date_format='yyyy mm dd hh24:mi:ss';
select sysdate-1, sysdate+1, sysdate , sysdate+1 from dual; 注意
单位是以天ؓ单位Q也可以得到多少时、多分钟之后的旉
MONTHS_BETWEEN (DATE1 , DATE2 ) 求两个日期之前相差的月数
add_months(date , 4 ) ?date上再d4个月
select round(last_day(sysdate),'month') from dual;
select next_day(sysdate,'FRIDAY') from dual ; 求这个日期的下一?/p>
FRIDAY
last_day 求月的最后一?/p>
round 函数: select round(sysdate, 'MONTH') from dual; ?/p>
数可以ؓQ?MONTH YEAR(看上半年q是下半q?
select trunc(last_day(sysdate)+1) from dual;
select add_months(trunc(sysdate, 'MONTH'), 1 ) from dual ;
关于日期的两UŞ式:
转换函数Q?br />to_char昄日期Q?br />从数字{化ؓchar to_char(date,'格式')
从日期{化ؓchar to_char(date, 'fmt' )
select to_char(sysdate, 'yyyy mm dd hh24:mi:ss') from dual;
select to_char(sysdate, 'fmyyyy mm
dd hh24:mi:ss') from dual;L前导?br /> select to_char(sysdate ,'YEAR MONTH
dy
eg:查出三月分入职的员工Qselect first_name,start_date from s_emp
where to_char(start_date,'mm')='03';
to_date表达日期Q?br /> 字符转日期 ?select to_date('2000 11 20', 'yyyy mm dd ')
from dual;
select round(to_date('10-OCT-06'
,'dd-mon-RR') ) from dual;
to_number
字符转数?
select to_number('10') from dual ;
day2
where 条g一定是Ҏ某个字段来进行过滤操?
多表q接操作Q?br />两表没有M兌时会产生q卡机Q?br />select first_name , name from s_emp , s_dept;
{D接:
l习一:查看员工的姓名和员工部门?(要考虑到表中实际数据中I值的影响Q?br />select first_name , name from s_emp e, s_dept d where e.dept_id=d.id;同时起了别名
select first_name , name from s_emp e, s_dept d where e.dept_id=d.id and e.first_name='George';具体到哪个h所在的部门
l习二:每个员工所在的部门和部门所在的地区
select first_name , name from s_emp, s_dept, s_region where s_emp.dept_id=s_dept.id and s_dept.region_id=s_region.id;
eg:select first_name,d.name,r.name
from s_emp e,s_dept d,s_region r
where e.dept_id=d.id and d.region_id=r.id;
{D接:
l习?扑և每个员工和每个员工的工资U别
select a.ename , a.sal, b.grade from emp a , salgrade b where a.sal between b.losal and b.hisal;
select a.ename , a.sal, b.grade from emp a , salgrade b where a.sal>=b.losal and a.sal<=b.hisal;
自连接:当一个表的插入行之间有了关系时就发生?又名Q内q接)
select first_name , manager_id from s_emp;
查出所有员工的部门领导的名Uͼ( q种sql会少一条记录,ȝ理没有被配置上)
select e.first_name , m.first_name from s_emp e , s_emp m where e.manager_id=m.id;
外连接:(防止I值时Q用Q?Q的一方会模拟一条记录配|另一?q就UCؓ外连?一个记录都不能;
select e.first_name , m.first_name from s_emp e , s_emp m where e.manager_id=m.id(+);
+h在哪边就表示在哪边补I,来跟Ҏ来匹配,使得数据一个都不会漏掉Q这个例子中的领导有可能会没?最高领导就再没有领gQ所以就
Ҏ领导的那?
标准写法Qselect e.deptno,d.name from emp e,dept d where e.deptno(+)=d.depton and e.depton is null;
查看员工分部的部门:
select distinct(deptno) from emp ;
扑և没有员工的部门:(很经典的一个例?用外q接来解决的标准做法,q是一U方式)
W一步:
select e.deptno , d.deptno from emp e , dept d where e.deptno(+)=d.deptno;
W二步:
select e.deptno , d.deptno from emp e , dept d where e.deptno(+)=d.deptno and e.deptno is null;
l函敎ͼgroup function)Q?br />group by 分组子句 对分l后的子句进行过滤还可以用having 条g 对分l后的条件进行过滤 ?where 是对记录q行qo
avg(distinct | all )求^均值 ?
count(distinct | all )l计
max(distinct | all Q?求最大?br />min(distinct | all )求最?br />sum(distinct | all ) 求和
(所有组函数会忽略空?, avg sum只能作用于数字类型)
求有提成员工的提成的q_|
select avg(nvl(commission_pct ,0 ) ) from s_emp;
有多h有提成:
select count( commission_pct ) from s_emp ;
count(*) 用于l计记录敎ͼ
select sum(commission_pct)/ count(*) from s_emp;
员工分部在多个不同的部门:count 默认Zall的动?br /> select count(dept_id) from s_emp;
select count(distinct dept_id) from s_emp;
求各个部门的q_工资Qgroup by 子句也会触发排序
select dept_id , avg(salary) aa from s_emp group by dept_id order by aa ;
select dept_id , avg(salary) aa from s_emp group by dept_id ;
注意Qgroup by 子句后面跟有条g只能是查询的l果中的字段,所以我们会Zؓ在结果要加入一些group by 要用的字D?br />select region_id , count(*) from s_dept 此句会有?br />select max(region_id) , count(*) from s_dept; (强制语法上可以正?但是不能保证l果也会正确Q?br />求各个部门不同工U的q_工资Q?br />select dept_id , title, avg(salary) from s_emp group by dept_id , title ;
哪些部门的^均工资比2000?
select dept_id, avg(salary) aa from s_emp group by (dept_id) having avg(salary)>2000;
除了42部门以外的部门的q_工资:
select dept_id , avg(salary) from s_emp group by (dept_id ) having dept_id!=42;
select dept_id , avg(salary) from s_emp where dept_id!=42 group by (dept_id ) ;(此种sql效率要高Q先qo再计)
where 单行函数?br />having l函数?br />求各个部门的q_工资:
// q样l计不详l?br />select max(d.name) , avg (s.salary) from s_emp s, s_dept d where s.dept_id=d.id group by d.name;
//****q问题很l典Qؓ了过 oracle sql 语法兌写max(d.name) ***
select max(d.name) , avg(e.salary) , max(r.name) from s_emp e, s_dept d , s_region r where e.dept_id = d.id and d.region_id=r.id group by d.id ;
下午Q?br />关于子查? Subqueries
扑և所有员工中Q工资最低的那个员工Q? 利用子查?Q?br />select first_name, salary from s_emp where salary = ( select min(salary) from s_emp) ;
//q样写会出错姓名和工资不一?br />select max(first_name), min(salary) from s_emp;(利用子查询可以解?
子查询运行的序Q?先运行子查询再运行主查询 子查询一般出现在q算W的双
单D符Q运后面只能跟一个?br />多D符Q可以对两个以上的D行操?br />查询谁跟Smithq一Lz:
select last_name from s_emp where last_name='Smith';
//下种写法可能q存在bugQ没有考虑到数据的全面?有潜在性问?br />select last_name , title from s_emp where title =( select title from s_emp where last_name='Smith' ) and last_name <> 'Smith' ;
//q种写法才考虑的比较全?br />select last_name , title from s_emp where title in ( select title from s_emp where last_name='Smith' ) and last_name <> 'Smith' ;
使用子查询时应注意: 单行子查询返回多个结果时会有错误 single-row subquery returns more than one value
查出哪些员工的工资比q_工资低:
select * from s_emp where salary < ( select avg(salary) from s_emp) ;
哪些部门的^均工资比32部门的^均工资要低:
W一步先查出各个部门的^均工资:
select min(avg(salary ) ) from s_emp group by dept_id;
W二步再查出哪个部门的工资是最低的:
select dept_id, avg(salary) from s_emp group by dept_id having avg(salary) = (select min(avg(salary) ) from s_emp group by dept_id ) ;
哪个部门里没有员工:
select deptno from dept where deptno not in ( select deptno from emp );
哪些人是普通员工:Q用子查询Ş式来做)
select * from s_emp where id not in ( select manager_id from s_emp);
E--R图?实体关系图entity relation
开发流E先q行需求分析,q行pȝ设计Q徏表,再进行开发编?试最l品上U试q行?br />把Y件设计模型{化ؓ数据中的表,设计时要考虑性能的设?/p>
W一范式Q最单的一U徏方式Q一张表只有一个主键?br />W二范式Q表的自q接存在原因Q一张表Q学生表中也有班U的信息?br />W三范式Q表q接存在的原因,两张表,其中一张表引用其它一张表?/p>
U束Q?br />Z保证数据的一致性,
primary key (pk) 主键U束 不允许有重复和空?唯一且非I)
foregin key (fk) 外键U束 两张表parent table child table
unique key (uk) 唯一可以为空
not null
数据库设计时的注意:
索引Q?Z提高效率而设计的一U与业务无关?br />考虑表点用的物理I间Q?br />考虑表之间的关系Q?br />一对多关系Q?利用FK+PK实现Q多的一方引用外?br />一对一关系Q?可以利用FK+UK实现Q?br />多对多关p: 通过中间增加一个附加表来实玎ͼ附加表利用联合主键来实现Q联合v来的主键唯一?/p>
DDL语句Q数据库定义语句Q?br />table (表)
view(C图Q?br />sequence(序列P
index(索引Q?/p>
创徏表语句:
create table [schema].表名 ( 字段名, 字段cd U束条g); schema 默认是当前用户,严格来访问表名完整的写法是schema.tablename
数据cdQ?br />表名的命令规则: 首字母ؓ字母Q不得超q?0个字W?br />char(size) 定长 不管是否辑ֈ最大宽度,都会Ҏ大的宽度?br />varchar2(size) 可变长 ?按实际的字节占用I间
number 所有的数字cd都称为number
number(n, m ) n------n位宽度 ?m-----数点后的宽?br />number(2,4)数点后4 位,有效?位 ?values(0.0099) q样可以 values(0.01)q样出错
LONG 2GB 大文本一个表最我只允许定义一个LONGcd(不徏议用)
CLOB 大对象Ş式存?在表里只存一个指?
BLOB 存二q制大对?声音Q图像之c)
default 作用演示Q?br />create table test(c1 number default 10, c2 number);
U束的演C:
主键U束的定义:
create table test(c number primary key ); 列U束
create table test(c number , primary key(c) ) ; 表U束
create table test( c1 number constraints pkc1 primary key ); 此约束有名字: pkc1
create table test(c number , c2 number , primary key (c ,c1) ) ; 用表U约束可以实现联合主?/p>
外键U束的定义:(先定义父表,再定义子表)
carete table parent(c1 number primary key );
create table child (c number primary key , c2 number references parent(c1));
或表U约束定?
create table child( c number primary key , c2 number , foreign key(c2) references parent(c1));
或表U约束定?
create table child( c number primary key , c2 number , foreign key(c2) references parent(c1));
on delete cascade (及联删除Q删除父表时子表也跟着删除Q?br />on delete set null (及联删除父表时子表中引用的字DؓnullQ?br />
day3
不给U束起名字时Q系l给U束起名时的规律为:数据库用户名_数字(U束名也不能重名Q?br />定义一个约束的两种形式Q?br />列U束 表U束
非空U束Q?
not null (利用desc可能看到Qprimary key 自动h非空U束的特?/p>
primary keyU束Q?br />主键U束的定义:
W一U定义Ş式:
create table test(c number primary key ); 列U束
W二U定义Ş式:
create table test(c number , primary key(c) ) ; 表U束
create table test( c1 number constraints pkc1 primary key ); 此约束有名字: pkc1
create table test(c number , c2 number , primary key (c ,c1) ) ; 用表U约束可以实现联合主?/p>
foregin key (fk) 外键U束:
(先定义父表,再定义子表)
create table parent(c1 number primary key );
create table child (c number primary key , c2 number references parent(c1));
或表U约束定?
create table child( c number primary key , c2 number , foreign key(c2) references parent(c1));
check U束Q?br />create table test(c1 number check(c1>1000));
此表中要求c1的值必要大于1000 才ؓ有效?.
怎么创徏一个角本文Ӟ xxx.sqll尾
执行角本的方法:
在sqlplus环境中执行:@filename.sql
在shell环境中执行: sqlplus nanjing/nanjing @filename.sql
创徏表的语法Q?
create table 表名 ( 字段名 ?字段cd U束cdQ可选)Q;
利用已知表徏一张新表:注会把非I约束带q来Q其它约束要自己d
create table s_emp_42 as select * from s_emp where dept_id = 42;
只取要表l构Q不惌表中数据的徏表方式:
create table s_emp_copy as select * from s_emp where 1=2;
(q是一个小技?在JDBC的学习中会用?where 1=1 的Ş?注意体会Q?/p>
查看一张表的约束:( 查数据字典示?
desc user_constraints;(q个数据字典中会查到相应的信息)
select constraint_name, constraint_type from user_constraints where table_name='S_EMP';
P pk
R fk
C check
U UK
V q种只定义在C图?with check option 相当于组C图加了一个约束)
O 也是出现在示图中
非空U束和CHECK都是用C来表C?/p>
查看字段U束的方法:
desc user_cons_columns;
select column_name, position from user_cons_columns where constraint_name='S_EMP_ID_PK' ;
position 的含义:联合主键Q约束名一栗?br /> user_constraints user_cons_columns 两张表的U束名相{,表名相等Q两张表一兌可以查出所需的信息?/p>
select constraint_name , r_constraint_name from user_constraints where constraint_type='R' and table_name='S_EMP' ;
数据库徏立时Q数据字典就会徏好?br />user_constraints; 自己拥有?br />all_constraints; 你自己拥有的加上你可以访问的
dba_constraints 所有的
查看当前数据库数据字典的字典Q这个示囑־重要Q?br />desc dict;
select table_name form dict where table_name like '%cons%;
C图Q?br />user_objects; user_tables;
select distinct object_type from user_objects;
介绍事务的概念:
commit 提交Q此时说明前面所有语句都成功执行
rollback 回退操作Q此时会恢复至上一ơ提交时的状态?br />savepoint 讄保存?/p>
注意 insert into 后面可以跟子查询
insert into s_emp_42 select * from s_emp where dept_id =42;
UPDATE 修改字段|
update s_emp set dept_id =10 where id =2 ;
update s_emp set commission_pct =10 ; 没有where条g时说明是改表中所有的?
注意Q如有外键引用时怼出现外键引用值没有找到等错误Q?/p>
delete 删除记录命o语法Q?br />delete from s_emp where dept_id=42;
delete form s_emp ; 没有where条g时说明删除表中所有的?br />注意Q如有外键引用时Q删除一张表时常会出C能删除的情况Q?br />原因一 是因为此时正在有人操作表中记?br />原因二 ?此表有其他的表引用,没能讑֏联删除:
delete 删除一张大表时I间不释放,非常慢是因ؓ占用大量的系l资源,支持回退操作Q空间还被这张表占用着?br />truncate table 表名 (删除表中记录旉放表I间)
DML 语句Q?br />表׃n锁: 对于操作一张表中的不同记录Ӟ互不影响
行排它锁:对于一行记录,oracle 会只允许只有一个用户对它在同一旉q行修改操作
wait() {到行锁被释放Q才q行数据操作
drop一张表时也会对表加锁,DDL排它?所以在删除一张表时如果当前还有用h作表时不能删除表
alter table 命o用于修改表的l构(q些命o不会l常?Q?br />增加U束Q?br />alter table 表名 add constraint U束名?primary key (字段Q?
解除U束Q?删除U束)
alter table 表名 drop primary keyQ对于主键约束可以直接用此方法,因ؓ一张表中只有一个主键约束名, 注意如果主键此时q有其它表引用时删除主键时会出错Q?br />alter tbale father drop primary key cascade ; (如果有子表引用主键时Q要用此语法来删除主?q时子表q存在只是子表中的外键约束被及联删除了)
alter table 表名 drop constraint U束?
(怎样取一个约束名Q?、h为的q反U束规定Ҏ错误信息获取!
2、查询示图获取约束名!)
alter table 表名 disable from primary key ; (相当于把一个表的主键禁?
alter table 表名 enable primary key ;Qenable 时会自动L查表的记录是不是W合要求,如果有脏数据时必要先删除脏数据才可?enableQ?/p>
*******************************************************************
增加字段Q?br /> alter table 表名 add(字段字?字段cd)
删除字段Q?br /> alter table 表名 drop(字段)
alter tbale 表名 drop column 字段 ; (8i 以后才支持)
l列改名:920才支?br /> alter table 表名 rename column 旧字D名 to 新字D名;
修改字段
(此时应注意的问题Q更Ҏ要看具体值情况之间的转达换, 改ؓ字符cdӞ必须要ؓI?
alter table 表名 modify( 字段Q类?
更改表中的字D:
update 表名 set 字段 Q ?值 ?where 条g
更改表名
rename 旧表名 ?to 新表名 ?Q?br />删除表:
trucate table 表名:(表结构还在,数据全部删除Q释放表所占的I间Q不支持回退,常用删除大表Q?/p>
关于oralce中生序?sequence):
create sequence 序列名alter system flush shared_pool;
(不带参数旉认ؓ? 开始每ơ递增 1Qoracle中ؓ了提高生序列的效率一般一ơ性?0个序列放入当前会话的序列池中备用以加快效率,序列会出Cq箋的动作回退操作不会影响序列取|
sequence 的参敎ͼ
increment by n 起始? start with n 递增? maxvalue n 最大? minvalue n 最|cycle | no cycle 轮回Q?cache n l存(W一ơ取时会一ơ取多少个id存v来)
查看 sequence C图Q?br />desc user_sequences ;
select sequence_name , cache_size , last_number from user_sequences where sequence_name like 's_';
select 序列?currval from dual 查看当前的序列数
select 序列?nextval from dual 查看下一个序列数Q它会自动给当前的序列加Q?br />为列Qnextval currval
(开另一个session时取当前g成功Ӟ应该先取下一个|再取当前?
清空当前会话的内存:
alter system flush shared_pool;Q执行此命o要有DBA权限Q一般用h行出错)
修改序列Q?此命令不常用Q只需了解p不必qQ?br />alter sequence 序列名?修改;
删除序列sequence
drop sequence 序列?
创徏C图Q?creating viewsQ属于了解知识)
desc user_views;
select text from user_views where view_name='TEST1_V1' ;
C图q当于一条select 语句,定义了一个示囑ְ是定义了一个sql语句,C图不占I间,使用view 不会提高性能Q但是能单化sql语句
Q扩展知识: oracle 8i 以后的新C图QMV 物化视图(占存储空_把select l果存在一个空_会提高查询视?增强实时性,但是存在h问题Q?主要应用在数据仓库中用要用于聚合表)
使用C图的好处:控制数据讉K权限.
如何创徏一个示图:
create or replace views test_vi as select * from test1 where c1=1;
此时往表test1Qbase table Q中插入数据Ӟ表中没能变化Q示图中的数据发生改?br />从示图中插数据时相对应的表会发生改变:
往C图中插数据Ӟ会直接插q基表中Q查看示图中的数据时Q相当于是执行创徏时的select语句?br />单示图:能进行DML操作?br />复杂C图Q来源于多张表,不能执行DML操作?br />关于rownumQ?br />rownum 有个特点要么{于1 要么于某个| 不能直接{于某个? 不能大于某个倹{rownum常用于分|C?br />l习Q查询出W?条数据和W?0条数据之_
select first_name , rnum from ( select rownum rnum , first_name from s_emp where rownum <=10 ) where rnum between 5 and 10 ;
分面昄Q?br />SELECT * FROM (SELECT a.*, rownum r FROM S_EMP a WHERE r between 5 AND 10 )Q?/p>
l习Q哪些员工的工资比本部门的^均工资高Q?br />select first_name , salary , avgsal from s_emp e , ( select dept_id , avg (salary ) avgsal from s_emp group by dept_id ) a where e.dept_id =a.dept_id and e.salary > a.avgsal;
在示图上加一?with check option q当于l示囑֊上了U束
create view test_v as select * from test where c =1 with check option ;
同义?相当于别名的作用(***只需了解***Q系l自建的同义词: user_tables
create synonym asd_s_emp for asd_0607.s_emp ;
目的是Zlasd_0607_s_emp表v另一个代替的名称asd.s_emp;注意q个同义词只能自׃?
create public synonym p_s_emp fro asd_0607.s_emp; 创徏公共的同义词Q但是要权限.
删除同义词:
drop synonym 同义词名U?/p>
创徏索引Q?Creating indexes(概念很重要对pȝ的性能影响非常大)
建烦引的目的是Z加快查询速度?br />索引q于一本的书的目录。烦引点pȝI间Q属于表的附属物。删除一个表Ӟ相对应的索引也会删除。truncate 表时索引l构在,但是数据不存在?br />full table scan 全表扫描
用烦引就是ؓ了快速定位数据:(理解时就以字典的目录ZQ?br />查看表的rowidQ?br />select rowid , first_name from s_emp;
rowid 定义的信息有Q?object block table
每条记录都有自己的rowid
索引p创徏Q用?建烦引后会DML操作效率慢,但是对用h询会提高效率,q就是我们徏索引的最l目的,
创徏一个烦引:
create index 索引名 ?on 表名 ( 字段名);
create insex testindex on test(c1, c2);
哪些字段应该建烦引:
l常要用where的子句的地方Q所以要用烦?用不用烦引,关键要看所查询的数据与所有数据的癑ֈ比,表越大,查询的记录越,索引的效率最?
替换变量Q用&W号来定义替换变量支持交互性提C?对于字符性的数字Q一定要写在单引号之?br />set verify on
set verify off;
相当于开兛_量,用于控制是否昄新旧的sql语句
select id ,last_name ,salary from s_emp where title='&job_title';
更改交互的提CZ息:
accept p_dname prompt ' 提示信息';
定义变量Q?br />define p_dname='abc';
分页的实现语句:(可以正常q行)
select * from ( select rownum rnum , a.* from (select * from s_emp) a ) where rnum between 5 and 10 ;
-------------------------------------------------------------------------------------------------------------------------
1、关于约束的知识Q?br />primary keyU束Q?br />主键U束的定义:
W一U定义Ş式:
create table test(c number primary key ); 列U束
W二U定义Ş式:
create table test(c number , primary key(c) ) ; 表U束
create table test( c1 number constraints pkc1 primary key ); 此约束有名字: pkc1
create table test(c number , c2 number , primary key (c ,c1) ) ; 用表U约束可以实现联合主?/p>
foregin key (fk) 外键U束:
(先定义父表,再定义子表)
carete table parent(c1 number primary key );
create table child (c number primary key , c2 number references parent(c1));
或表U约束定?
create table child( c number primary key , c2 number , foreign key(c2) references parent(c1));
check U束Q?br />create table test(c1 number check(c1>1000));
此表中要求c1的值必要大于1000 才ؓ有效?.
****************************************************************************
2、关于针对表操作的语法知识:
创徏表:
create table 表名 ( 字段? cd U束条gQ ?字段? cd U束条g Q?
插入数据命oQ?br /> 方式一Q?指定字段名插入数据)
insert into 表名 ( 字段?) values ( 数据Q;
方式二:
insert into 表名 values(数据1Q?数据2Q;
修改数据Q?br /> update table 表名 set ( 字段名 ?数据Q?字段名?数据Q;
****************************************************************************
3、关于alter table 命o知识:
alter table 命o用于修改表的l构(q些命o不会l常?Q?br />增加U束Q?br />alter table 表名 add constraint U束名?primary key (字段Q?
解除U束Q?删除U束)
alter table 表名 drop primary keyQ对于主键约束可以直接用此方法,因ؓ一张表中只有一个主键约束名, 注意如果主键此时q有其它表引用时删除主键时会出错Q?br />alter tbale father drop primary key cascade ; (如果有子表引用主键时Q要用此语法来删除主?q时子表q存在只是子表中的外键约束被及联删除了)
alter table 表名 drop constraint U束?
(怎样取一个约束名Q?br />a、h为的q反U束规定Ҏ错误信息获取!
b、查询示图获取约束名!)
alter table 表名 disable from primary key ; (相当于把一个表的主键禁?
alter table 表名 enable primary key ;Qenable 时会自动L查表的记录是不是W合要求,如果有脏数据时必要先删除脏数据才可?enableQ?br />增加字段Q?br />alter table 表名 add(字段字,字段cd)
删除字段Q?br />alter table 表名 drop(字段)
alter tbale 表名 drop column 字段 ; (8i 以后才支持)
l列改名:920才支?br />alter table 表名 rename column 旧字D名 to 新字D名;
修改字段
(此时应注意的问题Q更Ҏ要看具体值情况之间的转达换, 改ؓ字符cdӞ必须要ؓI?
alter table 表名 modify( 字段Q类?
更改表中的字D:
update 表名 set 字段 Q ?值 ?where 条g
更改表名
rename 旧表名 ?to 新表名 ?Q?br />删除表:
trucate table 表名:(表结构还在,数据全部删除Q释放表所占的I间Q不支持回退,常用删除大表Q?br />****************************************************************************
4、关于oralce中生序?sequence)
create sequence 序列名alter system flush shared_pool;
(不带参数旉认ؓ? 开始每ơ递增 1Qoracle中ؓ了提高生序列的效率一般一ơ性?0个序列放入当前会话的序列池中备用以加快效率,序列会出Cq箋的动作回退操作不会影响序列取|
sequence 的参敎ͼ
increment by n 起始? start with n 递增? maxvalue n 最大? minvalue n 最|cycle | no cycle 轮回Q?cache n l存(W一ơ取时会一ơ取多少个id存v来)
查看 sequence C图Q?br />desc user_sequences ;
select sequence_name , cache_size , last_number from user_sequences where sequence_name like 's_';
select 序列?currval from dual 查看当前的序列数
select 序列?nextval from dual 查看下一个序列数Q它会自动给当前的序列加Q?br />为列Qnextval currval
(开另一个session时取当前g成功Ӟ应该先取下一个|再取当前?
清空当前会话的内存:
alter system flush shared_pool;Q执行此命o要有DBA权限Q一般用h行出错)
修改序列Q?此命令不常用Q只需了解p不必qQ?br />alter sequence 序列名?修改;
删除序列sequence
drop sequence 序列?
****************************************************************************
5、创建示图: creating viewsQ属于了解知识)
C图q当于一条select 语句,定义了一个示囑ְ是定义了一个sql语句,C图不占I间,使用view 不会提高性能Q但是能单化sql语句
Q扩展知识: oracle 8i 以后的新C图QMV 物化视图(占存储空_把select l果存在一个空_会提高查询视?增强实时性,但是存在h问题Q?主要应用在数据仓库中用要用于聚合表)
使用C图的好处:控制数据讉K权限.
如何创徏一个示图:
create or replace views test_vi as select * from test1 where c1=1;
此时往表test1Qbase table Q中插入数据Ӟ表中没能变化Q示图中的数据发生改?br />从示图中插数据时相对应的表会发生改变:
往C图中插数据Ӟ会直接插q基表中Q查看示图中的数据时Q相当于是执行创徏时的select语句?br />单示图:能进行DML操作?br />复杂C图Q来源于多张表,不能执行DML操作?br />关于rownumQ?br />rownum 有个特点要么{于1 要么于某个| 不能直接{于某个? 不能大于某个倹{rownum常用于分|C?br />l习Q查询出W?条数据和W?0条数据之_
select first_name , rnum from ( select rownum rnum , first_name from s_emp where rownum <=10 ) where rnum between 5 and 10;
l习Q哪些员工的工资比本部门的^均工资高Q?br />select first_name , salary , avgsal from s_emp e , ( select dept_id , avg (salary ) avgsal from s_emp group by dept_id ) a where e.dept_id =a.dept_id and e.salary > a.avgsal;
关于同义词:
同义?相当于别名的作用(***只需了解***Q系l自建的同义词: user_tables
create synonym asd_s_emp for asd_0607.s_emp ;
目的是Zlasd_0607_s_emp表v另一个代替的名称asd.s_emp;注意q个同义词只能自׃?
create public synonym p_s_emp fro asd_0607.s_emp; 创徏公共的同义词Q但是要权限.
删除同义词:
drop synonym 同义词名U?/p>
****************************************************************************
6、创建烦引: Creating indexes(概念很重要对pȝ的性能影响非常大)
建烦引的目的是Z加快查询速度?br />索引q于一本的书的目录。烦引点pȝI间Q属于表的附属物。删除一个表Ӟ相对应的索引也会删除。truncate 表时索引l构在,但是数据不存在?br />full table scan 全表扫描
用烦引就是ؓ了快速定位数据:(理解时就以字典的目录ZQ?br />查看表的rowidQ?br />select rowid , first_name from s_emp;
rowid 定义的信息有Q?object block table
每条记录都有自己的rowid
索引p创徏Q用?建烦引后会DML操作效率慢,但是对用h询会提高效率,q就是我们徏索引的最l目的,
创徏一个烦引:
create index 索引名 ?on 表名 ( 字段名);
create insex testindex on test(c1, c2);
哪些字段应该建烦引:
l常要用where的子句的地方Q所以要用烦?用不用烦引,关键要看所查询的数据与所有数据的癑ֈ比,表越大,查询的记录越,索引的效率最?
替换变量Q用&W号来定义替换变量支持交互性提C?对于字符性的数字Q一定要写在单引号之?br />set verify on
set verify off;
相当于开兛_量,用于控制是否昄新旧的sql语句
select id ,last_name ,salary from s_emp where title='&job_title';
更改交互的提CZ息:
accept p_dname prompt ' 提示信息';
定义变量Q?br />define p_dname='abc';
自连接:
select first_name , manager_id from s_emp;
l习?查出所有员工的部门领导的名Uͼ( q种sql会少一条记录,ȝ理没有被配置上)
select e.first_name , m.first_name from s_emp e , s_emp m where e.manager_id=m.id;7fg
外连接:(防止I值时Q用Q?Q的一方会模拟一条记录配|另一?q就UCؓ外连?一个记录都不能;
select e.first_name , m.first_name from s_emp e , s_emp m where e.manager_id=m.id(+);
l习五:查看员工分部的部门:
select distinct(deptno) from emp ;
扑և没有员工的部门:(很经典的一个例?用外q接来解决的标准做法,q是一U方式,用子查询也可以实玎ͼ
W一步:
select e.deptno , d.deptno from emp e , dept d where e.deptno(+)=d.deptno;
W二步:(!L_=N
select e.deptno , d.deptno from emp e , dept d where e.deptno(+)=d.deptno and e.deptno is null;
l习六:查询员工有多h有提成:
select count( commission_pct ) from s_emp ;
select sum(commission_pct)/ count(*) from s_emp;
l习七:员工分部在多个不同的部门:
select count(dept_id) from s_emp;
select count(distinct dept_id) from s_emp;
l习八:求各个部门的q_工资Q?
select dept_id , avg(salary) aa from s_emp group by dept_id order by aa ;
select dept_id , avg(salary) aa from s_emp group by dept_id ;
//体会下句sql
select region_id , count(*) from s_dept ****此句会有?请多体会********
select max(region_id) , count(*) from s_dept; (强制语法上可以正?但是不能保证l果也会正确Q?
l习九:求各个部门不同工U的q_工资Q?br />select dept_id , title, avg(salary) from s_emp group by dept_id , title ;
l习十:查询哪些部门的^均工资比2000?
select dept_id, avg(salary) aa from s_emp group by (dept_id) having avg(salary)>2000;
l习十一Q除?2部门以外的部门的q_工资:
select dept_id , avg(salary) from s_emp group by (dept_id ) having dept_id!=42;
select dept_id , avg(salary) from s_emp where dept_id!=42 group by (dept_id ) ;(此种sql效率要高Q先qo再计)
l习十二Q求各个部门的^均工?
//****q问题很l典Qؓ了过 oracle sql 语法兌写max(d.name)
select max(d.name) , avg(e.salary) , max(r.name) from s_emp e, s_dept d , s_region r where e.dept_id = d.id and
d.region_id=r.id group by d.id ;
关于子查? Subqueries
l习十三Q找出所有员工中Q工资最低的那个员工Q? 利用子查?Q?br />select first_name, salary from s_emp where salary = ( select min(salary) from s_emp) ;
//q样写会出错姓名和工资不一?br />select max(first_name), min(salary) from s_emp;
l习十四Q查询谁跟Smith的工U一P
select last_name from s_emp where last_name='Smith';
//下种写法可能q存在bugQ没有考虑到数据的全面?有潜在性问?br />select last_name , title from s_emp where title =( select title from s_emp where last_name='Smith' )and
last_name <> 'Smith' ;
//q种写法才考虑的比较全?br />select last_name , title from s_emp where title in ( select title from s_emp where last_name='Smith' ) and
last_name <> 'Smith' ;
使用子查询时应注意: 单行子查询返回多个结果时会有错误 single-row subquery returns more than one value(
l习十五Q查出哪些员工的工资比^均工资低Q?br />select * from s_emp where salary < ( select avg(salary) from s_emp) ;
哪些部门的^均工资比32部门的^均工资要低:
W一步先查出各个部门的^均工资:
select min(avg(salary ) ) from s_emp group by dept_id;
W二步再查出哪个部门的工资是最低的:
select dept_id, avg(salary) from s_emp group by dept_id having avg(salary) = (select min(avg(salary) ) from
s_emp group by dept_id ) ;
l习十六Q哪个部门里没有员工(用子查询的方式来实现Q:
select deptno from dept where deptno not in ( select deptno from emp );
SQL*PLUS命o的用大?
Oracle的sql*plus是与oracleq行交互的客L工具。在sql*plus中,可以q行sql*plus命o与sql*plus语句。我们通常所说的DML、DDL、DCL语句都是sql*plus语句Q它们执行完后,都可以保存在一个被UCؓ
sql buffer的内存区域中Qƈ且只能保存一条最q执行的sql语句Q我们可以对保存在sql buffer中的sql 语句q行修改Q然后再ơ执行,sql*plus一般都与数据库打交道?
除了sql*plus语句Q在sql*plus中执行的其它语句我们UC为sql*plus命o。它们执行完后,不保存在sql buffer的内存区域中Q它们一般用来对输出的结果进行格式化昄Q以便于制作报表?
下面׃l一下一些常用的sql*plus命oQ?
1. 执行一个SQL脚本文g
SQL>start file_name
SQL>@ file_name
我们可以多条sql语句保存在一个文本文件中Q这样当要执行这个文件中的所有的sql语句Ӟ用上面的M命o卛_Q这cM于dos中的批处理?
2. 对当前的输入q行~辑
SQL>edit
3. 重新q行上一ơ运行的sql语句
SQL>/
4. 显C的内容输出到指定文?
SQL> SPOOL file_name
在屏q上的所有内定w包含在该文g中,包括你输入的sql语句?
5. 关闭spool输出
SQL> SPOOL OFF
只有关闭spool输出Q才会在输出文g中看到输出的内容?
6Q显CZ个表的结?
SQL> desc table_name
7. COL命oQ?
主要格式化列的显CŞ式?
该命令有许多选项Q具体如下:
COL[UMN] [{ column|expr} [ option ...]]
Option选项可以是如下的子句:
ALI[AS] alias
CLE[AR]
FOLD_A[FTER]
FOLD_B[EFORE]
FOR[MAT] format
HEA[DING] text
JUS[TIFY] {L[EFT]|C[ENTER]|C[ENTRE]|R[IGHT]}
LIKE { expr|alias}
NEWL[INE]
NEW_V[ALUE] variable
NOPRI[NT]|PRI[NT]
NUL[L] text
OLD_V[ALUE] variable
ON|OFF
WRA[PPED]|WOR[D_WRAPPED]|TRU[NCATED]
1). 改变~省的列标题
COLUMN column_name HEADING column_heading
For example:
Sql>select * from dept;
DEPTNO DNAME LOC
---------- ---------------------------- ---------
10 ACCOUNTING NEW YORK
sql>col LOC heading location
sql>select * from dept;
DEPTNO DNAME location
--------- ---------------------------- -----------
10 ACCOUNTING NEW YORK
2). 列名ENAME改ؓ新列名EMPLOYEE NAMEq将新列名放在两行上Q?
Sql>select * from emp
Department name Salary
---------- ---------- ----------
10 aaa 11
SQL> COLUMN ENAME HEADING ’Employee|Name?
Sql>select * from emp
Employee
Department name Salary
---------- ---------- ----------
10 aaa 11
note: the col heading turn into two lines from one line.
3). 改变列的昄长度Q?
FOR[MAT] format
Sql>select empno,ename,job from emp;
EMPNO ENAME JOB
---------- ---------- ---------
7369 SMITH CLERK
7499 ALLEN SALESMAN
7521 WARD SALESMAN
Sql> col ename format a40
EMPNO ENAME JOB
---------- ---------------------------------------- ---------
7369 SMITH CLERK
7499 ALLEN SALESMAN
7521 WARD SALESMAN
4). 讄列标题的寚w方式
JUS[TIFY] {L[EFT]|C[ENTER]|C[ENTRE]|R[IGHT]}
SQL> col ename justify center
SQL> /
EMPNO ENAME JOB
---------- ---------------------------------------- ---------
7369 SMITH CLERK
7499 ALLEN SALESMAN
7521 WARD SALESMAN
对于NUMBER型的列,列标题缺省在双Q其它类型的列标题缺省在左边
5). 不让一个列昄在屏q上
NOPRI[NT]|PRI[NT]
SQL> col job noprint
SQL> /
EMPNO ENAME
---------- ----------------------------------------
7369 SMITH
7499 ALLEN
7521 WARD
6). 格式化NUMBERcd列的昄Q?
SQL> COLUMN SAL FORMAT $99,990
SQL> /
Employee
Department Name Salary Commission
---------- ---------- --------- ----------
30 ALLEN $1,600 300
7). 昄列值时Q如果列gؓNULL|用textg替NULL?
COMM NUL[L] text
SQL>COL COMM NUL[L] text
8). 讄一个列的回l方?
WRA[PPED]|WOR[D_WRAPPED]|TRU[NCATED]
COL1
--------------------
HOW ARE YOU?
SQL>COL COL1 FORMAT A5
SQL>COL COL1 WRAPPED
COL1
-----
HOW A
RE YO
U?
SQL> COL COL1 WORD_WRAPPED
COL1
-----
HOW
ARE
YOU?
SQL> COL COL1 WORD_WRAPPED
COL1
-----
HOW A
9). 昄列的当前的显C属性?
SQL> COLUMN column_name
10). 所有列的显C属性设为缺省?
SQL> CLEAR COLUMNS
8. 屏蔽掉一个列中显C的相同的?
BREAK ON break_column
SQL> BREAK ON DEPTNO
SQL> SELECT DEPTNO, ENAME, SAL
FROM EMP
WHERE SAL < 2500
ORDER BY DEPTNO;
DEPTNO ENAME SAL
---------- ----------- ---------
10 CLARK 2450
MILLER 1300
20 SMITH 800
ADAMS 1100
9. 在上面屏蔽掉一个列中显C的相同的值的昄中,每当列值变化时在值变化之前插入n个空行?
BREAK ON break_column SKIP n
SQL> BREAK ON DEPTNO SKIP 1
SQL> /
DEPTNO ENAME SAL
---------- ----------- ---------
10 CLARK 2450
MILLER 1300
20 SMITH 800
ADAMS 1100
10. 昄对BREAK的设|?
SQL> BREAK
11. 删除6?的设|?
SQL> CLEAR BREAKS
12. Set 命oQ?
该命令包含许多子命oQ?
SET system_variable value
system_variable value 可以是如下的子句之一Q?
APPI[NFO]{ON|OFF|text}
ARRAY[SIZE] {15|n}
AUTO[COMMIT]{ON|OFF|IMM[EDIATE]|n}
AUTOP[RINT] {ON|OFF}
AUTORECOVERY [ON|OFF]
AUTOT[RACE] {ON|OFF|TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]]
BLO[CKTERMINATOR] {.|c}
CMDS[EP] {;|c|ON|OFF}
COLSEP {_|text}
COM[PATIBILITY]{V7|V8|NATIVE}
CON[CAT] {.|c|ON|OFF}
COPYC[OMMIT] {0|n}
COPYTYPECHECK {ON|OFF}
DEF[INE] {&|c|ON|OFF}
DESCRIBE [DEPTH {1|n|ALL}][LINENUM {ON|OFF}][INDENT {ON|OFF}]
ECHO {ON|OFF}
EDITF[ILE] file_name[.ext]
EMB[EDDED] {ON|OFF}
ESC[APE] {\|c|ON|OFF}
FEED[BACK] {6|n|ON|OFF}
FLAGGER {OFF|ENTRY |INTERMED[IATE]|FULL}
FLU[SH] {ON|OFF}
HEA[DING] {ON|OFF}
HEADS[EP] {||c|ON|OFF}
INSTANCE [instance_path|LOCAL]
LIN[ESIZE] {80|n}
LOBOF[FSET] {n|1}
LOGSOURCE [pathname]
LONG {80|n}
LONGC[HUNKSIZE] {80|n}
MARK[UP] HTML [ON|OFF] [HEAD text] [BODY text] [ENTMAP {ON|OFF}] [SPOOL
{ON|OFF}] [PRE[FORMAT] {ON|OFF}]
NEWP[AGE] {1|n|NONE}
NULL text
NUMF[ORMAT] format
NUM[WIDTH] {10|n}
PAGES[IZE] {24|n}
PAU[SE] {ON|OFF|text}
RECSEP {WR[APPED]|EA[CH]|OFF}
RECSEPCHAR {_|c}
SERVEROUT[PUT] {ON|OFF} [SIZE n] [FOR[MAT] {WRA[PPED]|WOR[D_
WRAPPED]|TRU[NCATED]}]
SHIFT[INOUT] {VIS[IBLE]|INV[ISIBLE]}
SHOW[MODE] {ON|OFF}
SQLBL[ANKLINES] {ON|OFF}
SQLC[ASE] {MIX[ED]|LO[WER]|UP[PER]}
SQLCO[NTINUE] {> |text}
SQLN[UMBER] {ON|OFF}
SQLPRE[FIX] {#|c}
SQLP[ROMPT] {SQL>|text}
SQLT[ERMINATOR] {;|c|ON|OFF}
SUF[FIX] {SQL|text}
TAB {ON|OFF}
TERM[OUT] {ON|OFF}
TI[ME] {ON|OFF}
TIMI[NG] {ON|OFF}
TRIM[OUT] {ON|OFF}
TRIMS[POOL] {ON|OFF}
UND[ERLINE] {-|c|ON|OFF}
VER[IFY] {ON|OFF}
WRA[P] {ON|OFF}
1). 讄当前session是否对修改的数据q行自动提交
SQL>SET AUTO[COMMIT] {ON|OFF|IMM[EDIATE]| n}
2)Q在用start命o执行一个sql脚本Ӟ是否昄脚本中正在执行的SQL语句
SQL> SET ECHO {ON|OFF}
3).是否昄当前sql语句查询或修改的行数
SQL> SET FEED[BACK] {6|n|ON|OFF}
默认只有l果大于6行时才显C结果的行数。如果set feedback 1 Q则不管查询到多行都返回。当为off Ӟ一律不昄查询的行?
4).是否昄列标?
SQL> SET HEA[DING] {ON|OFF}
当set heading off Ӟ在每늚上面不显C列标题Q而是以空白行代替
5).讄一行可以容U的字符?
SQL> SET LIN[ESIZE] {80|n}
如果一行的输出内容大于讄的一行可容纳的字W数Q则折行昄?
6).讄与之间的分隔
SQL> SET NEWP[AGE] {1|n|NONE}
当set newpage 0 Ӟ会在每页的开头有一个小的黑Ҏ?
当set newpage n Ӟ会在和之间隔着n个空行?
当set newpage none Ӟ会在和之间没有Q何间隔?
7).昄Ӟ用textg替NULL?
SQL> SET NULL text
8).讄一|多少行数
SQL> SET PAGES[IZE] {24|n}
如果设ؓ0Q则所有的输出内容Zƈ且不昄列标?
9).是否昄用DBMS_OUTPUT.PUT_LINE包进行输出的信息?
SQL> SET SERVEROUT[PUT] {ON|OFF}
在编写存储过E时Q我们有时会用dbms_output.put_line必要的信息输出Q以便对存储q程q行调试Q只有将serveroutput变量设ؓon后,信息才能昄在屏q上?
10).当SQL语句的长度大于LINESIZEӞ是否在显C时截取SQL语句?
SQL> SET WRA[P] {ON|OFF}
当输出的行的长度大于讄的行的长度时Q用set linesize n命o讄Q,当set wrap onӞ输出行的多于的字W会另v一行显C,否则Q会输的多于字W切除,不予昄?
11).是否在屏q上昄输出的内容,主要用与SPOOLl合使用?
SQL> SET TERM[OUT] {ON|OFF}
在用spool命o一个大表中的内容输出到一个文件中Ӟ内容输出在屏幕上会耗费大量的时_讄set termspool off后,则输出的内容只会保存在输出文件中Q不会显C在屏幕上,极大的提高了spool的速度?
12).SPOOL输出中每行后面多余的I格L
SQL> SET TRIMS[OUT] {ON|OFF}
13)昄每个sql语句p的执行时?
set TIMING {ON|OFF}
14Q修改sql buffer中的当前行中Q第一个出现的字符?
C[HANGE] /old_value/new_value
SQL> l
1* select * from dept
SQL> c/dept/emp
1* select * from emp
15Q编辑sql buffer中的sql语句
EDI[T]
16Q显Csql buffer中的sql语句Qlist n昄sql buffer中的Wn行,qɽWn行成为当前行
L[IST] [n]
17Q在sql buffer的当前行下面加一行或多行
I[NPUT]
18Q将指定的文本加到sql buffer的当前行后面
A[PPEND]
SQL> select deptno,
2 dname
3 from dept;
DEPTNO DNAME
---------- --------------
10 ACCOUNTING
20 RESEARCH
30 SALES
40 OPERATIONS
SQL> L 2
2* dname
SQL> a ,loc
2* dname,loc
SQL> L
1 select deptno,
2 dname,loc
3* from dept
SQL> /
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
19Q将sql buffer中的sql语句保存C个文件中
SAVE file_name
20Q将一个文件中的sql语句导入到sql buffer?
GET file_name
21Q再ơ执行刚才已l执行的sql语句
RUN
or
/
22Q执行一个存储过E?
EXECUTE procedure_name
23Q在sql*plus中连接到指定的数据库
CONNECT user_name/passwd@db_alias
24Q设|每个报表的剙标题
TTITLE
25Q设|每个报表的N标题
BTITLE
26Q写一个注?
REMARK [text]
27Q将指定的信息或一个空行输出到屏幕?
PROMPT [text]
28Q将执行的过E暂停,{待用户响应后l执?
PAUSE [text]
Sql>PAUSE Adjust paper and press RETURN to continue.
29Q将一个数据库中的一些数据拷贝到另外一个数据库Q如一个表的数据拷贝到另一个数据库Q?
COPY {FROM database | TO database | FROM database TO database}
{APPEND|CREATE|INSERT|REPLACE} destination_table
[(column, column, column, ...)] USING query
sql>COPY FROM SCOTT/TIGER@HQ TO JOHN/CHROME@WEST
create emp_temp
USING SELECT * FROM EMP
30Q不退出sql*plusQ在sql*plus中执行一个操作系l命令:
HOST
Sql> host hostname
该命令在windows下可能被支持?
31Q在sql*plus中,切换到操作系l命令提C符下,q行操作pȝ命o后,可以再次切换回sql*plusQ?
!
sql>!
$hostname
$exit
sql>
该命令在windows下不被支持?
32Q显Csql*plus命o的帮?
HELP
如何安装帮助文gQ?
Sql>@ ?\sqlplus\admin\help\hlpbld.sql ?\sqlplus\admin\help\helpus.sql
Sql>help index
33Q显Csql*pluspȝ变量的值或sql*plus环境变量的?
Syntax
SHO[W] option
where option represents one of the following terms or clauses:
system_variable
ALL
BTI[TLE]
ERR[ORS] [{FUNCTION|PROCEDURE|PACKAGE|PACKAGE BODY|
TRIGGER|VIEW|TYPE|TYPE BODY} [schema.]name]
LNO
PARAMETERS [parameter_name]
PNO
REL[EASE]
REPF[OOTER]
REPH[EADER]
SGA
SPOO[L]
SQLCODE
TTI[TLE]
USER
1) . 昄当前环境变量的|
Show all
2) . 昄当前在创建函数、存储过E、触发器、包{对象的错误信息
Show error
当创Z个函数、存储过E等出错Ӟ变可以用该命令查看在那个地方出错及相应的出错信息Q进行修改后再次q行~译?
3) . 昄初始化参数的|
show PARAMETERS [parameter_name]
4) . 昄数据库的版本Q?
show REL[EASE]
5) . 昄SGA的大?
show SGA
6). 昄当前的用户名
show user