笔记081115 链接查询 UNION MINUS ALTER_TABLE_CONSTRAINT CREATE_USER

笔记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; 

 SELECT * FROM EMP,DEPT
 WHERE EMP.DEPTNO = DEPT.DEPTNO;

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;

SELECT * FROM EMP RIGHT OUTER JOIN DEPT ON EMP.DEPTNO = DEPT.DEPTNO;

REM 显示员工信息以及所对应的部门信息,显示没有部门的员工信息

--SELECT * FROM EMP,DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO(+);

SELECT * FROM EMP LEFT OUTER JOIN DEPT ON EMP.DEPTNO = DEPT.DEPTNO;

3. 不等连接

两个表中的相关的两列进行不等连接,比较符号一般为>,<,...,BETWEEN.. AND..

REM SALGRADE
--DESC SALGRADE;

--SELECT * FROM SALGRADE;

REM 显示员工的编号,姓名,工资,以及工资所对应的级别。

SELECT EMPNO,ENAME,SAL,SALGRADE.* FROM SALGRADE,EMP
WHERE EMP.SAL BETWEEN LOSAL AND HISAL;

REM 显示雇员的编号,姓名,工资,工资级别,所在部门的名称;

SELECT EMPNO,ENAME,SAL,GRADE,DNAME FROM EMP,DEPT,SALGRADE
WHERE EMP.DEPTNO = DEPT.DEPTNO AND EMP.SAL BETWEEN LOSAL AND HISAL;

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    .......
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值