笔记081115
2008-11-16 上午2:35 发布人 tiger chang *******************************************************************NAME :CHANGTIGER
DATE :9:00 2008-11-15
EMAIL :o52tiger@yahoo.com.cn
*******************************************************************
~~~~~~~~~~~~~~~~~~~~~~~~~~ 复习 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL SELECT
DML (INSERT DELETE UPDATE);
DDL ( CREATE TABLE /VIEW / INDEX /SEQUENCE DROP TABLE /.....)
DCL (COMMIT ROLLBACK GRANT(授权))
____________________________补充 LEFT JOIN ON________________________________
链接查询
表的连接是指在一个SQL语句中通过表与表之间的关连,从一个或多个表中检索相关的数据,大体上表与表之间的连接主要可分四种,分别为相等连接,外连接,不等连接和自连接,本文将主要从以下几个典型的例子来分析Oracle表的四种不同连接方式:
1. 相等连接
通过两个表具有相同意义的列,可以建立相等连接条件。只有连接列上在两个表中都出现且值相等的行才会出现在查询结果中。
例 查询员工信息以及对应的员工所在的部门信息:
SELECT * FROM EMP,DEPT; |
REM 显示工资超过2000的员工信息以及对应的员工的部门名称。
2. 外连接
对于外连接,Oracle中可以使用“(+)”来表示,9i可以使用LEFT/RIGHT/FULL OUTER JOIN,下面将配合实例一一介绍。除了显示匹配相等连接条件的信息之外,还显示无法匹配相等连接条件的某个表的信息。
外连接采用(+)来识别。
A) 左条件(+) = 右条件;
代表除了显示匹配相等连接条件的信息之外,还显示右条件所在的表中无法匹配相等连接条件的信息。此时也称为"右外连接".另一种表示方法是:
SELECT ... FROM 表1 RIGHT OUTER JOIN 表2 ON 连接条件
B) 左条件 = 右条件(+);
代表除了显示匹配相等连接条件的信息之外,还显示左条件所在的表中无法匹配相等连接条件的信息。此时也称为"左外连接".
SELECT ... FROM 表1 LEFT OUTER JOIN 表2 ON 连接条件
例 显示员工信息以及所对应的部门信息
--无法显示没有部门的员工信息
--无法显示没有员工的部门信息
--SELECT * FROM EMP,DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO; |
--直接做相等连接:
SELECT * FROM EMP JOIN DEPT ON EMP.DEPTNO = DEPT.DEPTNO; |
REM 显示员工信息以及所对应的部门信息,显示没有员工的部门信息
--SELECT * FROM EMP,DEPT WHERE EMP.DEPTNO(+) = DEPT.DEPTNO; |
REM 显示员工信息以及所对应的部门信息,显示没有部门的员工信息
--SELECT * FROM EMP,DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO(+); |
3. 不等连接
两个表中的相关的两列进行不等连接,比较符号一般为>,<,...,BETWEEN.. AND..
REM SALGRADE |
REM 显示员工的编号,姓名,工资,以及工资所对应的级别。
SELECT EMPNO,ENAME,SAL,SALGRADE.* FROM SALGRADE,EMP |
REM 显示雇员的编号,姓名,工资,工资级别,所在部门的名称;
SELECT EMPNO,ENAME,SAL,GRADE,DNAME FROM EMP,DEPT,SALGRADE |
4. 自连接
自连接是数据库中经常要用的连接方式,使用自连接可以将自身表的一个镜像当作另一个表来对待,从而能够得到一些特殊的数据。下面介绍一下自连接的方法:
将原表复制一份作为另一个表,两表做笛卡儿相等连接。
例 显示雇员的编号,名称,以及该雇员的经理名称
SELECT WORKER.ENAME,WORKER.MGR,MANAGER.EMPNO,MANAGER.ENAME FROM EMP WORKER,EMP MANAGER
WHERE WORKER.MGR = MANAGER.EMPNO;
~~~~~~~~~~~~~~~~~~~~~~~~~~ INLINE VIEWS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SELECT U.ID , U.SALARY FROM TIGER2 U ,
(SELECT DEPT_ID , AVG(SALARY) AVG FROM TIGER2 GROUP BY DEPT_ID) S
WHERE U.DEPT_ID = S.DEPT_ID
AND U.SALARY > B.AVG;
~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL> SELECT U.ID ,U.SALARY FROM TIGER2 U
2 WHERE U.SALARY >
3 (SELECT AVG(S.SALARY)
4 FROM TIGER2 S WHERE S.DEPT_ID = U.DEPT_ID);
怎么查看用户ID ,用户的工资,用户所在部门的工资,
~~~~~~~~~~~~~~~~~~~~~~~~~~ MYSQL ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MYSQL数据库实现分页查找的方法
例子如下:
mysql> select * from mydb limit 2 offset 3;
+------+-------+-----------------------+
| id | name | email |
+------+-------+-----------------------+
| 4 | tiger | o52tiger@yahoo.com.cn |
| 5 | tiger | o52tiger@yahoo.com.cn |
+------+-------+-----------------------+
2 rows in set (0.00 sec)
mysql> select * from mydb limit 4 offset 3;
+------+-------+-----------------------+
| id | name | email |
+------+-------+-----------------------+
| 4 | tiger | o52tiger@yahoo.com.cn |
| 5 | tiger | o52tiger@yahoo.com.cn |
| 6 | tiger | o52tiger@yahoo.com.cn |
| 7 | tiger | o52tiger@yahoo.com.cn |
+------+-------+-----------------------+
4 rows in set (0.00 sec)
~~~~~~~~~~~~~~~~~~~~~~~~~~ EXISTS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
存在
SQL> SELECT * FROM TIGER2 WHERE MANAGER_ID IN
2 (SELECT MANAGER_ID FROM TIGER2 GROUP BY MANAGER_ID HAVING COUNT(MANAGER_ID) > 2);
SQL> SELECT USERID ,ID, MANAGER_ID FROM TIGER2 T
2 WHERE EXISTS (SELECT 'M' FROM TIGER2 WHERE MANAGER_ID = T.MANAGER_ID );
~~~~~~~~~~~~~~~~~~~~~~~~~~ UNION ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
UNION 显示公共部分 交集
SELECT COUNT(*) FROM TIGER2 WHERE ID BETWEEN 1 AND 20
UNION
SELECT COUNT(*) FROM TIGER2 WHERE ID BETWEEN 2 AND 5;
SQL> SELECT COUNT(*) FROM TIGER2 WHERE ID BETWEEN 1 AND 20
2 UNION
3 SELECT COUNT(*) FROM TIGER2 WHERE ID BETWEEN 2 AND 5;
COUNT(*)
----------
4
20
SQL> SELECT * FROM STUDENT2 WHERE ID < 1005
2 UNION
3 SELECT * FROM STUDENT2 WHERE ID < 1003;
ID SNAME CID AGE
---------- -------------------- ---------- ----------
1001 GOOGLE 1 34
1002 NANCHANG 1 34
1003 SHANGHAI 2 34
1004 BEIJING 2 34
SQL>
UNION ALL 讲两个查询都显示出来
SELECT ID FROM TIGER2 WHERE ID > 33
UNION ALL
SELECT ID FROM TIGER2 WHERE ID < 35;
SQL> SELECT * FROM STUDENT2 WHERE ID < 1005
2 UNION ALL
3 SELECT * FROM STUDENT2 WHERE ID < 1003;
ID SNAME CID AGE
---------- -------------------- ---------- ----------
1001 GOOGLE 1 34
1003 SHANGHAI 2 34
1004 BEIJING 2 34
1002 NANCHANG 1 34
1001 GOOGLE 1 34
1002 NANCHANG 1 34
6 rows selected.
~~~~~~~~~~~~~~~~~~~~~~~~~~ MINUS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
求差值
SELECT * FROM STUDENT3 WHERE ROWNUM <= 5
MINUS
SELECT * FROM STUDENT3 WHERE ROWNUM <= 2;
SQL> SELECT * FROM STUDENT2 WHERE ROWNUM < 4
2 MINUS
3 SELECT * FROM STUDENT2 WHERE ROWNUM <2;
ID SNAME CID AGE
---------- -------------------- ---------- ----------
1003 SHANGHAI 2 34
1005 VIEWDATA 36
SQL> SELECT * FROM STUDENT2 WHERE ID < 1005
2 MINUS
3 SELECT * FROM STUDENT2 WHERE ID < 1003;
ID SNAME CID AGE
---------- -------------------- ---------- ----------
1003 SHANGHAI 2 34
1004 BEIJING 2 34
~~~~~~~~~~~~~~~~~~~~~~~~~~ ALTER TABLE ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ALTER TABLE [ schema. ]table
[ alter_table_properties
| column_clauses
| constraint_clauses
| alter_table_partitioning
| alter_external_table_clauses
| move_table_clause
]
[ enable_disable_clause
| { ENABLE | DISABLE }
{ TABLE LOCK | ALL TRIGGERS }
[ enable_disable_clause
| { ENABLE | DISABLE }
{ TABLE LOCK | ALL TRIGGERS }
]...
] ;
给表添加一列
SQL> DESC TIGER3;
Name Null? Type
----------------------------------------- -------- --------------------
A CHAR(10)
B VARCHAR2(10)
C VARCHAR2(10)
SQL> ALTER TABLE TIGER3 ADD D CHAR(10);
Table altered.
SQL> DESC TIGER3;
Name Null? Type
----------------------------------------- -------- --------------------
A CHAR(10)
B VARCHAR2(10)
C VARCHAR2(10)
D CHAR(10)
SQL>
删除一列 添加一个关键字COLUMN
SQL> ALTER TABLE TIGER3 DROP COLUMN D;
Table altered.
SQL> DESC TIGER3;
Name Null? Type
----------------------------------------- -------- ------------------------
A CHAR(10)
B VARCHAR2(10)
C VARCHAR2(10)
SQL>
修改一列的数据类型 如果是跨类型的修改则修改的列不能有数据, 否则不能修改.
SQL> ALTER TABLE TIGER3 MODIFY A NUMBER;
Table altered.
SQL> DESC TIGER3;
Name Null? Type
----------------------------------------- -------- ------------------
A NUMBER
B VARCHAR2(10)
C VARCHAR2(10)
SQL>
有数据的修改
SQL> DESC TIGER3;
Name Null? Type
----------------------------------------- -------- ---------------------------
A NUMBER(2)
B VARCHAR2(10)
C VARCHAR2(10)
SQL> INSERT INTO TIGER3 VALUES(2,'TIGER','CHANG');
1 row created.
SQL> ALTER TABLE TIGER3 MODIFY A NUMBER(3);
Table altered.
SQL> DESC TIGER3;
Name Null? Type
----------------------------------------- -------- ---------------------------
A NUMBER(3)
B VARCHAR2(10)
C VARCHAR2(10)
SQL>
~~~~~~~~~~~~~~~~~~~~~~~~~~ 修改表约束 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ALTER TABLE STUDENT2
ADD CONSTRAINT FK_TIGER2
FOREIGN KEY(CID)
REFREENCES CLASS2(ID);
ALTER TABLE STUDENT2
DROP CONSTRAINT FK_TIGER2;
ALTER TABLE STUDENT2
DROP PRIMARY KEY CASCADE;
ALTER TABLE STUDENT2
DISABLE CONSTRAINT FK_TIGER2;
ALTER TABLE STUDENT2
ENABLE CONSTRAINT FK_TIGER2;
DROP TABLE STUDENT2;
RENAME STUDENT2 STUDENT22;
TRUNCATE TABLE STUDENT2;
~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ORACLE 管理
sqlplus scott/tiger 默认的用户
建立新的用户,
管理员来建
windows
安装ORACLE 至少启动两个服务:ORACLE ...SERVER & ORACLE .....LISTENNER
用命令启动服务
#su -
#su - oracle
SQL> CONNECT /AS SYSDBA 进入管理员帐户
SQL> startup 启动ORACLE
SQL> shutdown -immediate 关闭ORACLE
SQL> lsnrctl 控制LINSTENNER 查看状态
~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
添加用户
SQLPLUS /NO LOG
CONNECT /AS SYSDBA
CREATE USER USER_NAME IDENTIFIED BY PASSWD; 添加用户USER_NAME 密码PASSWD;
ALTER USER USER_NAME IDEBTUFUED BY PASSWD; 修改用户USER_NAME 的密码PASSWD;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CREATE USER user
IDENTIFIED { BY password
| EXTERNALLY
| GLOBALLY AS 'external_name'
}
[ DEFAULT TABLESPACE tablespace
| TEMPORARY TABLESPACE
{ tablespace | tablespace_group_name }
| QUOTA { integer [ K | M ]
| UNLIMITED
}
ON tablespace
[ QUOTA { integer [ K | M ]
| UNLIMITED
}
ON tablespace
]...
| PROFILE profile
| PASSWORD EXPIRE
| ACCOUNT { LOCK | UNLOCK }
[ DEFAULT TABLESPACE tablespace
| TEMPORARY TABLESPACE
{ tablespace | tablespace_group_name }
| QUOTA { integer [ K | M ]
| UNLIMITED
}
ON tablespace
[ QUOTA { integer [ K | M ]
| UNLIMITED
}
ON tablespace
]...
| PROFILE profile
| PASSWORD EXPIRE
| ACCOUNT { LOCK | UNLOCK }
]...
] ;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
GRANT CONNEST,RESOURCE TO user 个用户user链接的权限和资源的权限
commit;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
REVOKE CONNECT FROM user 收回权限
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL> SELECT USER, UID FROM DUAL;
USER UID
------------------------------ ----------
SCOTT 59
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
set timing on;
set autotrace on;
查询相关资料
explain
mysql> explain select * from test4;
+----+-------------+-------+------+---------------+------+---------+------+-----
-+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows
| Extra |
+----+-------------+-------+------+---------------+------+---------+------+-----
-+-------+
| 1 | SIMPLE | test4 | ALL | NULL | NULL | NULL | NULL | 10
| |
+----+-------------+-------+------+---------------+------+---------+------+-----
-+-------+
1 row in set (0.01 sec)
mysql>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~``
如果可以用自查询可完成,链接也可以查询,推荐使用链接实现,效率较高。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~··
使用临时表
数据库的性能优化 查看相关资料
常用方法
1 使用定常字段 定常字段较好 合适的长度
2 表的属性的优化
3
用ROWID性能很高
ROWNUM 是从1开始的
ROWID 在数据库中的所有数据都有一个唯一的标识
查找相关的资料ROWID 和ROWNUM
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
面试常问道的
1 分页查询 的语句 ORACLE (ROWNUM )和MYSQL(LIMIT OFFSET ) 的不同分页语句
2 求每个年龄段的人数 GROUP BY AGE/10
3 删除表中重复的记录 rowid min
4 去除表中随机的三条记录 利用相应的函数 DBMS_RANDOM.RANDOM
5 去除工资大约本部门平均工资的人 自查询
6 .......
7 .......