首页 热点资讯 义务教育 高等教育 出国留学 考研考公
您的当前位置:首页正文

ORACLE查询语句

2023-11-10 来源:骅佗教育

CREATE  TABLE  FAMILYINFO(     FNO NUMBER CONSTRAINT FC001 PRIMARY KEY,--把字段fno约束为主键     FNAME VARCHAR2(20) CONSTRAINT FC002 NOT NULL,--把字段FNAME的约束条件设为“不能为空”     SEX VARCHAR2(20) DEFAULT ‘MALE‘CONSTRAINT FC003 CHECK(SEX IN(‘MALE‘,‘FEMALE‘)),--把字段’SEX‘的约束条件设为’性别默认条件下为’MALE‘,如果自己填写只能填写’MALE‘或’FEMALE‘     FAGE NUMBER,     REL VARCHAR2(20),--家庭成员关系字段     HOBITNO NUMBER CONSTRAINT FC004 REFERENCES HOBITINFO(HNO) ON DELETE SET NULL --约束条件设为,表’HOBITINFO‘中字段’HNo‘的外键,删除引用表中字段时,设为空值   );--建兴趣表HOBITINFCREATE TABLE HOBITINFO(    HNO NUMBER CONSTRAINT HC001 PRIMARY KEY,   --将‘ HNO’设为主键    HNAME VARCHAR2(20) CONSTRAINT HC002 NOT NULL--将‘HNAME’约束条件设为‘不能为空’);--删除表HOBITINFODROP TABLE HOBITINFO;--添加信息INSERT INTO HOBITINFO VALUES(1,‘MOVIE‘);INSERT INTO HOBITINFO VALUES(2,‘CG‘);INSERT INTO HOBITINFO VALUES(3,‘TW‘);SELECT * FROM HOBITINFO;DELETE FROM HOBITINFO WHERE HNO=3; SELECT * FROM FAMILYINFO;TRUNCATE TABLE FAMILYINFO;DROP TABLE FAMILYINFO;INSERT INTO FAMILYINFO VALUES(1,‘PHL‘,‘NAN‘,27,‘FATHER‘);INSERT INTO FAMILYINFO VALUES(2,‘HYQ‘,‘NAN‘,48,‘MATHER‘);INSERT INTO FAMILYINFO VALUES(3,‘PQ‘,‘NAN‘,27,‘BROTHER‘);INSERT INTO FAMILYINFO VALUES(4,‘PC‘,‘NAN‘,20,‘MIN‘); --DDL ALTER TABLE (修改表)ALTER TABLE FAMILYINFO RENAME TO PCFAMILY;--将FAMILYINFO的表名重命名为PCFAMILYALTER TABLE PCFAMILY ADD(--添加列即字段及其属性    HEIGH VARCHAR2(5),    SX VARCHAR2(10) CONSTRAINT PC002 NOT NULL--字段SX创建“不能为空”的约束条件);ALTER TABLE PCFAMILY MODIFY(--修改字段的属性    HEIGH CHAR(20));ALTER TABLE PCFAMILY DROP COLUMN HEIGH;--删除字段HEIGHALTER TABLE PCFAMILY RENAME COLUMN SX TO SX1;--修改约束字段名ALTER TABLE PCFAMILY DROP COLUMN SX1;--删除约束字段--DDL 之 DROP TABLE(删除表)DROP TABLE HOBITINFO CASCADE CONSTRAINTS;--DDL 之 TRUNCATE TABLE 清空表记录TRUNCATE TABLE PCFAMILY;  --DML 之 INSERT(插入,添加记录) INSERT INTO PCFAMILY(FNO,SEX,FNAME,FAGE) VALUES(4,‘NANE‘,‘LIU‘||‘DAYE‘,45+20);--如果指定插入字段顺序,则values里的信息就要对照前面指定的字段填写INSERT INTO PCFAMILY VALUES();  --学生表CREATE TABLE STUDENT(    SNO NUMBER CONSTRAINT SC001 PRIMARY KEY,    SNAME VARCHAR2(10) CONSTRAINT SC002 NOT NULL,    SSEX VARCHAR(10) CONSTRAINT S003 CHECK(SSEX IN (‘M‘,‘F‘)) );--老师表CREATE TABLE TEACHER(     TNO NUMBER CONSTRAINT TC001 PRIMARY KEY,     TNAME VARCHAR2(10) CONSTRAINT TC002 NOT NULL );--课程表CREATE TABLE COURSE(     CNO NUMBER CONSTRAINT CC001 PRIMARY KEY,     CNAME VARCHAR2(20) CONSTRAINT CC002 NOT NULL,     TNO NUMBER CONSTRAINT CC003 REFERENCES TEACHER(TNO)     );--成绩表CREATE TABLE SCORE(     SNO NUMBER CONSTRAINT SSC001 REFERENCES STUDENT(SNO),     CNO NUMBER CONSTRAINT SSC002 REFERENCES COURSE(CNO),     GRADE VARCHAR2(20),     CONSTRAINT SSC003 PRIMARY KEY(SNO,CNO)   );--查询表是否建立成功已经存在SELECT * FROM STUDENT;SELECT * FROM TEACHER;SELECT * FROM COURSE;SELECT * FROM SCORE;--删除表DROP TABLE STUDENT;DROP TABLE TEACHER;DROP TABLE COURSE;DROP TABLE SCORE;--向表里添加信息INSERT INTO STUDENT VALUES(1,‘aaaa‘,‘M‘);INSERT INTO STUDENT VALUES(2,‘bbbb‘,‘M‘);INSERT INTO STUDENT VALUES(3,‘cccc‘,‘F‘); INSERT INTO TEACHER VALUES(1,‘AAAA‘);INSERT INTO TEACHER VALUES(2,‘BBBB‘);INSERT INTO TEACHER VALUES(3,‘CCCC‘); INSERT INTO COURSE VALUES(1,‘yw‘,2);INSERT INTO COURSE VALUES(2,‘sx‘,3);INSERT INTO COURSE VALUES(3,‘yy‘,2); INSERT INTO SCORE VALUES(1,2,89);INSERT INTO SCORE VALUES(2,3,120);INSERT INTO SCORE VALUES(3,1,110); --DML 之UPDATEUPDATE SCORE SET GRADE=GRADE-1;UPDATE SCORE SET GRADE=GRADE+1 WHERE SNO=2;UPDATE SCORE SET GRADE=GRADE+1 WHERE SNO=2 AND CNO=3; ---------------------------------------------------------------------------------------------- DQL 之 SELECTSELECT CHR(107) HAHA FROM DUAL;SELECT CURRENT_DATE FROM DUAL;SELECT TRUNC(ABS(MONTHS_BETWEEN(DATE‘1998-08-08‘,CURRENT_DATE)/12)) AGE FROM DUAL;  SELECT SNO AS 学号, SNAME 学生姓名 FROM STUDENT;SELECT ALL SSEX FROM STUDENT;SELECT DISTINCT SSEX FROM STUDENT;SELECT UNIQUE SSEX FROM STUDENT;SELECT * FROM SCORE WHERE GRADE < 60;SELECT ROWID,ROWNUM,STUDENT.* FROM STUDENT;SELECT * FROM STUDENT WHERE ROWNUM = 1;SELECT * FROM STUDENT WHERE ROWNUM <= 2;SELECT * FROM (SELECT ROWNUM AS RN,STUDENT.* FROM STUDENT) WHERE RN = 2;SELECT CNO,AVG(GRADE) FROM SCORE GROUP BY CNO;SELECT CNO,AVG(GRADE) FROM SCORE GROUP BY CNO HAVING AVG(GRADE) > 80;SELECT SSEX,COUNT(SNO) FROM STUDENT GROUP BY SSEX; SELECT SNO FROM SCORE WHERE CNO = ‘C001‘ AND GRADE = (SELECT MAX(GRADE) FROM SCORE WHERE CNO = ‘C001‘);SELECT SNO FROM SCORE WHERE CNO = ‘C001‘ AND GRADE >= ALL(SELECT GRADE FROM SCORE WHERE CNO = ‘C001‘);SELECT * FROM SCORE ORDER BY CNO ASC,GRADE DESC;SELECT * FROM STUDENT,SCORE WHERE STUDENT.SNO = SCORE.SNO;SELECT SNAME FROM STUDENT,SCOREWHERE STUDENT.SNO = SCORE.SNO AND CNO = ‘C001‘ AND GRADE = (SELECT MAX(GRADE) FROM SCORE WHERE CNO = ‘C001‘);SELECT * FROM STUDENT INNER JOIN SCORE ON STUDENT.SNO = SCORE.SNO;SELECT * FROM STUDENT INNER JOIN SCORE USING(SNO);SELECT * FROM STUDENT CROSS JOIN SCORE WHERE STUDENT.SNO = SCORE.SNO;SELECT * FROM STUDENT NATURAL INNER JOIN SCORE;SELECT * FROM STUDENT LEFT OUTER JOIN SCORE ON STUDENT.SNO = SCORE.SNO;SELECT * FROM STUDENT RIGHT OUTER JOIN SCORE USING(SNO);SELECT * FROM STUDENT FULL OUTER JOIN SCORE USING(SNO); -- 查询考试不及格的学生姓名和挂科的科目名称SELECT SNAME,CNAMEFROM (SCORE LEFT JOIN STUDENT USING(SNO))     LEFT JOIN COURSE USING(CNO)WHERE GRADE < 60; -- 查询所有java考试成绩高于平均分的学生的姓名和成绩SELECT SNAME,GRADEFROM (SCORE LEFT JOIN STUDENT USING(SNO))     LEFT JOIN COURSE USING(CNO)WHERE CNAME = ‘JAVA‘AND GRADE > (    SELECT AVG(GRADE) FROM SCORE LEFT JOIN COURSE USING(CNO)    WHERE CNAME = ‘JAVA‘);  select * from (SELECT  *  from   test   RIGHT   JOIN   t_grade  using(ID) )  a  where `数学` > 90  -- 查询同时参加了C001和C002科目考试的学生编号SELECT SNO FROM(SELECT SNO,CNO FROM SCORE WHERE CNO = ‘C001‘)INNER JOIN(SELECT SNO,CNO FROM SCORE WHERE CNO = ‘C002‘)USING(SNO); -- 查询lili同学参加的所有科目考试中成绩最高的那门科目的授课老师名字SELECT TNAME,CNAME FROMTEACHER LEFT JOIN COURSE USING(TNO)WHERE CNO IN (      SELECT CNO FROM      SCORE LEFT JOIN STUDENT USING(SNO)      WHERE SNAME = ‘LILI‘      AND GRADE = ( SELECT MAX(GRADE) FROM                    SCORE LEFT JOIN STUDENT USING(SNO)                    WHERE SNAME = ‘LILI‘      )); -- 查询库存目前还有多少CREATE TABLE CLOTHER_STORE(    CTYPE VARCHAR2(10),    STORENUM NUMBER); CREATE TABLE CLOTHER_SALE(    CTYPE VARCHAR2(10),    SALENUM NUMBER);INSERT INTO CLOTHER_STORE VALUES(‘T-SHIRT‘,600);INSERT INTO CLOTHER_STORE VALUES(‘COAT‘,700);INSERT INTO CLOTHER_SALE VALUES(‘T-SHIRT‘,140);INSERT INTO CLOTHER_SALE VALUES(‘T-SHIRT‘,165);INSERT INTO CLOTHER_SALE VALUES(‘COAT‘,90);INSERT INTO CLOTHER_SALE VALUES(‘COAT‘,78); SELECT CTYPE,STORENUM-SNUM AS KCSY FROMCLOTHER_STORE LEFT JOIN(SELECT CTYPE,SUM(SALENUM) SNUM FROM CLOTHER_SALE GROUP BY CTYPE)USING(CTYPE); -- 切换到scott用户SELECT * FROM EMP;SELECT * FROM DEPT; --1. 列出至少有一个员工的所有部门。SELECT DISTINCT DEPTNO,DNAME FROMEMP LEFT JOIN DEPT USING(DEPTNO); --2. 列出薪金比"SMITH"多的所有员工。SELECT * FROM EMP WHERE SAL > (SELECT SAL FROM EMP WHERE ENAME = ‘SMITH‘); --3. 列出所有员工的姓名及其直接上级的姓名。SELECT E.ENAME 员工姓名,B.ENAME 上级姓名 FROMEMP E LEFT JOIN EMP B ON E.MGR = B.EMPNO; --4. 列出受雇日期早于其直接上级的所有员工。SELECT E.ENAME 员工姓名,E.HIREDATE 员工受雇日期,B.ENAME 上级姓名,B.HIREDATE 上级受雇日期FROM EMP E LEFT JOIN EMP B ON E.MGR = B.EMPNOWHERE E.HIREDATE < B.HIREDATE; --5. 列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门。SELECT DNAME,EMP.* FROM EMP RIGHT JOIN DEPT ON EMP.DEPTNO = DEPT.DEPTNO; --6. 列出所有"CLERK"(办事员)的姓名及其部门名称。SELECT ENAME,DNAME FROM EMP LEFT JOIN DEPT USING(DEPTNO) WHERE JOB = ‘CLERK‘; --7. 列出最低薪金大于1500的各种工作。SELECT JOB FROM EMP GROUP BY JOB HAVING MIN(SAL) > 1500; --8. 列出在部门"SALES"(销售部)工作的员工的姓名,假定不知道销售部的部门编号。SELECT ENAME FROM EMP LEFT JOIN DEPT USING(DEPTNO) WHERE DNAME = ‘SALES‘; --9. 列出薪金高于公司平均薪金的所有员工。SELECT * FROM EMP WHERE SAL > (SELECT AVG(SAL) FROM EMP); --10.列出与"SCOTT"从事相同工作的所有员工。SELECT * FROM EMP WHERE JOB = (SELECT JOB FROM EMP WHERE ENAME = ‘SCOTT‘) AND ENAME <> ‘SCOTT‘; --11.列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金。SELECT ENAME,SAL FROM EMP WHERE SAL = ANY(SELECT SAL FROM EMP WHERE DEPTNO = 30) AND DEPTNO <> 30; --12.列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金。SELECT ENAME,SAL FROM EMP WHERE SAL > ALL(SELECT SAL FROM EMP WHERE DEPTNO = 30) AND DEPTNO <> 30; --13.列出在每个部门工作的员工数量、平均工资和平均服务期限。SELECT DEPTNO,COUNT(EMPNO) 员工数量,ROUND(AVG(SAL),2) 平均工资,       ROUND(AVG(MONTHS_BETWEEN(CURRENT_DATE,HIREDATE))/12,2) 平均服务年限FROM EMP RIGHT JOIN DEPT USING(DEPTNO)GROUP BY DEPTNO; --14.列出所有员工的姓名、部门名称和工资。SELECT ENAME,DNAME,SAL FROM EMP LEFT JOIN DEPT USING(DEPTNO); --15.列出所有部门的详细信息和部门人数。SELECT DEPT.DEPTNO,DNAME,LOC,COUNT(EMPNO) FROMDEPT LEFT JOIN EMP ON EMP.DEPTNO = DEPT.DEPTNOGROUP BY DEPT.DEPTNO,DNAME,LOC; --16.列出各种工作的最低工资。SELECT JOB,MIN(SAL) FROM EMP GROUP BY JOB; --17.列出各个部门的MANAGER(经理)的最低薪金。SELECT MIN(SAL) FROM EMP WHERE JOB = ‘MANAGER‘; --18.列出所有员工的年工资,按年薪从低到高排序。SELECT ENAME,SAL*12+NVL(COMM,0) 年薪 FROM EMP ORDER BY 年薪; --19.列出经理人的名字。SELECT ENAME FROM EMP WHERE JOB = ‘MANAGER‘ OR JOB = ‘PRESIDENT‘; --20.不用组函数,求出薪水的最大值。SELECT SAL FROM (SELECT SAL FROM EMP ORDER BY SAL DESC) WHERE ROWNUM = 1; --21.列出薪资第2高到第8高的员工。SELECT SAL FROM(SELECT ROWNUM RN,SAL FROM(SELECT SAL FROM EMP ORDER BY SAL DESC))WHERE RN >= 2 AND RN <= 8; -- 切换回普通用户-- union, INTERSECT,MINUSCREATE TABLE A1 (    V1 NUMBER,    V2 VARCHAR2(10));CREATE TABLE A2 (    V3 NUMBER,    V4 VARCHAR2(10),    V5 VARCHAR2(10)); INSERT INTO A1 VALUES(10,‘A001‘);INSERT INTO A1 VALUES(11,‘A002‘);INSERT INTO A2 VALUES(10,‘A001‘,‘HAHA‘);INSERT INTO A2 VALUES(12,‘A003‘,‘HEIHEI‘);INSERT INTO A2 VALUES(13,‘A004‘,‘HOHO‘); SELECT * FROM A1 UNION (SELECT V3,V4 FROM A2);SELECT * FROM A1 UNION ALL (SELECT V3,V4 FROM A2);SELECT * FROM A1 INTERSECT (SELECT V3,V4 FROM A2);SELECT * FROM A1 MINUS (SELECT V3,V4 FROM A2); -- 带锁查询UPDATE CLOTHER_STORE SET STORENUM = 600 WHERE CTYPE = ‘T-SHIRT‘;SELECT * FROM CLOTHER_STORE FOR UPDATE WAIT 5;UPDATE CLOTHER_STORE SET STORENUM = STORENUM - 400 WHERE CTYPE = ‘T-SHIRT‘; -- DCL 之 COMMITSELECT * FROM STUDENT;DELETE FROM STUDENT WHERE SNO = ‘S011‘;COMMIT; -- DCL 之 ROLLBACK 和 SAVEPOINTSELECT * FROM CLOTHER_SALE;UPDATE CLOTHER_SALE SET SALENUM = SALENUM + 10;ROLLBACK; UPDATE CLOTHER_SALE SET SALENUM = SALENUM + 10;SAVEPOINT CPD;UPDATE CLOTHER_SALE SET SALENUM = SALENUM + 10;ROLLBACK TO SAVEPOINT CPD; -- DCL 之 GRANTGRANT CREATE VIEW TO LUYY124;GRANT UPDATE ANY TABLE TO LUYY124; -- DDL 之 REVOKEREVOKE CREATE VIEW FROM LUYY124; -- CREATE VIEWCREATE OR REPLACE VIEW STUDENT_VIEW ASSELECT * FROM (STUDENT LEFT JOIN SCORE USING(SNO)) LEFT JOIN COURSE USING(CNO); SELECT * FROM STUDENT_VIEW;SELECT SNAME,CNAME FROM STUDENT_VIEW WHERE GRADE < 60;SELECT * FROM SCORE;UPDATE SCORE SET GRADE = GRADE + 1 WHERE SNO = ‘S001‘ AND CNO = ‘C001‘;CREATE OR REPLACE VIEW STUDENT_VIEW AS SELECT * FROM SCORE;UPDATE STUDENT_VIEW SET GRADE = GRADE - 1 WHERE SNO = ‘S001‘ AND CNO = ‘C001‘; -- CREATE INDEXCREATE INDEX SNAME_INDEX ON STUDENT(SNAME ASC) ;SELECT * FROM STUDENT WHERE SNAME = ‘LILI‘;DROP INDEX SNAME_INDEX; -- PLSQL-- 匿名块SELECT * FROM STUDENT; DECLARE    V_SNO VARCHAR2(4) := ‘S011‘;    V_SNAME VARCHAR(20) := ‘FANGYUQIN‘;    V_SSEX VARCHAR2(1) := ‘F‘;BEGIN    INSERT INTO STUDENT VALUES(V_SNO, V_SNAME, V_SSEX);    DBMS_OUTPUT.put_line(‘插入成功‘);EXCEPTION    WHEN OTHERS THEN        DBMS_OUTPUT.put_line(SQLERRM);END; DECLARE    V_SNO VARCHAR2(4) := ‘S012‘;    V_SNAME VARCHAR2(20);BEGIN    SELECT SNAME INTO V_SNAME FROM STUDENT WHERE SNO = V_SNO;    DBMS_OUTPUT.put_line(V_SNAME);EXCEPTION    WHEN OTHERS THEN        DBMS_OUTPUT.put_line(SQLERRM);END; -- 练习:CREATE TABLE FAKEDATA(       SNO VARCHAR2(4),       SNAME VARCHAR2(10));SELECT * FROM FAKEDATA; DECLARE    SNO_PREFIX VARCHAR2(1) := ‘S‘;    SNAME_PREFIX VARCHAR2(4) := ‘LUYY‘;    SUFIX VARCHAR2(3);    I NUMBER;BEGIN    FOR I IN 1..100    LOOP        IF I < 10 THEN           SUFIX := ‘00‘ || I;        ELSIF I < 100 THEN           SUFIX := ‘0‘ || I;        ELSE           SUFIX := ‘‘ || I;        END IF;        INSERT INTO FAKEDATA VALUES(SNO_PREFIX || SUFIX, SNAME_PREFIX || SUFIX);    END LOOP;EXCEPTION    WHEN OTHERS THEN        DBMS_OUTPUT.put_line(SQLERRM);END; -- 记录类型 RECORDDECLARE    TYPE STUDENTRECORD IS RECORD(         V_SNO STUDENT.SNO%TYPE,         V_SNAME STUDENT.SNAME%TYPE,         V_SSEX STUDENT.SSEX%TYPE    );    SR STUDENTRECORD;BEGIN    SELECT * INTO SR FROM STUDENT WHERE SNO = ‘S010‘;    DBMS_OUTPUT.put_line(SR.V_SNO||‘: ‘||SR.V_SNAME);EXCEPTION    WHEN OTHERS THEN        DBMS_OUTPUT.put_line(SQLERRM);END; DECLARE    SR STUDENT%ROWTYPE;BEGIN    SELECT * INTO SR FROM STUDENT WHERE SNO = ‘S010‘;    DBMS_OUTPUT.put_line(SR.SNO||‘: ‘||SR.SNAME);EXCEPTION    WHEN OTHERS THEN        DBMS_OUTPUT.put_line(SQLERRM);END; -- 带名块-- PROCEDURECREATE OR REPLACE PROCEDURE P1(    V_SNO IN VARCHAR2,    V_SNAME OUT VARCHAR2)ISBEGIN    SELECT SNAME INTO V_SNAME FROM STUDENT WHERE SNO = V_SNO;EXCEPTION    WHEN OTHERS THEN        DBMS_OUTPUT.put_line(SQLERRM);END P1; DECLARE    V1 VARCHAR2(4) := ‘S003‘;    V2 VARCHAR2(20);BEGIN    P1(V1,V2);    DBMS_OUTPUT.put_line(V2);END; DROP PROCEDURE P1; -- FUNCTIONCREATE OR REPLACE FUNCTION F1(    V_CNAME IN VARCHAR2)RETURN VARCHAR2IS    V_TNAME VARCHAR2(20);BEGIN    SELECT TNAME INTO V_TNAME FROM COURSE LEFT JOIN TEACHER USING(TNO) WHERE CNAME = V_CNAME;    RETURN V_TNAME;END F1; DECLARE    V1 VARCHAR2(10) := ‘JAVA‘;    V2 VARCHAR2(20);BEGIN    V2 := F1(V1);    DBMS_OUTPUT.put_line(V2);END; SELECT F1(‘RJZL‘) FROM DUAL; DROP FUNCTION F1; -- 游标 CURSORDECLARE    CURSOR MYCURSOR(V_SNO VARCHAR2) IS           SELECT * FROM SCORE WHERE SNO = V_SNO;    SR SCORE%ROWTYPE;BEGIN    IF MYCURSOR%ISOPEN = FALSE THEN       OPEN MYCURSOR(‘S002‘);    END IF;    LOOP        FETCH MYCURSOR INTO SR;        EXIT WHEN MYCURSOR%NOTFOUND;        DBMS_OUTPUT.put_line(SR.CNO||‘: ‘||SR.GRADE);    END LOOP;    DBMS_OUTPUT.put_line(‘共计‘||MYCURSOR%ROWCOUNT||‘条记录‘);    CLOSE MYCURSOR;END; -- 触发器 TRIGGERCREATE TABLE MEMBERINFO(       MID VARCHAR2(4) CONSTRAINT MC001 PRIMARY KEY,       QCOIN NUMBER(10)); CREATE TABLE RECHARGE(       RNO VARCHAR2(4) CONSTRAINT RC001 PRIMARY KEY,       MID VARCHAR2(4) CONSTRAINT RC002 REFERENCES MEMBERINFO(MID),       REQCOIN NUMBER(10)); CREATE TABLE CONSUME(       CNO VARCHAR2(4) CONSTRAINT CC001 PRIMARY KEY,       MID VARCHAR2(4) CONSTRAINT CC002 REFERENCES MEMBERINFO(MID),       CQCOIN NUMBER(10)); INSERT INTO MEMBERINFO VALUES(‘M001‘,400);INSERT INTO MEMBERINFO VALUES(‘M002‘,700);INSERT INTO MEMBERINFO VALUES(‘M003‘,1400); SELECT * FROM MEMBERINFO;SELECT * FROM RECHARGE;SELECT * FROM CONSUME; CREATE OR REPLACE TRIGGER RECHARGE_INSERTAFTER INSERTON RECHARGEFOR EACH ROWBEGIN    UPDATE MEMBERINFO SET QCOIN = QCOIN + :NEW.REQCOIN WHERE MID = :NEW.MID;END RECHARGE_INSERT; CREATE OR REPLACE TRIGGER CONSUME_INSERTBEFORE INSERTON CONSUMEFOR EACH ROWDECLARE    V_QCOIN NUMBER(10);BEGIN    SELECT QCOIN INTO V_QCOIN FROM MEMBERINFO WHERE MID = :NEW.MID;    IF V_QCOIN >= :NEW.CQCOIN THEN       UPDATE MEMBERINFO SET QCOIN = QCOIN - :NEW.CQCOIN WHERE MID = :NEW.MID;    ELSE       RAISE_APPLICATION_ERROR(-20001,‘余额不足‘);    END IF;END CONSUME_INSERT; INSERT INTO RECHARGE VALUES(‘R001‘,‘M002‘,500);INSERT INTO CONSUME VALUES(‘C002‘,‘M002‘,200);INSERT INTO CONSUME VALUES(‘C003‘,‘M003‘,2000); 

ORACLE查询语句

标签:mit   minus   loop   abs   point   else   als   fetch   drop   

小编还为您整理了以下内容,可能对您也有帮助:

oracle查看所有表及各表行数

在Oracle数据库中,查看所有表及对应个表的行数,只用一个select语句查询table_name和num_rows两个字段即可。table_name是表名,num_rows代表表的行数。

具体如下:

1、查询数据库所有的表sql:select t.table_name,t.num_rows from all_tables t;

sql执行后的输出结果如下图:

2、查询当前用户表sql:select t.table_name,t.num_rows from user_tables t;

sql执行后输出结果如下图:

扩展资料:

分享一些ORACLE中,对所有表的查询sql:

1、查询所有表名:

select t.table_name from user_tables t;

2、查询所有字段名:

select t.column_name from user_col_comments t;

3、查询指定表的所有字段名:

select t.column_name from user_col_comments t where t.table_name = 'BIZ_DICT_XB';

4、查询指定表的所有字段名和字段说明:

select t.column_name, t.column_name from user_col_comments t where t.table_name = 'BIZ_DICT_XB';

5、查询所有表的表名和表说明:

select t.table_name,f.comments from user_tables t inner join user_tab_comments f on t.table_name = f.table_name;

6、查询模糊表名的表名和表说明:

select t.table_name from user_tables t where t.table_name like 'BIZ_DICT%';

select t.table_name,f.comments from user_tables t inner join user_tab_comments f 

on t.table_name = f.table_name where t.table_name like 'BIZ_DICT%';

7、查询表的数据条数、表名、中文表名

select a.num_rows, a.TABLE_NAME, b.COMMENTS from user_tables a,user_tab_comments b WHERE a.TABLE_NAME = b.TABLE_NAME  order by TABLE_NAME;

参考资料来源:百度百科-Oracle PL/SQL宝典(第2版)

参考资料来源:百度百科-Oracle数据库编程经典300例

oracle中,如何利用sql语句查询某个表的结构?24

利用sql语句查询某个表的结构的方法:

通过Oracle中的user_tab_cols, user_col_comments, user_constraints, user_cons_columns表联合查询。
  1、user_tab_cols用来获取对应用户表的列信息;
  2、user_col_comments用来获取对应用户表列的注释信息;
  3、user_constraints用来获取用户表的约束条件;
  4、user_cons_columns约束中用户可访问列。

示例代码:

select t.table_name,
       t.column_name,
       t.data_type,
       t.data_length,
       t.nullable,
       t.column_id,
       c.comments,
       (SELECT CASE
                 WHEN t.column_name = m.column_name THEN
                  1
                 ELSE
                  0
               END
          FROM DUAL) iskey
  FROM user_tab_cols t,
       user_col_comments c,
       (select m.column_name
          from user_constraints s, user_cons_columns m
         where lower(m.table_name) = 'qh_outstoresabinfo'
           and m.table_name = s.table_name
           and m.constraint_name = s.constraint_name
           and s.constraint_type = 'P') m
 WHERE lower(t.table_name) = 'qh_outstoresabinfo'
   and c.table_name = t.table_name
   and c.column_name = t.column_name
   and t.hidden_column = 'NO'
 order by t.column_id

oracle中,如何利用sql语句查询某个表的结构?24

利用sql语句查询某个表的结构的方法:

通过Oracle中的user_tab_cols, user_col_comments, user_constraints, user_cons_columns表联合查询。
  1、user_tab_cols用来获取对应用户表的列信息;
  2、user_col_comments用来获取对应用户表列的注释信息;
  3、user_constraints用来获取用户表的约束条件;
  4、user_cons_columns约束中用户可访问列。

示例代码:

select t.table_name,
       t.column_name,
       t.data_type,
       t.data_length,
       t.nullable,
       t.column_id,
       c.comments,
       (SELECT CASE
                 WHEN t.column_name = m.column_name THEN
                  1
                 ELSE
                  0
               END
          FROM DUAL) iskey
  FROM user_tab_cols t,
       user_col_comments c,
       (select m.column_name
          from user_constraints s, user_cons_columns m
         where lower(m.table_name) = 'qh_outstoresabinfo'
           and m.table_name = s.table_name
           and m.constraint_name = s.constraint_name
           and s.constraint_type = 'P') m
 WHERE lower(t.table_name) = 'qh_outstoresabinfo'
   and c.table_name = t.table_name
   and c.column_name = t.column_name
   and t.hidden_column = 'NO'
 order by t.column_id

Oracle数据库基础知识:SELECT语句

Oracle数据库基础知识:SELECT语句

  SELECT语句是指用来查询、添加、 和删除数据库中数据的语句, 和删除数据库中数据的语句 , 它们 是 SELECT 、 INSERT 、 UPDATE 、 DELETE等. 下面是Oracle数据库基础知识——SELECT语句,希望对大家有所帮助!

  普通用户连接conn scott/tiger

  超级管理员连接 conn “sys/sys as sysdba”

  Disconnect 断开连接

  把SQL存到文件 save c:1.txt

  Ed c:1.txt编辑SQL语句

  @c:1.txt运行SQL语句

  Desc emp描述EMP结构

  Select * from tab 查看该用户下大所有对象

  Show user显示当前用户

  书写SQL语句的原则

  大小写不敏感,但单引和双引内的大小写是敏感的。切记!

  关键字不能缩写

  可以分行书写,但关键字不能被跨行书写,单引内也不要跨行书写。

  一般每个子句是一行

  可以排版来增加可读性

  字符串用单引

  列的别名用双引

  SELECT语句

  1、 简单的Select语句

  Select * from table 不指定查询的字段

  Select attr1,attr2 from table指定查询某些字段

  Select attr1,attr2 from table where attr1=xxx查询符合条件的指定字段

  2、 使用算术表达式 + - / *

  表达式的运算是有优先级的,和程序中的一样,先乘除后加减,括号强制优先级.

  + - * /

  先乘除,后加减,括号强制优先级

  Select ename,12*sal+300 from emp;

  Select ename,12*(sal+300) from emp;

  3、 连接运算符 ||

  4、 使用字段别名 as

  别名的'使用原则

  1。区分同名列的名称

  2。非法的表达式合法化

  3。按照你的意愿显示列的名称

  4。特殊的别名要双引

  5。直接写列的后面

  6。使用as增加可读性

  5、 空值 is null

  Null值不等于0,也不等于空格。

  Null值是未赋值的值,不入索引。

  NULL是双刃剑,使用好了提高性能,你对它不了解,往往是错误的根源,切记!

  查询NULL值

  因为null不等于null,所以没有行被选出。未知不等于未知,无穷不等于无穷.

  6、去除重复行 distinct

  SELECT 语句显示重复的行。用DISTINCT语法来去掉重复的行。

  如果我们想去掉重复的行,我们需要distinct关键字。

  在ORACLE数据库的10G前版本,该语句需要排序才能去掉重复的行,而在10G中数据库并不需要

  排序,而是使用HASH算法来去掉重复的行,由于避免了排序,从而极大的提高了SQL语句的效率,

  因为10G的SQL内核改写了。效率更加的高。因为没有排序,所以输出也是无序的。

  7、查询结果排序 order by asc(desc)

  Where和order by 子句

  语法

  SELECT *|{[DISTINCT] column|expression [alias],...}

  FROM table

  [WHERE condition(s)]

  [order by column|expression| alias ];

  Where 一定要放在FROM 子句的后面。

  显示表的部分行和部分列,使用where子句过滤出想要的行

  Select deptno,ename from emp Where deptno=10;

  Order by 放在最后,用来排序显示结果

  不指明都是二进制排序,如果你想按照拼音,部首,笔画,法语等特殊的排序模式,请设定排序的环境

  变量,关于国家语言的支持问题我们再DBA体系结构中描述。

  默认是升序asc

  降序要指定desc

  8、比较运算符 > < (!= or <>) between and

   And运算

  Select ename,deptno,sal From emp Where deptno=30 and sal>1200;

  ENAME DEPTNO SAL

  ---------- ------ ----------

  ALLEN 30 1600

  WARD 30 1250

  MARTIN 30 1250

  BLAKE 30 2850

  TURNER 30 1500

  两个条件的交集,必须同时满足。

  in操作 not in

  含上下界

  In操作,穷举,据说穷举不能超过1000个值,我没有去验证。一般我们也不会穷举到1000个值,如

  果到1000请改写你的SQL。

  Select deptno,ename,sal from emp Where deptno in(10,20);

  9、模糊查询 like

  % 表示零或多个字符

  _ 表示一个字符

  对于特殊符号可使用ESCAPE 标识符来查找

  Like运算

  _ 通配一个,仅匹配一个字符,

  % 通配没有或多个字符

  10、逻辑运算符 or and not

  OR运算

  Select ename,deptno,sal From emp Where deptno=30 or sal>1200;

  ENAME DEPTNO SAL

  ---------- ------ ----------

  ALLEN 30 1600

  WARD 30 1250

  JONES 20 2975

  MARTIN 30 1250

  BLAKE 30 2850

  CLARK 10 2450

  KING 10 5000

  TURNER 30 1500

  JAMES 30 950

  FORD 20 3000

  MILLER 10 1300

  两个条件的并集,满足一个就可以。

   not运算

  Select ename,deptno,sal From emp Where ename not like 'T%';

  ENAME DEPTNO SAL

  ---------- ------ ----------

  SMITH 20 800

  ALLEN 30 1600

oracle怎么通过索引查询数据语句?

oracle对于数据库中的表信息,存储在系统表中。查询已创建好的表索引,可通过相应的sql语句到相应的表中进行快捷的查询:
1. 根据表名,查询一张表的索引

select * from user_indexes where table_name=upper('表名');

2. 根据索引号,查询表索引字段

select * from user_ind_columns where index_name=('索引名');

3.根据索引名,查询创建索引的语句

select dbms_metadata.get_ddl('INDEX','索引名', ['用户名']) from al ; --['用户名']可省,默认为登录用户

PS:dbms_metadata.get_ddl还可以得到建表语句,如:

SELECT DBMS_METADATA.GET_DDL('TABLE','表名', ['用户名']) FROM DUAL ; //取单个表的建表语句,['用户名']可不输入,默认为登录用户
SELECT DBMS_METADATA.GET_DDL('TABLE',u.table_name) FROM USER_TABLES u; //取用户下所有表的建表语句

当然,也可以用pl/sql developer工具来查看相关的表的各种信息。

oracle怎么通过索引查询数据语句?

oracle对于数据库中的表信息,存储在系统表中。查询已创建好的表索引,可通过相应的sql语句到相应的表中进行快捷的查询:
1. 根据表名,查询一张表的索引

select * from user_indexes where table_name=upper('表名');

2. 根据索引号,查询表索引字段

select * from user_ind_columns where index_name=('索引名');

3.根据索引名,查询创建索引的语句

select dbms_metadata.get_ddl('INDEX','索引名', ['用户名']) from al ; --['用户名']可省,默认为登录用户

PS:dbms_metadata.get_ddl还可以得到建表语句,如:

SELECT DBMS_METADATA.GET_DDL('TABLE','表名', ['用户名']) FROM DUAL ; //取单个表的建表语句,['用户名']可不输入,默认为登录用户
SELECT DBMS_METADATA.GET_DDL('TABLE',u.table_name) FROM USER_TABLES u; //取用户下所有表的建表语句

当然,也可以用pl/sql developer工具来查看相关的表的各种信息。

oracle中存储过程中查询语句怎么写

可用语句查看或用第三方工具查看。

语句查看方法:

1、执行语句:


SELECT text    FROM user_source   WHERE NAME = 'Procere Name'ORDER BY line;--其中Procere Name为存储过程名字,需要全部用大写英文。

2、如要查P_TEST的存储过程:


SELECT text    FROM user_source   WHERE NAME = 'P_TEST'ORDER BY line;

3、内容如下:

oracle中存储过程中查询语句怎么写

可用语句查看或用第三方工具查看。

语句查看方法:

1、执行语句:


SELECT text    FROM user_source   WHERE NAME = 'Procere Name'ORDER BY line;--其中Procere Name为存储过程名字,需要全部用大写英文。

2、如要查P_TEST的存储过程:


SELECT text    FROM user_source   WHERE NAME = 'P_TEST'ORDER BY line;

3、内容如下:

ORACLE 快速查询数据SQL语句

单条匹配,没有索引也不准备建索引。只能靠并发来加快检索速度,最快的语句应该是:select /*+ full(A) parallel(A,10) */ * from A where b=c;理由有2:full table scan 时,oracle会一次读出多个block加快速度parallel指定并发10线程检索,当然如果允许,你指定20也可以。最好等于CPU个数。 不过还是建议在b列上建索引,这是最好的办法。

oracle中多表查询语句怎么写?

以两表为例。

需要用关联查询。

如有以下两张表,其中两表的deptno是关联字段。

现要求查出每个人对应的dname,可用如下语句:

select a.ename,b.dname from emp a,dept b where a.deptno=b.deptno;

查询结果:

oracle中多表查询语句怎么写?

以两表为例。

需要用关联查询。

如有以下两张表,其中两表的deptno是关联字段。

现要求查出每个人对应的dname,可用如下语句:

select a.ename,b.dname from emp a,dept b where a.deptno=b.deptno;

查询结果:

Oracle之查询详解

查询是数据的一个重要操作。用户发送查询请求,经编译软件变异成二进制文件供服务器查询,后返回查询结果集给用户,查询会产生一个虚拟表,看到的是表形式显示的结果,但结果并不真正的存储,每次执行查询只是从数据表中提取数据,并按照表的形式显示出来。

SELECT <列名>

FGROM <表名>

[WHERE <查询条件表达式>]

[GROUP BY <分组表达式>]

[HAVING <分组查询表达式>]

[ORDER BY <排序的列名> [ASC或DESC]]

group by 用于对查询的结果分组统计,通过对group by后面的名字进行分组后输出结果。

group by后面还可以跟多列表示 多列分组 ,在多列分组时放前面的优先分组。

group by 列名,列名

having 子句用于*分组显示结果,其只能和group by一起连用。在where中没有办法直接使用聚合函数,即sum avg等无法使用,所以引用了having,在having中可以使用这些函数。

order by 表示排序,后跟列名和排序方式。如果什么都不加默认为升序。ASC表示升序,DESC表示降序。

在Oracle中还可以设置多列排序

order by 列名1 升降,列名2 升降;

前面的为主要排序,后面的为次一级排序。

注:碰到自己与自己比较的情况下,不能用having,可以创建一个新列。

注:如果select语句同时包含group by,having,order by,按group by,having,order by排序

分组和聚合一起使用,目的是为了统计信息。

where是为了from服务的,只能跟 真实的字段 ,用来筛选from子句中指定的操作所产生的行

group by 用来分组where子句的输出

having 用来从分组的结果中筛选行

order by用来对筛选的结果进行排序

(1)分组函数:max min avg sum count

max表示该列的最大值,min表示该列的最小值,avg表示该列的平均值,sum表示该列的和,count表示该列的行数。

注:分组函数(max、min、avg、count、sum)只能出现在选择列表中having子句、order by子句、不能出现在where子句和group by子句中。

(2)多表查询

多表查询是指两个和两个以上的表或者是视图的查询,在实际应用中,当查询单个表不能满足需求时,一般使用多表查询。如:显示sales部门位置和其员工的姓名,这种情况下需要使用到(dept表和emp表)。

多表查询的连接一般可以分为:内连接、左外连接、右外连接、全连接。

注:在使用多表查询的时候每个表可以设置别名,如果表指定了别名,那么语句中所有语句必须使用别名,而不能再使用实际表名。且在写属性的时候如果属性为其中一个表特有的属性则不需要写别名,如果是两个表都有则必须指定是哪一个表的哪个属性格式为:表名.属性名。

select 列名 from 表1 别名,表2 别名...

注:e是emp的别名,d是dept的别名。

但如果对表进行了操作则需要设置别名,如:查询每个部门中工资高于该部门平均工资的员工人数。在其中有一个avg表,这个表必须设置别名(提醒:如果仅有一个被修改的表,则可以不设置别名,但如果有多个表则必须设置别名)。

内连接

内连接通过使用比较运算符来使每个表的通用列中的值匹配来组成一个新表,即:把两个表中间共有的那些行拿出来进行连接,如果某些行不是两个表共有的,则不进行连接。

select

from 表1

inner join 表2

on 匹配条件



select

from 表1 表2

where匹配条件

左外连接

左外连接与内连接的区别是:设置左外连接的时候设置了主表和附表,主表在前,附表在后。内连接是将两个表匹配的地方输出出来,而左外连接则是主表全写,附表一一对应,附表有则加上,没有不写。

select

from 表1

left join 表2

on 匹配条件

右外连接

右外连接和左外连接基本相同只是右外连接的主表写在后边。

select

from 表1

right join 表2

on 匹配条件

全连接

全连接是在等值连接的基础上将左表和右表的未匹配数据都加上,使用的关键字为full outer join或者full join。

select

from 表1

full join 表2

on 匹配条件

自连接

还有一种特殊情况即自连接,在Oracle中一个表无法与自己进行比较,所以当需要自己表的两个信息做比较的时候也需要使用连接来连接,即同一张表的连结查询。

(3)子查询

子查询是指嵌套在其他sql语句中的select语句,也叫嵌套查询。sql语句执行顺序为从右到左执行,所以在执行查询时会先执行左侧的子查询后进行主查询。

子查询分为单行子查询和多行子查询,单行子查询是指返回一行数据的子查询语句,多行子查询是指返回多行数据的查询语句。子查询还可以分为多列子查询、多行子查询、多列多行子查询。

在进行子查询时如果内部查询不返回任何记录,则外部条件中字段DEPTNO与NULL比较永远为假,也就是说外部查询不返回任何结果。

总结为:

单行子查询是指子查询只返回单列、单行数据

多行子查询是指返回单列多行数据,都是针对单列而言的

多列子查询则是指查询返回多个列数据的子查询语句

单行子查询

where deptno = (单行数值)

多行子查询

where deptno in ( 多行数值 )

多列子查询:

where (job,deptno)=(select job,deptno from emp where ename='KING')

多列多行子查询

where (job,deptno) in (select job,deptno from emp where ename='KING')

单行子查询

在单行子查询的外部查询中可以使用=、>、<、>=、<=、<>等比较运算符。

内部查询返回的结果必须与外部查询条件中字段(DEPTNO)相匹配。

多行子查询

在WHERE子句中使用多行子查询时,可以使用多行比较运算符(IN,ALL,ANY)。

IN:等于任何一个。

ALL:和子查询返回的所有值比较。例如:sal>ALL(1,2,3)等价于sal>3,即大于所有。

ANY:和子查询返回的任意一个值比较。例如:sal>ANY(1,2,3)等价于sal>1,即大于任意一个就可以。

注:ANY运算符必须与单行比较运算符结合使用,并且返回行只要匹配子查询的任何一个结果即可。

多列子查询

多列子查询和多行子查询相同,只是使用多列子查询的时候会有多列进行匹配。

(4)集合运算

为了合并多个select语句的结果,可以使用集合操作符号union,union all,intersect,minus。

union:该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中重复行

union all:该操作与union相似,但是它不会取消重复行,而且不会排序

intersect:使用该操作符用于取得两个结果集的交集

minus:使用该操作符用于取得两个结果集的差集,它只会显示存在第一个集合中,而不存在第二个集合中的数据

总结为集合运算就是将两个或者多个结果集组合成一个结果集。

intersect  交集 返回两个查询共有的记录

union all  并集 返回各个查询的所有记录,包括重复的记录

union      交集 返回各个查询的所有记录,不包括重复的记录

MINUS   补集 返回第一个查询检查出的记录减去第二个查询检索出来的记录之后剩余的记录

注意:当使用集合操作的时候,查询所返回的列数以及列的类型必须匹配,列名可以不同。

(1)Distinct关键字

在Oracle中,可能出现若干相同的情况,那么可以用Distinct消除重复行

(2)多表查询与单行子查询可以实现相同的功能

查询出销售部(sales)下面的员工姓名,工作,工资

(3)显示高于自己部门平均工资的员工信息

分析:

1.找到所有部门的平均工资

select deptno,avg(sal) from emp group by deptno;

2.找到所有人的工资信息

select ename,sal,deptno from emp;

3.把两个结果集使用多表连接组合组合起来

select * from emp,(select deptno,avg(sal) avgsal from emp group by deptno) damao where emp.deptno=damao.deptno;

4.去掉低于平均工资的那些数据即可:

select * from emp,(select deptno,avg(sal) avgsal from emp group by deptno) damao where emp.deptno=damao.deptno and sal>avgsal;

(4)emp表介绍

字段              类型                              描述

empno          NUMBER(4)                 表示雇员编号,是唯一编号

ename          VAECHAR2(10)           表示雇员姓名

job                VARCHAR2(9)             表示工作职位

mgr              NUMBER(4)                 表示一个雇员的领导编号

hiredate       DATE                            表示雇佣日期

sal               NUMBER(7,2)               表示月薪,工资

comm          NUMBER(7,2)               表示奖金,或者称为佣金

deptno         NUMBER(2)                 部门编号

Oracle之查询详解

查询是数据的一个重要操作。用户发送查询请求,经编译软件变异成二进制文件供服务器查询,后返回查询结果集给用户,查询会产生一个虚拟表,看到的是表形式显示的结果,但结果并不真正的存储,每次执行查询只是从数据表中提取数据,并按照表的形式显示出来。

SELECT <列名>

FGROM <表名>

[WHERE <查询条件表达式>]

[GROUP BY <分组表达式>]

[HAVING <分组查询表达式>]

[ORDER BY <排序的列名> [ASC或DESC]]

group by 用于对查询的结果分组统计,通过对group by后面的名字进行分组后输出结果。

group by后面还可以跟多列表示 多列分组 ,在多列分组时放前面的优先分组。

group by 列名,列名

having 子句用于*分组显示结果,其只能和group by一起连用。在where中没有办法直接使用聚合函数,即sum avg等无法使用,所以引用了having,在having中可以使用这些函数。

order by 表示排序,后跟列名和排序方式。如果什么都不加默认为升序。ASC表示升序,DESC表示降序。

在Oracle中还可以设置多列排序

order by 列名1 升降,列名2 升降;

前面的为主要排序,后面的为次一级排序。

注:碰到自己与自己比较的情况下,不能用having,可以创建一个新列。

注:如果select语句同时包含group by,having,order by,按group by,having,order by排序

分组和聚合一起使用,目的是为了统计信息。

where是为了from服务的,只能跟 真实的字段 ,用来筛选from子句中指定的操作所产生的行

group by 用来分组where子句的输出

having 用来从分组的结果中筛选行

order by用来对筛选的结果进行排序

(1)分组函数:max min avg sum count

max表示该列的最大值,min表示该列的最小值,avg表示该列的平均值,sum表示该列的和,count表示该列的行数。

注:分组函数(max、min、avg、count、sum)只能出现在选择列表中having子句、order by子句、不能出现在where子句和group by子句中。

(2)多表查询

多表查询是指两个和两个以上的表或者是视图的查询,在实际应用中,当查询单个表不能满足需求时,一般使用多表查询。如:显示sales部门位置和其员工的姓名,这种情况下需要使用到(dept表和emp表)。

多表查询的连接一般可以分为:内连接、左外连接、右外连接、全连接。

注:在使用多表查询的时候每个表可以设置别名,如果表指定了别名,那么语句中所有语句必须使用别名,而不能再使用实际表名。且在写属性的时候如果属性为其中一个表特有的属性则不需要写别名,如果是两个表都有则必须指定是哪一个表的哪个属性格式为:表名.属性名。

select 列名 from 表1 别名,表2 别名...

注:e是emp的别名,d是dept的别名。

但如果对表进行了操作则需要设置别名,如:查询每个部门中工资高于该部门平均工资的员工人数。在其中有一个avg表,这个表必须设置别名(提醒:如果仅有一个被修改的表,则可以不设置别名,但如果有多个表则必须设置别名)。

内连接

内连接通过使用比较运算符来使每个表的通用列中的值匹配来组成一个新表,即:把两个表中间共有的那些行拿出来进行连接,如果某些行不是两个表共有的,则不进行连接。

select

from 表1

inner join 表2

on 匹配条件



select

from 表1 表2

where匹配条件

左外连接

左外连接与内连接的区别是:设置左外连接的时候设置了主表和附表,主表在前,附表在后。内连接是将两个表匹配的地方输出出来,而左外连接则是主表全写,附表一一对应,附表有则加上,没有不写。

select

from 表1

left join 表2

on 匹配条件

右外连接

右外连接和左外连接基本相同只是右外连接的主表写在后边。

select

from 表1

right join 表2

on 匹配条件

全连接

全连接是在等值连接的基础上将左表和右表的未匹配数据都加上,使用的关键字为full outer join或者full join。

select

from 表1

full join 表2

on 匹配条件

自连接

还有一种特殊情况即自连接,在Oracle中一个表无法与自己进行比较,所以当需要自己表的两个信息做比较的时候也需要使用连接来连接,即同一张表的连结查询。

(3)子查询

子查询是指嵌套在其他sql语句中的select语句,也叫嵌套查询。sql语句执行顺序为从右到左执行,所以在执行查询时会先执行左侧的子查询后进行主查询。

子查询分为单行子查询和多行子查询,单行子查询是指返回一行数据的子查询语句,多行子查询是指返回多行数据的查询语句。子查询还可以分为多列子查询、多行子查询、多列多行子查询。

在进行子查询时如果内部查询不返回任何记录,则外部条件中字段DEPTNO与NULL比较永远为假,也就是说外部查询不返回任何结果。

总结为:

单行子查询是指子查询只返回单列、单行数据

多行子查询是指返回单列多行数据,都是针对单列而言的

多列子查询则是指查询返回多个列数据的子查询语句

单行子查询

where deptno = (单行数值)

多行子查询

where deptno in ( 多行数值 )

多列子查询:

where (job,deptno)=(select job,deptno from emp where ename='KING')

多列多行子查询

where (job,deptno) in (select job,deptno from emp where ename='KING')

单行子查询

在单行子查询的外部查询中可以使用=、>、<、>=、<=、<>等比较运算符。

内部查询返回的结果必须与外部查询条件中字段(DEPTNO)相匹配。

多行子查询

在WHERE子句中使用多行子查询时,可以使用多行比较运算符(IN,ALL,ANY)。

IN:等于任何一个。

ALL:和子查询返回的所有值比较。例如:sal>ALL(1,2,3)等价于sal>3,即大于所有。

ANY:和子查询返回的任意一个值比较。例如:sal>ANY(1,2,3)等价于sal>1,即大于任意一个就可以。

注:ANY运算符必须与单行比较运算符结合使用,并且返回行只要匹配子查询的任何一个结果即可。

多列子查询

多列子查询和多行子查询相同,只是使用多列子查询的时候会有多列进行匹配。

(4)集合运算

为了合并多个select语句的结果,可以使用集合操作符号union,union all,intersect,minus。

union:该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中重复行

union all:该操作与union相似,但是它不会取消重复行,而且不会排序

intersect:使用该操作符用于取得两个结果集的交集

minus:使用该操作符用于取得两个结果集的差集,它只会显示存在第一个集合中,而不存在第二个集合中的数据

总结为集合运算就是将两个或者多个结果集组合成一个结果集。

intersect  交集 返回两个查询共有的记录

union all  并集 返回各个查询的所有记录,包括重复的记录

union      交集 返回各个查询的所有记录,不包括重复的记录

MINUS   补集 返回第一个查询检查出的记录减去第二个查询检索出来的记录之后剩余的记录

注意:当使用集合操作的时候,查询所返回的列数以及列的类型必须匹配,列名可以不同。

(1)Distinct关键字

在Oracle中,可能出现若干相同的情况,那么可以用Distinct消除重复行

(2)多表查询与单行子查询可以实现相同的功能

查询出销售部(sales)下面的员工姓名,工作,工资

(3)显示高于自己部门平均工资的员工信息

分析:

1.找到所有部门的平均工资

select deptno,avg(sal) from emp group by deptno;

2.找到所有人的工资信息

select ename,sal,deptno from emp;

3.把两个结果集使用多表连接组合组合起来

select * from emp,(select deptno,avg(sal) avgsal from emp group by deptno) damao where emp.deptno=damao.deptno;

4.去掉低于平均工资的那些数据即可:

select * from emp,(select deptno,avg(sal) avgsal from emp group by deptno) damao where emp.deptno=damao.deptno and sal>avgsal;

(4)emp表介绍

字段              类型                              描述

empno          NUMBER(4)                 表示雇员编号,是唯一编号

ename          VAECHAR2(10)           表示雇员姓名

job                VARCHAR2(9)             表示工作职位

mgr              NUMBER(4)                 表示一个雇员的领导编号

hiredate       DATE                            表示雇佣日期

sal               NUMBER(7,2)               表示月薪,工资

comm          NUMBER(7,2)               表示奖金,或者称为佣金

deptno         NUMBER(2)                 部门编号

Oracle数据库中用条语句查看数据库中的所有的表?

可通过查询all_tables这个系统表来查看数据库中的所有表。

执行语句:

select table_name from all_tables;

查询结果:

oracle怎么查询所有的表空间的名称?

oracle数据库中,查询素有表空间的名称只需要一条sql语句即可:

select tablespace_name  from user_tablespaces;

结果输出如下图:

在上式的sql中,“user_tablespaces”即为表空间信息所在表,所需的表空间信息需要从该表中获取,“tablespace_name”即为表空间名称,

如果希望查询所有表空间名称和其他相关信息,可以将使用如下sql语句:

select * from user_tablespaces;

结果输出如下:

扩展资料:

针对表空间,还有其他的查询可供参考:

1、查看表空间的名称及对应大小 

SELECT t.tablespace_name, round(SUM(bytes / (1024 * 1024)), 0) ts_size FROM 

dba_tablespaces t, dba_data_files d WHERE t.tablespace_name = 

d.tablespace_name GROUP BY t.tablespace_name; 

输出结果如下:

2、查看表空间物理文件的名称及大小 

SELECT tablespace_name, file_id, file_name, round(bytes / (1024 * 1024), 0) total_space 

FROM dba_data_files ORDER BY tablespace_name; 

输出结果为:

3、查询当前用户所有表名及其所属表空间

select table_name 表名 ,tablespace_name 所使用表空间 from user_tables;

输出结果为:

显示全文