数据库mgr什么意思表mgr开头的一般是什么表

博客访问: 134803
博文数量: 67
博客积分: 1416
博客等级: 上尉
技术积分: 575
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Oracle
Oracle数据库表类型
6.1 表的类型1.&&&&&&&&堆组织表2.&&&&&&&&索引组织表3.&&&&&&&&聚簇表4.&&&&&&&&散列聚簇表5.&&&&&&&&嵌套表6.&&&&&&&&临时表7.&&&&&&&&对象表一张表最多有1000列;表的行数理论上没有限制;表上索引个数可以是列的全排列数,而且一次性能够使用32个;表的数量没有限制。6.2 术语高水位标记 High Water Mark&&&&曾经包含数据的最右边的块。在全表扫描时,Oracle将扫描高水标记一下的所有块,即使它们不含数据。TRUNCATE将重新设置高水标记。自由列表&& Freelist在Oracle中用来跟踪高水标记以下有空闲空间的块对象。保留在高水标记以上的块,只有Freelist为空时才能被用到。并行更新数据时,配置多个Freelist能提高整体性能,代价是增加了存储空间。PCTFREE和PCTUSEDINITIAL, NEXT和PCTINCREASE建议使用Local Managed表空间并设置Extents大小相等。而在没有使用Local Managed表空间的情况下,建议总是设置INITIAL=NEXT和PCTINCREASE=0,以模拟Local Managed表空间的使用。MINEXTENTS和MAXEXTENTSLOGGING和NOLOGGINGINITRANS和MAXTRANS堆组织表6.3 索引组织表数据在IOT中根据主键存储和排序。IOT特别适用于IR(信息检索)、空间和OLAP应用程序。IOT名义上是表,但它们的段实际上是索引段。要显示空间使用等就要先把IOT表的名字转换成潜在的索引名。默认值是SYS_IOT_TOP_,object_id是为表分配的内部对象ID。推荐在建表时指定索引名。主要应用对只包含主键列的表:使用堆组织表将有100%多的额外开销;1. 构建自己的索引结构:例如自己实现一个提供大小写不敏感查询的类似函数索引CREATE TABLE emp AS SELECT * FORM scott.CREATE TABLE upper_name(x$ename,x$rid,PRIMARY KEY(x$ename,x$rid))ORGANIZATION INDEXAS&&SELECT UPPER(ename),ROWID FROMCREATE OR REPLACE TRIGGER upper_enameAFTER INSERT OR UPDATE OR DELETE ON empFOR EACH ROWBEGIN&&IF (UPDATING AND (:OLD.ename||'x':NEW.ename||'x'))&&THEN&&&&DELETE FROM upper_name&&&&WHERE x$ename=UPPER(:OLD.ename)&&&&&&AND x$rid=:OLD.&&&& &&&&INSERT INTO upper_ename(x$ename,x$rid) VALUES (UPPER(:NEW.ename),:NEW.rowid);&&ELSIF (INSERTING)&&THEN&&&&INSERT INTO upper_ename(x$ename,x$rid) VALUES (UPPER(:NEW.ename),:NEW.rowid);&&ELSIF (DELETING)&&THEN&&&&DELETE FROM upper_name&&&&WHERE x$ename=UPPER(:OLD.ename)&&&&&&AND x$rid=:OLD.&&END IF;END;2. 需要加强数据的共同定位或希望数据按特定的顺序物理存储时对应Sybase和SQL Server用户,这种情况会采用聚簇索引,而这可能达到110%的额外开销,而IOT没有。经常用BETWEEN对主键或者唯一键进行查询,则会降低I/O数量。主要选项NOCOMPRESS/COMPRESS N压缩N列,即对其中前N列相同的值进行压缩。从而能够允许更多数据进入Buffer Cache,代价是略多的CPU能量。OVERFLOW PCTTHRESHOLD N/INCLUDING column_name索
引段的存储要密集于普通数据段(每块的行数要多),一般PCTUSED是没有意义的。而OVERFLOW子句允许设置另一个段以允许IOT中的行数据太大
时溢出的这个段中。它再次引入PCTUSED,这样PCTUSED和PCTFREE对OVERFLOW段有对于堆组织表中相同的含义。而使用方法是如下中
的一种:PCTTHRESHOLD——当行中数据超出此百分比,该行尾部的列溢出到溢出块;INCLUDING——指定列之前的列均存入索引块,之后的列存入溢出块。二次索引只要主键是IOT,可以在索引中拥有索引。但不像其他一般索引,它不包含真正rowid(物理地址),而是基于主键IOT的逻辑rowid,作用稍小。对于IOT的二次索引访问实际有两个扫描执行(一般表只需一个扫描索引结构),一个在二次结构中,一个在IOT本身中。6.4 索引聚簇表Oracle中聚簇是存储一组表的方法,而不是如同SQL Server、Sybase中那样(那是Oracle中的IOT)。概念上是通过聚簇码列将几张表“预连接”,尽可能将聚簇码列相同的几张表的行放入同一个块中。CREATE CLUSTER emp_dept_cluster(deptno NUMBER(2))SIZE 1024;CREATE INDEX emp_dept_cluster_idxON CLUSTER emp_dept_CREATE TABLE dept(deptno NUMBER(2) PRIMARY KEY,dname VARCHAR2(14),loc VARCHAR2(3))CLUSTER emp_dept_cluster(deptno);CREATE TABLE emp(empno NUMBER PRIMARY KEY,ename VARCHAR2(10),...deptno NUMBER(2) REFERENCES dept(deptno))CLUSTER emp_dept_cluster(deptno);BEGIN&&FOR x IN(SELECT * FROM scott.dept)&&LOOP&&&&INSERT INTO dept VALUES(x.deptno,x.dname,x.loc);&&&&INSERT INTO emp&&&&&&SELECT * FROM scott.emp&&&&&&WHERE deptno=x.&&END LOOP;END;注意这里的插入方法,这将尽可能保证每个块中放置尽可能多的聚簇码值,并让可以“预连接”的两个表中的值尽可能在同一个块中。DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid)可用于检查rowid所属块。很容易发现dept和emp有重复的rowid,表和rowid可以唯一确定行,rowid伪列只有在一张表中才是唯一的!不使用聚簇的情况:1.聚簇可能消极影响DML性能;2.全扫描表的性能会受到影响——不仅仅扫描一个表,而是对多个表全扫描;3.聚簇中的表不能TRUNCATE。6.5 散列聚簇表概念类似索引聚簇表,但用散列函数代替了聚簇码索引。Oracle采用行的码值,使用内部函数或者自定义的函数进行散列运算,从而指定数据的存放位置。这样没有在表中增加传统的索引,因此不能Range Scan散列聚簇中的表,而只能全表扫描(除非单独建立索引)。CREATE CLUSTER hash_cluster(hash_key NUMBER)HASHKEYS 1000SIZE 8192;索
引聚簇需要空间时是动态分配,而散列聚簇表在创建时确定了散列码数(HASHKEY)。Oracle采用第一个不小于HASHKEY的质数作为散列码数,
将散列码数*SIZE就得到分配的空间(字节),可容纳HASHKEYS/TRUNC(BLOCKSIZE/SIZE)字节的数据。性能上,散列聚簇表消耗较少I/O,较多CPU,所需执行时间较少,大体取决于CPU时间(当然可能要等待I/O,取决于配置)。下列情况下使用散列聚簇表较为合适:1. 在一定程度上精确知道整个过程中表中记录行数或者合理的上限,以确定散列码数;2.&&&&&&&&不大量执行DML,尤其是插入。更新不会产生显著的额外开销,除非更新HASHKEY,这样会导致行迁移;3.&&&&&&&&总是通过HASHKEY值访问数据。6.6 嵌套表两种使用嵌套表的方法:1. PL/SQL代码中作为扩展PL/SQL语言;2. 作为物理存储机制,以持久地存储集合。嵌套表语法&&&&创建嵌套表类型:CREATE TABLE dept(deptno&&&& NUMBER(2) PRIMARY KEY,dname&&&& VARCHAR2(14),loc&&&&&&&& VARCHAR2(13));CREATE TABLE emp(empno&&&&&& NUMBER(4) PRIMARY KEY,ename&&&&&& VARCHAR2(10),job&&&&&&&&&&VARCHAR2(9),mgr&&&&&&&& NUMBER(4) REFERENCES emp,hiredate&&&&&&DATE,sal&&&&&&&&&& NUMBER(7, 2),comm&&&&&&&&NUMBER(7, 2),deptno&&&&&& NUMBER(2) REFERENCES dept);INSERT INTO dept SELECT * FROM scott.INSERT INTO emp SELECT * FROM scott.CREATE OR REPLACE TYPE emp_typeAS OBJECT(empno&&&&&& NUMBER(4),ename&&&&&& VARCHAR2(10),job&&&&&&&&&&VARCHAR2(9),mgr&&&&&&&& NUMBER(4),hiredate&&&&&&DATE,sal&&&&&&&&&& NUMBER(7, 2),comm&&&&&&&&NUMBER(7, 2));CREATE OR REPLACE TYPE emp_tab_typeAS TABLE OF emp_使用嵌套表:CREATE TABLE dept_and_emp(deptno&&&& NUMBER(2) PRIMARY KEY,dname&&&& VARCHAR2(14),loc&&&&&&&& VARCHAR2(13),emps&&&&&& emp_tab_type)NESTED TABLE emps STORE AS emps_可以在嵌套表上增加约束:ALTER TABLE emps_nt ADD CONSTRAINT emps_empno_unique&&&&&&&&&& UNIQUE(empno) ;嵌套表不支持参照完整性约束,不能参考任何其他表甚至自己:ALTER TABLE emps_nt ADD CONSTRAINT mgr_fkFOREIGN KEY(mgr) REFERENCES emps_nt(empno);会产生错误ORA-30730。INSERT INTO dept_and_empSELECT dept.*,&& CAST( MULTISET( SELECT empno, ename, job, mgr, hiredate, sal, comm&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&FROM emp&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&WHERE emp.deptno = dept.deptno ) AS emp_tab_type )&&FROMMULTISET用来告诉Oracle子查询返回不止一行,CAST用来告诉Oracle将返回设置为一个集合类型。查询时,嵌套表中的数据将在同一列中:SELECT deptno, dname, loc, d.emps AS employeesFROM dept_and_emp dWHERE deptno = 10;Oracle同样提供方法去掉集合的嵌套,像关系型表一样处理(能够将EMPS列当作一个表,并自然连接且不需要连接条件):SELECT d.deptno, d.dname, emp.*FROM dept_and_emp D, TABLE(d.emps)按照“每行实际是一张表”的思想来更新:UPDATE&&TABLE( SELECT emps&&&&&&&& FROM dept_and_emp&&&&&&&& WHERE deptno = 10&&&&&&&&)SET comm = 100;但
如果返回SELECT emps FROM dept_and_emp WHERE deptno =
10少于一行,更新将失败(普通情况下更新0行是许可的),并返回ORA-22908错误——如同更新语句没有写表名一样;如果返回多于一行,更新也会失
败,返回ORA-01427错误。这说明Oracle在使用了嵌套表后认为每一行指向另一个表,而不是如同关系型模型那样认为是另一个行集。插入与删除的语法:INSERT INTO TABLE(SELECT emps FROM dept_and_emps WHERE deptno=10)VALUES(1234,'NewEmp','Clerk',7782,SYSDATE,1200,NULL);DELETE FROM TABLE(SELECT emps FROM dept_and_emps WHERE deptno=20)WHERE ename='SCOTT';一般而言,必须总是连接,而不能单独查询嵌套表(如EMPS)中的数据,但是如果确实需要,是可以的。提示NESTED_TABLE_GET_REFS被用于EXP和IMP处理嵌套表。SELECT /*+NESTED_TABLE_GET_REFS+*/&&&&NESTED_TABLE_ID, SYS_NC_ROWINFO$FROM "TKYTE"."EMPS_NT";而我们察看EMPS_NT的表结构是看不到NESTED_TABLE_ID,SYS_NC_ROWINFO$两列的。对父表DEPT_AND_EMP来说NESTED_TABLE_ID是一个外键。使用这个提示就可以直接操作嵌套表了:UPDATE&&/*+NESTED_TABLE_GET_REFS+*/ emps_ntSET ename=INITCAP(ename);嵌套表存储上例中,现实产生了两张表:DEPT_AND_EMPdeptno&&&&&& NUMBER(2)dname&&&&&& VARCHAR2(14)loc&&&&&& VARCHAR2(13)SYS_NC$&&&&&& RAW(16)EMPS_NTSYS_NC_ROWINFO$&&&&&& NESTED_TABLE_ID&&&&&& RAW(16)empno&&&&&& NUMBER(4)ename&&&&&& VARCHAR2(10)job&&&&&& VARCHAR2(9)mgr&&&&&& NUMBER(4)hiredate&&&&&& DATEsal&&&&&& NUMBER(7,2)comm&&&&&& NUMBER(7,2)默认情况下,每个嵌套表列都产生一个额外的RAW(16)隐藏列,并在其上创建了唯一约束,用以指向嵌套表。而嵌套表中有两个隐藏列:SYS_NC_ROWINFO$是作为一个对象返回所有标量元素的一个伪列;另一个NESTED_TABLE_ID的外键回指向父表。可以看到真实代码:CREATE TABLE TKYTE.DEPT_AND_EMP(DEPTNO&&NUMBER(2,0),DNAME&&&&VARCHAR2(14),LOC&&&&&&&&VARCHAR2(13),EMPS&&&&&&EMP_TAB_TYPE)PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 LOGGINGSTORAGE(INITIAL 131072 NEXT 131072&&&&&&&&&&&&&& MINEXTENTS 1 MAXEXTENTS 4096&&&&&&&&&&&&&& PCTINCREASE 0 FREELISTS 1 FREELIST GROUP 1&&&&&&&&&&&&&& BUFFER_POOL DEFAULT)TABLESPACE USERNESTED TABLE EMPSSTORE AS EMPS_NTRETURN BY VALUE;RETURN BY VALUE用来描述嵌套表如何返回到客户应用程序中。NESTED_TABLE_ID列必须是索引的,那么较好的解决办法就是使用IOT存储嵌套表。CREATE TABLE TKYTE.DEPT_AND_EMP(DEPTNO&&NUMBER(2,0),DNAME&&&&VARCHAR2(14),LOC&&&&&&&&VARCHAR2(13),EMPS&&&&&&EMP_TAB_TYPE)PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 LOGGINGSTORAGE(INITIAL 131072 NEXT 131072&&&&&&&&&&&&&& MINEXTENTS 1 MAXEXTENTS 4096&&&&&&&&&&&&&& PCTINCREASE 0 FREELISTS 1 FREELIST GROUP 1&&&&&&&&&&&&&& BUFFER_POOL DEFAULT)TABLESPACE USERNESTED TABLE EMPSSTORE AS EMPS_NT((empno NOT NULL,&&UNIQUE(empno),&&PRIMARY KEY(nested_table_id,empno))&&ORGANIZATION INDEX COMPRESS 1)RETURN BY VALUE;这样与最初默认的嵌套表相比,使用了较少的存储空间并有最需要的索引。不使用嵌套表作为永久存储机制的原因1.增加了RAW(16)列的额外开销,父表和子表都将增加这个额外的列;2.当通常已经有唯一约束时,父表上的唯一约束是额外开销;3.没有使用不支持的结构(NESTED_TABLE_GET_REFS),嵌套表不容易使用。一般推荐在编程结构和视图中使用嵌套表。如果要使用嵌套表作为存储机制,确保嵌套表是IOT,以避免NESTED_TABLE_ID和嵌套表本身中索引的额外开销。6.7 临时表Oracle
的临时表与其他数据库中的不同,其定义是“静态”的。以事务(ON COMMIT DELETE ROWS)或者会话(ON COMMIT
ROWS)为基础,只是说明数据的生命期,而在数据库中创建临时表一次,其结构总是有效的,被作为对象存在数据字典中了,这样也就允许对临时表建立视图、
存储过程中用静态SQL引用临时表等等。在实际开发中,考虑到DDL是消耗较大的操作,应该避免在运行时操作,而是将应用程序需要的临时表在程序安装时就创建,而只是在存储过程中简单的INSERT、SELECT。临时表不支持的永久表的特性有:1. 不能用参照完整性约束,也不能被参照完整性约束所引用;2. 不能有VARRAY或者NESTED TABLE类型的列;3. 不能是IOT;4. 不能是索引或者散列聚簇;5. 不能分区;6. 通过ANALYZE命令不能产生统计信息,也即是说优化器在临时表上没有真正的统计功能。由于缺少统计功能,那么CBO(基于成本的优化器)的性能将受到极大的影响,因此应当尽可能使用INLINE VIEW。要让临时表拥有正确的统计信息,CBO产生正确的决策,可以先建立一张结构与临时表完全相同的普通表:CREATE TABLE temp_all_objectsASSELECT * FROM all_objects WHERE 1=0;CREATE INDEX temp_all_objects_idx ON temp_all_objects(object_id);选择插入代表性数据后进行分析:...ANALYZE TABLE temp_all_objects COMPUTE STATISTICS FOR ALL INDEX;BEGIN&&DBMS_STATS.CREATE_STAT_TABLE(ownname => USER,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&stattab => 'STATS');&&DBMS_STATS.EXPORT_TABLE_STATS(ownname => USER,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&tabname => 'TEMP_ALL_OBJECTS',&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&stattab => 'STATS');&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&DBMS_STATS.EXPORT_INDEX_STATS(ownname => USER,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&tabname => 'TEMP_ALL_OBJECTS_IDX',&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&stattab => 'STATS');END;建立临时表:DROP TABLE temp_all_CREATE GLOBAL TEMPORARY TABLE temp_all_objectsASSELECT * FROM all_objects WHERE 1=0;导入正确的信息后CBO将使用这些信息决定执行模式:CREATE INDEX temp_all_objects_idx ON temp_all_objects(object_id);BEGIN&&DBMS_STATS.IMPORT_TABLE_STATS(ownname => USER,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&tabname => 'TEMP_ALL_OBJECTS',&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&stattab => 'STATS');&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&DBMS_STATS.IMPORT_INDEX_STATS(ownname => USER,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&tabname => 'TEMP_ALL_OBJECTS_IDX',&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&stattab => 'STATS');END;6.8 对象表基于类型(Type)创建的表,而不是作为列的集合。创建语法:CREATE TABLE t OF some_对于下例:CREATE OR REPLACE TYPE address_typeAS OBJECT(city&&&& VARCHAR2(30),street&&VARCHAR2(30),state&& VARCHAR2(2),zip&&&&&&NUMBER);CREATE OR REPLACE TYPE person_typeAS OBJECT(name&&&&VARCHAR2(30),dob&&&&&& DATE,home_address address_type,work_address&&address_type);CREATE TABLE people OF person_通过执行如下语句,可以看到数据库中实际存放的结构:SELECT name,segcollengthFROM SYS.COL$WHERE obj#=(SELECT object_idFROM user_objectsWHERE object_name='PEOPLE');PEOPLESYS_NC_OID$&&&&&& 16SYS_NC_ROWINFO$&&&&&& 1NAME&&&&&& 30DOB&&&&&& 7HOME_ADDRESS&&&&&& 1SYS_NC00006$&&&&&& 30SYS_NC00007$&&&&&& 30SYS_NC00008$&&&&&& 2SYS_NC00009$&&&&&& 22WORK_ADDRESS&&&&&& 1SYS_NC00011$&&&&&& 30SYS_NC00012$&&&&&& 30SYS_NC00013$&&&&&& 2SYS_NC00014$&&&&&& 22SYS_NC_OID$是系统为表产生的Object ID,RAW(16),其上有唯一性索引。它是一主键为基础,并不是系统产生的,是一个伪列,且没有在硬盘上真正消耗空间;SYS_NC_ROWINFO$类似于嵌套表中,可作为单独一列返回整行;NAME, DOB是表中原有标量;HOME_ADDRESS, WORK_ADDRESS可作为单个对象,返回所代表的列的集合;SYS_NCnnnnn$是内嵌对象类型的标量实现。
阅读(3339) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
管理员必备金蝶K3数据库各表说明
下载积分:800
内容提示:管理员必备金蝶K3数据库各表说明
文档格式:XLS|
浏览次数:36|
上传日期: 18:59:56|
文档星级:
该用户还上传了这些文档
管理员必备金蝶K3数据库各表说明
官方公共微信数据库Oracle强化练习之多表查询
列出所有雇员的姓名及其直接上级的姓名
Select a.ename,a.mgr,b.ename,b.empno From emp a,emp b where a.mgr=b.empno(+);
列出部门名称和这些部门的雇员,同时列出那些没有雇员的部门
Select dept.deptno,dname,ename From emp,dept where emp.deptno(+)=dept.
显示所有部门在&NEW YORK&(dept表 loc字段)的员工姓名
Select e.ename From emp e,dept d Where e.deptno=d.deptno and d.loc=’NEW YORK’;
显示员工&SMITH&的姓名,部门名称
Select e.ename,d.dname From emp e,dept d where e.deptno=d.deptno and e.ename=’SMITH’;
显示员工姓名,部门名称,工资,工资级别(salgrade表 grade字段),要求工资级别大于4级
Select e.ename,d.dname,e.sal,s.grade From emp e,dept d,salgrade s where e.deptno=d.deptno and e.sal between s.losal and s.hisal and s.grade &4;
显示员工&KING&和&FORD&管理的员工姓名及其经理姓名
Select e1.ename,e2.ename From emp e1,emp e2 where e1.mgr=e2.empno and (e2.ename=’KING’or e2.ename=’FORD’);
显示员工名,参加工作时间,经理名,参加工作时间:参加工作时间比他的经理早
Select e1.ename,e1.hiredate,e2.ename,e2.hiredate From emp e1,emp e2 where e1.mgr=e2.empno and e1.hiredate&e2.
顶一下(0) 踩一下(0)
热门标签:查询数据记录,是指从数据库对象表中获取所要查询的数据记录,该操作可以说是数据最基本的操作之一,也是使用频率最高、最重要的数据操作。
1、单表数据记录查询
1.1、简单数据查询
SELECT field1,field2,&,fieldn FROM table_name,filed可以是表中所有的字段,也可以是部分字段。
SELECT * FROM table_name ,从表中查询所有的数据。*符号可以代替所有的字段,但是这种方式不够灵活,只能按照表中字段的顺序固定进行显示,不能够随便改变字段的显示顺序。
1.2、避免重复数据查询
例如查询雇员表中,job的数据,雇员表的数据如下:
我们从数据表中发现工作一列的记录数据是有重复的,如果直接查询& SELECT job FROM t_emp,会发现结果也是有重复的,此时我们需要一个关键字 DISTINCT,SELECT DISTINCT job FROM t_emp,此时就会将结果重复的记录给去除了,如下:
同理,我们也可以去除多列的重复的字段,DISTINCT后面的所有的字段只要有一个字段不一样,就表示不是重复记录。例如SELECT DISTINCT job,mgr FROM t_emp 和 SELECT DISTINCT mgr,job FROM t_emp ,虽然查询字段的顺序不一样但是记录结果是一致的。
1.3、在查询中实现运算
例如在员工表中,已经有了员工的工资了,但是我们想要员工的年薪,则可以如此实现:SELECT ename,sal,sal*12 AS yearsal FROM t_emp ,其中AS是MySQL中提供的一种修改字段名的机制。AS也可以不要,直接写字段名。
1.4、条件数据查询
SELECT field1,field2,&,fieldn FROM table_name WHERE CONDITION,前面我们已经介绍过关于关系运算符。
查询范围内的记录数据:SELECT ename,sal FROM t_emp WHERE sal BETWEEN 1000 AND 2000.
查询某项工作的员工记录数据:SELECT ename,job FROM t_emp WHERE job='CLERK'.
查询某个集合内记录数据,SELECT field1,field2,&,fieldn FROM table_name WHERE& filed in(value1,value2,&,valuen)
查询不在集合内的记录数据,SELECT field1,field2,&,fieldn FROM table_name WHERE& filed NOT in(value1,value2,&,valuen)
注意:如果查询集合中有NULL值的话,使用IN的时候查询结果不会有改变,使用NOT IN的时候,则不会有任何结果。
模糊查询:例如查询以字母M开头的员工的数据记录,
1.5、排序查询
SELECT field1,field2,&,fieldn FROM table_name WHERE CONDITION ORDER BY field
ASC 升序,DESC 降序,默认是升序排序。
例如:SELECT * FROM t_emp ORDER BY sal ASC,hiredate DESC,这表示先按工资升序排序,再按日期降序排序。
1.6、限制查询数据
SELECT field1,field2,&,fieldn FROM table_name WHERE CONDITION LIMIT OFFSET_START,ROW_COUNT,
OFFSET_START 表示数据记录的起始偏移量,ROW_COUNT表示要查询的数据条数。其中OFFSET_START可以指定也可以不指定,LIMIT关键字经常被应用于分页系统中。
不指定初始位置,如果显示记录数小于总的记录数,则会显示指定的条数。如果显示的记录数大于总的记录数,则会显示所有的记录数。
指定初始位置,LIMIT 0,5,表示从第一条记录开始显示,共显示5条记录, LIMIT 5,5,表示从第六条记录开始,共显示5条记录。
1.7、统计函数
COUNT(),统计表中的记录数
AVG(),计算某个字段的平均值
SUM(),计算某个字段的和
MAX().计算某个字段的最大值
MIN(),计算某个字段的最小值
在实际应用中,统计函数经常与分组一起使用,对于MySQL所支持的统计函数,如果所操作的表中没有任何数据记录,COUNT函数返回0,其他的返回NULL。
分组GROUP BY。如果想要显示每个分组的字段的话,则可以通过函数GROUP_CONCAT() 来显示。
例如,将员工表按照部门号分组,并且显示每组中员工的个数以及名字。
如果想对分组进行条件限制,绝对不能通过关键字WHERE来实现,因为该关键字主要是用来实现条件限制数据记录,可以通过HAVING来实现条件限制分组记录数据。
例如,对员工表按照部门进行分组,然后显示每组平均工资高于2000的员工名字。
2、多表数据记录查询
MySQL中可以通过两种语法形式来实现连接查询,一种是在FROM子句中利用逗号区分多个表,在WHERE子句中通过逻辑表达式来实现匹配条件从而实现表的连接。另一种方式,在FROM子句中使用JOIN&ON关键字,而连接条件写在ON子句中,推荐使用第二种方式。
第一种语法:SELECT filed1,field2&fieldn FROM table_name1,table_name2 WHERE table_name1.fieldx=table_name2.fieldy.
第二种语法:SELECT filed1,field2&fieldn FROM table_name1 JOIN table_name2 ON table_name1.fieldx=table_name2.fieldy.
2.1、内连接查询
内连接可以是多个表的连接,也可以是一个表的连接也称之为自连接。
例如,在员工表中查询每一个员工的姓名、职位以及领导名字。通过分析,我们可以知道,员工的领导同样也是员工,这就是自连接。
2.2、外连接查询
外连接可以分为三种,左外连接LEFT、右外连接RIGHT、全外连接FULL。
左外连接指的是新关系中执行匹配条件时以关键字LEFT JOIN左边的表为参考表,如果左边表中数据对应的右边表没有数据的时候,依然会显示,而INNER JOIN则会去掉该条记录。
同样是上面的例子,如果是左连接的时候查询结果会有不同,如下所示:
右外连接指的是新关系中执行匹配条件时以关键字RIGHT JOIN右边的表为参考表,如果右边表中数据对应的左边表没有数据的时候,依然会显示,而INNER JOIN则会去掉该条记录。
2.3、合并查询数据记录
在MySQL中可以通过关键字UNION来实现并操作,可以将多个SELECT语句查询结果合并在一起。
UNION 会把查询结果直接合并在一起,同时会去掉重复的数据记录。
UNION ALL会把查询结果直接合并在一起,并没有去掉重复的记录。
2.4、子查询
所谓的子查询就是指一个查询之中嵌套了其他的若干个查询,即在一个SELECT查询语句的WHERE或这FROM子句中包含另一个SELECT查询语句。
2.4.1、子查询结果返回单行单列
例,查询员工表中,工资比员工SMITH工资高的员工信息。
2.4.2、子查询结果返回单行多列
例,查询员工表中,工资和置为都和员工SMITH一样的所有的员工信息。
2.4.3、子查询结果返回多行多列
此时,子查询语句一般会在主查询语句的WHERE子句里出现,并且通常会包含IN、ANY、ALL、EXISTS等关键字。
关键字ANY用来表示主查询的条件满足子查询返回结果中的任意一条记录。
=ANY 其功能与IN一样,
&ANY 比子查询中返回数据记录中的最小的还要大的数据记录。
&ANY 比子查询中返回数据记录中的最大的还要小的数据记录。
关键字ALL用来表示主查询的条件为满足子查询返回结果中所有数据记录。
&ALL 比子查询返回数据记录还要大的数据记录。
&ALL 比子查询返回数据记录还要小的数据记录。
阅读(...) 评论()}

我要回帖

更多关于 gi 开头是那个数据库 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信