CREATE TABLE 表名字(
id NUMBER(4),--4表示存储的为一个4位整数 name VARCHAR2(20),--长度为20个字节 gender CHAR(1), --定长为1个字节 不可改变 birth DATE,--日期
salary NUMBER(6,2),---存储6位数字其中2为是小数部分
job VARCHAR2(30),--可变字节长度 存储内容可以小于等于30个字节 deptno NUMBER(2) )
--删除表 DROP TABLE 表名字
--数据库中所有数据类型的默认值都是null, --可以在创建表的时候使用OEFAULT关键字 --为字段单独指定默认值。当插入数据时若 --该字段没有指定值,则使用指定的默认值 --作为该字段的值
--字符串的值在数据库中是使用单引号扩起来的, --这一点与java不同,而且字符串的值是区分大小写的。
CREATE TABLE 表名字( id NUMBER(4),
name VARCHAR2(20) NOT NULL,--not null 表示这个值不能为空
gender CHAR(1) DEFAULT 'M', --DEFAULT 'M'表示当不给指定值时 系统默认为M; birth DATE,
salary NUMBER(6,2),
job VARCHAR2(30), deptno NUMBER(2) )
--查看表结构 --DESC 表名 --如 DESC 表名
--修改表 --1:修改表名字
--RENAME old_name TO new_name
-2:修改表结构 --2.1:添加新字段 --2.2:修改现有字段 --2.3:
--2.1:向表中添加字段hiredate
ALTER TABLE myemp_xuzhiguo ADD( hiredate DATE)
--2.2:修改现有字段
--需要注意,可以修改字段的类型,长度, --添加非空元素或指定默认值。但是这些最好都 --是在表中没有数据的时候进行,若表中含有数据,
--那么做好不要修改字段类型,修改长度时尽量增加而不是减小, --否则可能修该失败
ALTER TABLE 表名字
MODIFY ( job VARCHAR(20))
--2.3:删除表中现有字段
--
ALTER TABLE 表名字
DROP(hiredate)
--DML语句,数据操作语言
--DML语句是对表中的数据进行操作的,DML是伴随事务(TCL)的。包括增,删,该 --INSERT 语句
--INSERT语句用于向表中插入新数据
INSERT INTO 表名字 (id,name,salary,deptno) VALUES
(1,'HAHA',1151,10)
SELECT * FROM 表名字--查看表中内容
--插入日期类型数据
--可以使用数据库提供的内置函数TO_DATE将一个字符串 --按照指定的日期格式转换为一个DATE类型数据
INSERT INTO 表名字
(id,name,birth) VALUES
(3,'tom',TO_DATE('1992-08-07','YYYY-MM-DD'))
SELECT * FROM myemp_xuzhiguo --查看当前内容
--2:UPDATE语句
--UPDATE语句通常需要使用WHERE子句添加条件,这样会将该表中满足条件的记录进行修改,
--若不满足添加条件则整张表所有记录都会修改
UPDATE 表名字
SET salary=4000,deptno=30 WHERE id=1
--3:DELETE语句
--DELETE语句用于将表中记录删除,同样需要使用 --WHERE去添加条件,以删除表中满足条件的记录 --若不添加,则是清空表操作
DELETE FROM 表名字 WHERE NAME= 'HAHA'
--DQL语句
--查询语句用来检索数据用
--SELECT子句用来指定要查询的字段 --若写“*”则表示查询所有字段 --FROM子句用来指定数据来源的表
SELECT*FROM emp_xuzhiguo
SELECT empno,ename,job,sal FROM emp_xuzhiguo
--SELECT子句中也允许使用函数或表达式 --这样可以将结果查询出来 --查看每个员工年薪如下:
SELECT ename,sal*12 FROM emp_xuzhiguo
--在DQL中使用WHERE子句也可以只查询出满足条件的记录 --查看职位是“CLERK”的员工 SELECT ename,job,sal FROM emp_xuzhiguo WHERE job='CLERK'
--查看工资大于2500的 SELECT ename,job,sal FROM emp_xuzhiguo WHERE sal>2500
--字符串函数 --CONCAT(c1,c2) --链接字符串
SELECT CONCAT(ename,sal) FROM emp_xuzhiguo
--把名字和工资哦之间加\
SELECT CONCAT(CONCAT(ename,','),sal) FROM emp_xuzhiguo
--\"||\"也可以链接字符串 SELECT ename||','||sal FROM emp_xuzhiguo
--LENGTH(c):求字符串长度(字符)
SELECT ename,LENGTH(ename) FROM emp_xuzhiguo
--UPPER,LOWER,INITCAP
--将字符串转换为全大写,全小写,首字母大写
--伪表:DUAL,当查询的内容与任何表没有关系时, --可以在FROM字句中查询该表,会查寻出一条记录
SELECT UPPER('helloworLd'), LOWER('HELLOWORLD'), INITCAP('hellow world') FROM dual
--TRIM,LTRIM,RTRIM --去除字符串两边指定字符
SELECT TRIM('e' FROM 'eeeeliteee') FROM dual
--去除左边se
SELECT LTRIM('eeeesesliteee','se') FROM dual
--LPAD,RPAD补位函数
--允许将指定的字符串显示指定的位数,不足时补充 --若干指定字符达到该长度。 SELECT LPAD(sal,5,'$') FROM emp_xuzhiguo --左对齐
SELECT RPAD(SAL,5,' ') FROM emp_xuzhiguo
--SUBSTR(str,m[,n])
--将给定字符串从m处开始连续截取n个字符,空格也算 --n不指定则截取到末尾,n超过可以截取的数量 --也是截取到末尾,
--m可以是负数,负数则是从倒数位置开始 --数据库中的下标从1开始不是从0开始
SELECT
SUBSTR ('thinking in java',-7,2) FROM dual
SELECT
SUBSTR('thinking in java',7,2) FROM dual
--INSTR (c1,c2,m,n) --查看c2在c1中的位置
--m用来指定从哪里开始检索,不写则默认从第一个字符开始 --n表示第几次出现,不写默认为1 SELECT
INSTR('thinking in java','in',4,2) FROM dual
-- 数值函数
--ROUND(M,N):四舍五入 --n为保留到小数点后的位数, --若n为负数则是10位以上的数字 SELECT ROUND (55.666,1) FROM dual
SELECT ROUND (55.655,0) FROM dual
SELECT ROUND (45.777,-2) FROM dual
--TRUNC(m,n)函数:截取数字 SELECT TRUNC (55.678,1) FROM dual SELECT TRUNC (55.678,0) FROM dual SELECT TRUNC (55.678,-2) FROM dual
--MOD(m,n)求余数
SELECT ename,MOD(sal,1000) FROM EMP_XUZHIGUO
--CEIL,FLOOR向上取整向和下取整 SELECT CEIL(45.678) FROM dual SELECT FLOOR(45.678) FROM dual
--日期相关函数 --和日期相关的关键字
--SYSDATE :返回一个DATE类型数据,表示当前系统时间
--SYSTIMESTAMR:返回一个时间戳类型数据,表示当前系统时间,更精确 SELECT SYSDATE FROM dual
SELECT SYSTIMESTAMP FROM dual
--TO_DATE函数
--将一个字符串按照给定的日期格式解析为date SELECT TO_DATE (
'1993-01-05 14:22:55', 'YYYY-MM-DD HH24:MI:SS' )
FROM dual
在日期格式字符串中,除英文,数字,符号外的其他字符都要使用双引号扩起来 SELECT TO_DATE (
'1993年01月05日 14时22分55秒', 'YYYY\"年\"MM\"月\"DD\"日\" HH24\"时\"MI\"分\"SS\"秒\"' )
FROM dual
--TO_CHAR函数
--可以将一个DATE按照给定的日期格式转换为字符串 SELECT
TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') FROM dual
--日期类型是可以进行计算的:
--1:对一个日期加减一个数字等同与加减天数 --2:两个日期相减,差为相差天数
--同样,日期间也可以比较大小,越晚越大。
--查看每个员工入职到今天多少天了 SELECT ename,SYSDATE-hiredate FROM emp_xuzhiguo
SELECT SYSDATE+1 --今天开始加1天 FROM dual
--LAST DAY_(date):
--返回给定日期所在月的月底日期
--当月月底是那一天 SELECT LAST_DAY(SYSDATE) FROM dual
--ADD_MOUNTHS(date,i)
--计算指定日期加上指定的月后的日期 若i是负数,则为减法。
查看每个员工入职20周年纪念日 SELECT
ename,ADD_MONTHS(hiredate,12*20) FROM emp_xuzhiguo
--MONTHS_BETWEEN(d1,d2) --计算两个日期之间相差几个月
SELECT
ename,MONTHS_BETWEEN(SYSDATE,hiredate) FROM emp_xuzhiguo
--NEXT_DAY(date,i)
-- 返回给定日期之后一周内的指定周几的日期
SELECT
NEXT_DAY(SYSDATE,1) --表示明天开始下个周日是几号 FROM dual
--LEAST,GREATEST函数 --求最小值与最大值 SELECT
LEAST(SYSDATE,TO_DATE('2008-08-08','YYYY-MM-DD')) FROM dual
--EXTRACT函数,提取指定日期时间分量的值 SELECT EXTRACT(YEAR FROM SYSDATE) FROM dual
--查看1980年入职的员工
SELECT ename,hiredate FROM emp_xuzhiguo WHERE
EXTRACT(YEAR FROM hiredate)=1981
CREATE TABLE student_xuzhiguo( id NUMBER(4), name CHAR(20), gender CHAR(20) )
INSERT INTO student_xuzhiguo VALUES(1000,'李莫愁','f'); INSERT INTO student_xuzhiguo VALUES(1001,'林瓶只',NULL); INSERT INTO student_xuzhiguo(id,name) VALUES(1002,'张无忌');
SELECT * FROM student_xuzhiguo
UPDATE student_xuzhiguo SET gender= NULL WHERE ID = 1000
--使用null作为判断条件 --将性别为null的记录删除 DELETE FROM student_xuzhiguo WHERE gender IS NULL
--NULL 的运算
--NULL与字符串链接等于什么都没做
--NULL与数字链接运算结果还是NULL
-- 查看每个员工收入(工资+绩效)
SELECT ename,sal,comm,sal+comm--只要一项为null结果就为null FROM emp_xuzhiguo
--空值函数 --NVL(f1,f2)
--当f1为null时,函数返回f2的值,否则返回f1自身 --所以NVL函数的作用是将null值替换为非null
-- 查看每个员工收入(工资+绩效)方法1 SELECT ename,sal,comm,sal+NVL(comm,0) FROM emp_xuzhiguo
--查看绩效情况,有绩效的显示“有绩效” --为null的显示为“没有绩效” --NVL2(f1,f2,f3)函数
--当f1不为null时函数返回f2 --当f1为null时函数返回f3
SELECT ename,sal,comm,NVL2(comm,'有绩效','没有绩效') FROM emp_xuzhiguo
-- 查看每个员工收入(工资+绩效)方法2
SELECT ename ,sal,comm,NVL2(comm,sal+comm,sal) FROM emp_xuzhiguo
--EXTRACT函数,提取指定日期指定时间分量的值 --SELECT EXTRACT(YEAR FROM SYSDATE) --FROM dual
--查看1980年入职的员工
SELECT ename,hiredate FROM emp_lusenbao WHERE
EXTRACT(YEAR FROM hiredate)=1981
CREATE TABLE student_lusenbao
(id NUMBER(4),name ChAR(20),gender CHAR(1));
INSERT INTO student_lusenbao VALUES(1000,'李莫愁','F');
INSERT INTO student_lusenbao VALUES(1001,'林平之',NULL);
INSERT INTO student_lusenbao(id,name) VALUES(1002,'张无忌')
DESC student_lusenbao
SELECT * FROM student_lusenbao
UPDATE student_lusenbao SET gender = NULL WHERE id = 1000
--使用NULL作为判断条件 --将性别为NULL的记录删除 DELETE FROM student_lusenbao WHERE gender IS NULL
--NULL的运算
--NULL与字符串连接等于什么都没做 --NULL与数字运算结果还是NULL -- 查看每个员工的收入(工资+绩效)
SELECT ename,sal,comm,sal+comm-----只要一行为null就全部为null FROM emp_lusenbao
--空值函数
--NVL(f1,f2)
--当f1为Null时 ,函数返回f2的值,否返回f1 --自身
--所以NVL函数地做用是将Null值转换为非Null值 SELECT ename,sal,comm,sal+NVL(comm,0) FROM emp_lusenbao
--查看绩效情况,有绩效的显示“有绩效”为Null的则显示“没有绩效” --NVL(f1,f2,f3)函数
--当f1不为Null时函数返回f2 --当f1为Null时,函数返回f3
SELECT ename,sal,comm,NVL2(comm,'有绩效','没有绩效') FROM emp_lusenbao
SELECT ename,sal,comm,NVL2(comm, sal+comm,sal)--sal 工资 comm 绩效 FROM emp_lusenbao
--DQL语句
--查询语句用来检索数据用
--SELECT子句用来指定要查询的字段
--若写“*”则表示查询所有字段
--FROM子句用来指定数据来源的表
SELECT*FROM emp_xuzhiguo
SELECT empno,ename,job,sal
FROM emp_xuzhiguo
--SELECT子句中也允许使用函数或表达式
--这样可以将结果查询出来
--查看每个员工年薪如下:
SELECT ename,sal*12
FROM emp_xuzhiguo
--在DQL中使用WHERE子句也可以只查询出满足条件的记录
--查看职位是“CLERK”的员工
SELECT ename,job,sal
FROM emp_xuzhiguo
WHERE job='CLERK'
--查看工资大于2500的
SELECT ename,job,sal
FROM emp_xuzhiguo
WHERE sal>2500
--字符串函数
--CONCAT(c1,c2)
--链接字符串
SELECT CONCAT(ename,sal)
FROM emp_xuzhiguo
--把名字和工资哦之间加\
SELECT CONCAT(CONCAT(ename,','),sal)
FROM emp_xuzhiguo
--\"||\"也可以链接字符串
SELECT ename||','||sal
FROM emp_xuzhiguo
--LENGTH(c):求字符串长度(字符)
SELECT ename,LENGTH(ename)
FROM emp_xuzhiguo
--UPPER,LOWER,INITCAP
--将字符串转换为全大写,全小写,首字母大写
--伪表:DUAL,当查询的内容与任何表没有关系时,
--可以在FROM字句中查询该表,会查寻出一条记录
SELECT UPPER('helloworLd'),
LOWER('HELLOWORLD'),
INITCAP('hellow world')
FROM dual
--TRIM,LTRIM,RTRIM
--去除字符串两边指定字符
SELECT TRIM('e' FROM 'eeeeliteee')
FROM dual
--去除左边se
SELECT LTRIM('eeeesesliteee','se')
FROM dual
--LPAD,RPAD补位函数
--允许将指定的字符串显示指定的位数,不足时补充
--若干指定字符达到该长度。
SELECT LPAD(sal,5,'$')
FROM emp_xuzhiguo
--左对齐
SELECT RPAD(SAL,5,' ')
FROM emp_xuzhiguo
--SUBSTR(str,m[,n])
--将给定字符串从m处开始连续截取n个字符,空格也算
--n不指定则截取到末尾,n超过可以截取的数量
--也是截取到末尾,
--m可以是负数,负数则是从倒数位置开始
--数据库中的下标从1开始不是从0开始
SELECT
SUBSTR ('thinking in java',-7,2)
FROM dual
SELECT
SUBSTR('thinking in java',7,2)
FROM dual
--INSTR (c1,c2,m,n)
--查看c2在c1中的位置
--m用来指定从哪里开始检索,不写则默认从第一个字符开始
--n表示第几次出现,不写默认为1
SELECT
INSTR('thinking in java','in',4,2)
FROM dual
-- 数值函数
--ROUND(M,N):四舍五入
--n为保留到小数点后的位数,
--若n为负数则是10位以上的数字
SELECT ROUND (55.666,1)
FROM dual
SELECT ROUND (55.655,0)
FROM dual
SELECT ROUND (45.777,-2)
FROM dual
--TRUNC(m,n)函数:截取数字
SELECT TRUNC (55.678,1) FROM dual
SELECT TRUNC (55.678,0) FROM dual
SELECT TRUNC (55.678,-2) FROM dual
--MOD(m,n)求余数
SELECT ename,MOD(sal,1000)
FROM EMP_XUZHIGUO
--CEIL,FLOOR向上取整向和下取整
SELECT CEIL(45.678) FROM dual
SELECT FLOOR(45.678) FROM dual
--日期相关函数
--和日期相关的关键字
--SYSDATE :返回一个DATE类型数据,表示当前系统时间
--SYSTIMESTAMR:返回一个时间戳类型数据,表示当前系统时间,更精确
SELECT SYSDATE FROM dual
SELECT SYSTIMESTAMP FROM dual
--TO_DATE函数
--将一个字符串按照给定的日期格式解析为date
SELECT
TO_DATE (
'1993-01-05 14:22:55',
'YYYY-MM-DD HH24:MI:SS' )
FROM dual
在日期格式字符串中,除英文,数字,符号外的其他字符都要使用双引号扩起来
SELECT
TO_DATE (
'1993年01月05日 14时22分55秒',
'YYYY\"年\"MM\"月\"DD\"日\" HH24\"时\"MI\"分\"SS\"秒\"' )
FROM dual
--TO_CHAR函数
--可以将一个DATE按照给定的日期格式转换为字符串
SELECT
TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS')
FROM
dual
--日期类型是可以进行计算的:
--1:对一个日期加减一个数字等同与加减天数
--2:两个日期相减,差为相差天数
--同样,日期间也可以比较大小,越晚越大。
--查看每个员工入职到今天多少天了
SELECT ename,SYSDATE-hiredate
FROM emp_xuzhiguo
SELECT SYSDATE+1 --今天开始加1天
FROM dual
--LAST DAY_(date):
--返回给定日期所在月的月底日期
--当月月底是那一天
SELECT LAST_DAY(SYSDATE)
FROM dual
--ADD_MOUNTHS(date,i)
--计算指定日期加上指定的月后的日期
若i是负数,则为减法。
查看每个员工入职20周年纪念日
SELECT
ename,ADD_MONTHS(hiredate,12*20)
FROM emp_xuzhiguo
--MONTHS_BETWEEN(d1,d2)
--计算两个日期之间相差几个月
SELECT
ename,MONTHS_BETWEEN(SYSDATE,hiredate)
FROM emp_xuzhiguo
--NEXT_DAY(date,i)
-- 返回给定日期之后一周内的指定周几的日期
SELECT
NEXT_DAY(SYSDATE,1) --表示明天开始下个周日是几号
FROM dual
--LEAST,GREATEST函数
--求最小值与最大值
SELECT
LEAST(SYSDATE,TO_DATE('2008-08-08','YYYY-MM-DD'))
FROM dual
--EXTRACT函数,提取指定日期时间分量的值
SELECT EXTRACT(YEAR FROM SYSDATE)
FROM dual
--查看1980年入职的员工
SELECT ename,hiredate
FROM emp_xuzhiguo
WHERE
EXTRACT(YEAR FROM hiredate)=1981
CREATE TABLE student_xuzhiguo(
id NUMBER(4),
name CHAR(20),
gender CHAR(20) )
INSERT INTO student_xuzhiguo VALUES(1000,'李莫愁','f');
INSERT INTO student_xuzhiguo VALUES(1001,'林瓶只',NULL);
INSERT INTO student_xuzhiguo(id,name) VALUES(1002,'张无忌');
SELECT * FROM student_xuzhiguo
UPDATE student_xuzhiguo
SET gender= NULL
WHERE ID = 1000
--使用null作为判断条件
--将性别为null的记录删除
DELETE FROM student_xuzhiguo
WHERE gender IS NULL
--NULL 的运算
--NULL与字符串链接等于什么都没做
--NULL与数字链接运算结果还是NULL
-- 查看每个员工收入(工资+绩效)
SELECT ename,sal,comm,sal+comm--只要一项为null结果就为null
FROM emp_xuzhiguo
--空值函数
--NVL(f1,f2)
--当f1为null时,函数返回f2的值,否则返回f1自身
--所以NVL函数的作用是将null值替换为非null
-- 查看每个员工收入(工资+绩效)方法1
SELECT ename,sal,comm,sal+NVL(comm,0)
FROM emp_xuzhiguo
--查看绩效情况,有绩效的显示“有绩效”
--为null的显示为“没有绩效”
--NVL2(f1,f2,f3)函数
--当f1不为null时函数返回f2
--当f1为null时函数返回f3
SELECT ename,sal,comm,NVL2(comm,'有绩效','没有绩效')
FROM emp_xuzhiguo
-- 查看每个员工收入(工资+绩效)方法2
SELECT ename ,sal,comm,NVL2(comm,sal+comm,sal)
FROM emp_xuzhiguo
select * from emp_xuzhiguo
select * from dept_xuzhiguo
--在SELECT子句中出现的函数或表达式会
--在结果集中作为字段名,这样的可读性差
--因此这样可以为这样的字段添加别名
--别名中如果希望包含 空格或者区分大小写
--那么该别名需要使用“”扩起来。
SELECT ename,sal*12 sal --\"sal\"
FROM emp_xuzhiguo
--使用>,<,>=,<=,<>,=
SELECT ename,sal FROM emp_xuzhiguo
WHERE sal <2000;
SELECT ename,sal,job FROM emp_xuzhiguo ------DFDFDFSFGVAYRHSTJ
WHERE deptno <>10;
SELECT ename,sal,hiredate FROM emp_xuzhiguo
WHERE hiredate> to_date('1982-1-1','YYYY-MM-DD'); --
--使用AND,OR,关键字
--查询薪水大于1000并且职位是‘clerk’ 的职位信息
SELECT ename,sal,job FROM emp_xuzhiguo
WHERE sal > 1000 AND job = 'CLERK';
----查询薪水大于1000或者职位是‘clerk’ 的职位信息
SELECT ename,sal,job FROM emp_xuzhiguo
WHERE sal > 1000 OR job = 'CLERK';
--链接多个条件
--AND优先级高于OR ,所以可以通过()提高OR的优先级
SELECT ename,sal,job
FROM emp_xuzhiguo
WHERE sal>1000
AND (job='SALESMAN'
OR job='CLERK')
--使用LIKE用于模糊匹配字符串
--有两个通配符
-- _:表示单一的一个字符
-- %:表示任意多个字符(0-多个)
--查看名字第二个字母是A的第四个字母是T的?
SELECT ename,sal,job
FROM emp_xuzhiguo
WHERE ename LIKE '_A_T%'
--查看名字最后一个字母是T
SELECT ename,sal,job
FROM emp_xuzhiguo
WHERE ename LIKE '%T'
--IN(list),NOT IN(list)
--判断在列表中或不在列表中
--他们也常常用在子查询中
SELECT ename,job
FROM emp_xuzhiguo
WHERE job IN ('MANAGER','CLERK');
SELECT ename,job
FROM emp_xuzhiguo
WHERE deptno NOT IN (10,20);
SELECT * FROM emp_xuzhiguo
--BETWEEN....AND..
--判断在一个区间内
--查看该哦内工资在1500到3000之间的员工?
SELECT ename,sal,deptno
FROM emp_xuzhiguo
WHERE sal between 1500 AND 3000;
ALTER TABLE emp_xuzhiguo RENAME COLUMN deotno TO deptno --
--ANY , ALL 通常是联合<,>,<=,>=,的判断
--并且判断是多个值
-->ANY(list):大于列表之一(大于最小即可)
-->ALL(list):大于列表所有(大于最大的)
-- SELECT ename,sal,deptno FROM emp_xuzhiguo 修改列名称 WHERE sal > ALL (4000,6050,4500) --查询条件中使用函数 SELECT ename,sal,job FROM emp_xuzhiguo WHERE ename = UPPER('scott'); --查询条件中使用表达式 SELECT ename ,sal,job FROM emp_xuzhiguo WHERE sal*12>50000; --DISTINCT 关键字 --在 SELECT 子句中使用,用来对指定字段值去除重复行。 --查看公司有哪些职位 SELECT DISTINCT job FROM emp_xuzhiguo --多字段去重时,不保证单一的某个字段的值没有重复,而去重原则是这些字段值的组合没有重复行 SELECT job,deptno FROM emp_xuzhiguo --ORDER BY 子句 --ORDER BY 子句用来排序结果集,该子句只能写在SELECT语句最后一个子句上 --ORDER BY 可以根据给定字段进行升序或者降序排列结果集 --其中ASC为升序,通常不写,因为默认为升序 --DESC 为降序 --查看公司工资排名 SELECT ename,sal,deptno FROM emp_xuzhiguo ORDER BY sal DESC --多字段排序 --排序是有优先级的,首先按照第一个字段的排序方式对结果集进行排序,当第一个字段的值相同时, --才按照第二个字段的排序方式排序这些记录 SELECT ename,deptno,sal FROM emp_xuzhiguo ORDER BY deptno DESC,sal DESC --查看年薪高于20000,并且在10或20号的部门,名字中含有E的员工,按照工资从高到 底排序显示 SELECT ename,sal,deptno FROM emp_xuzhiguo WHERE sal*12>20000 AND ename LIKE '%E%' AND (deptno = 10 OR deptno = 20) ORDER BY sal DESC --聚合函数 --聚合函数是用来统计数据的 --其中包括: --MAX,MIN,SUM,AVG,COUNT --MAX,MIN求最大值与最小值 --SUM,AVG求总和与平均值 --COUNT 统计记录数 SELECT MAX(SAL),MIN(SAL), SUM(SAL),AVG(SAL) FROM emp_xuzhiguo --select * from emp_xuzhiguo --统计记录数, SELECT COUNT(ename) FROM emp_xuzhiguo --聚合函数忽略null值,为null值的不计入统计 SELECT AVG(comm), COUNT(comm) FROM emp_xuzhiguo SELECT AVG(NVL(COMM,0)) FROM emp_xuzhiguo --排序字段若有NULL值,则NULL被认做最大值 SELECT comm FROM emp_xuzhiguo ORDER BY comm DESC --当SELECT 子句出现了聚合函数 --那么不是聚合函数的其他单独字段都必须出现在GROUP BY 子句中。 --反过来则无要求 SELECT ename,MAX(sal) FROM emp_xuzhiguo GROUP BY ename --GROUP BY 子句 --GROUP BY 是配合聚合函数使用的 --GROUP BY 允许将结果集按照给定字段值一样的记录进行分组,然后配合聚合函数对这些分组 --分别进行统计 --查看每个部门的平均工资 SELECT AVG(sal),deptno FROM emp_xuzhiguo GROUP BY deptno --查看平均工资高于2000的那些部门的具体平均工资是多少 SELECT AVG(sal),deptno FROM emp_xuzhiguo WHERE AVG(sal)>2000 GROUP BY deptno --WHERE中不能使用聚合函数当作过滤条件 --原因在于过滤时机不对。 --WHERE 是在检索表中数据的时候进行过滤的,所以WHERE 是用来确定结果集记录数的, --而聚合函数是建立在结果集生成后的数据中进行统计的,所以使用聚合函数过滤是在WHERE之后进行的 -- HAVING 子句 -- HAVING 子句必须出现在GROUP BY 子句之后 -- 作用是添加过滤条件来去除不符合的分组。。 -- HAVING中可以使用聚合函数作为过滤条件。 --查看平均工资高于2000的那些部门的具体平均工资是多少 SELECT AVG(sal),deptno FROM emp_xuzhiguo GROUP BY deptno HAVING AVG(sal)>2000 --查看平均工资高于2000的部门的最高工资与最低工资 SELECT MAX(sal),MIN(sal),deptno FROM emp_xuzhiguo GROUP BY deptno HAVING AVG(sal)>2000 SELECT * FROM emp_xuzhiguo --查看最低工资高于800的那些部门各有多少人 SELECT deptno , COUNT(*) FROM emp_xuzhiguo GROUP BY deptno HAVING MIN(sal)>800 --关联查询 --关联查询只的是数据从多张表中联合查询, --结果集中的字段来自不同表 --关联查询中用于指定表与表的数据的 --联系的条件成为关联条件 --通常关联查询中都要写关联条件,因为不写 --会产生笛卡尔积,通常情况下都是无用的结果集,开销巨大 --查询每个员工的名字以及所在部门的名称 SELECT e.ename ,e.deptno,d.dname FROM emp_xuzhiguo e ,dept_xuzhiguo d WHERE e.deptno = d.deptno --不满足的记录是查询不出来的 --下面的会产生笛卡尔积 SELECT e.ename ,e.deptno,d.dname FROM emp_xuzhiguo e ,dept_xuzhiguo d --N张表关联查询要写至少N-1个链接条件 --过滤条件必须与链接条件同时成立。 --查看在NEW YORK工作的员工都有谁? SELECT e.ename,e.deptno,d.dname,d.loc FROM emp_xuzhiguo e, dept_xuzhiguo d WHERE e.deptno = d.deptno AND d.loc= 'NEW YORN' --查看员工工资高于2000的员工都有谁 --查看该员工的名字,工资,所在部门名字,以及工作所在地 SELECT e.ename,e.sal,d.dname,d.loc FROM emp_xuzhiguo e, dept_xuzhiguo d WHERE e.deptno = d.deptno AND SAL>2000 ---内链接:JOIN --内链接也是关联查询的一种 --多个表链接 --SELECT e.ename,d.dname --FROM emp_xuzhiguo e JOIN dept_xuzhiguo d --ON e.deptno = d.deptno --JOIN *** --ON ***** --WHERE +过滤条件 --查看每个员工的名字以及所在的部门名 SELECT e.ename , d.dname FROM emp_xuzhiguo e JOIN dept_xuzhiguo d ON e.deptno = d.deptno where d.dname='SALES' --外链接 --外链接在关联查询中除了可以将满足链接条件的记录查询出来外, --还可以将不满足链接条件的记录也查询出来。 --外链接分为: --左外链接:LEFT OUTER JOIN --以JOIN左侧表作为驱动表(所有记录都显示)那么当该表记录不满足连接条件时, --那么来自右侧表的字段值为NULL --右外链接:RIGHT OUTER JOIN --全外链接:FULL OUT JOIN --查看每名员工信息 SELECT e.ename ,d.dname FROM emp_xuzhiguo e FULL OUTER JOIN dept_xuzhiguo d ON e.deptno = d.deptno --关联查询中的左外链接和右外链接的 SELECT e.ename , d.dname FROM emp_xuzhiguo e, dept_xuzhiguo d WHERE e.deptno(+) = d.deptno --右外链接 SELECT e.ename , d.dname FROM emp_xuzhiguo e, dept_xuzhiguo d WHERE e.deptno = d.deptno(+) --左外链接 --自链接 --自链接即:当前表的记录可以对应当前表自己的多条记录, --这种设计是为了解决记录属性一样但是又存在父子关系的树状结构数据使用 --常见的:商品类别 --查看员工得名字及其上司的名字 SELECT e.ename ,m.ename FROM emp_xuzhiguo e ,emp_xuzhiguo m WHERE e.mgr = m.empno SELECT e.ename ,m.ename FROM emp_xuzhiguo e JOIN emp_xuzhiguo m ON e.mgr = m.empno(+)--左外链接将king表示出来 --子查询 --子查询是一条查询语句,他是嵌套在其他SQL语句中,作用是为外层SQL提供数据的。 --子查询常用在查询语句中,当然也可以用在DML,DDL中。 --查看与FORD同部门的员工 SELECT ename , sal, deptno FROM emp_xuzhiguo WHERE deptno = (SELECT deptno FROM emp_xuzhiguo WHERE ename = 'FORD' ) --与smith同职位的有谁 SELECT ename , sal,deptno,job FROM emp_xuzhiguo WHERE job = (SELECT JOB FROM emp_xuzhiguo WHERE ename = 'SMITH' ) --查看比公司平均工资高的员工信息 SELECT * FROM emp_xuzhiguo WHERE sal>( SELECT AVG(SAL) FROM emp_xuzhiguo ) --在DDL中使用子查询 --可以基于一个子查询的结果集当作表快速的创建出来 --创建表employee --字段:empno,ename,mgr,sal,job,deptno,dname,loc --数据是基于emp_xuzhiguo , dept_xuzhiguo 现有数据 CREATE TABLE employee_xuzhiguo AS SELECT e.empno,e.ename,e.mgr,e.sal,e.job,e.deptno,d.dname,d.loc FROM emp_xuzhiguo e LEFT OUTER JOIN dept_xuzhiguo d ON e.deptno = d.deptno --select * from employee_xuzhiguo --查询在DML中的应用 --将SMITH所在部门的所有员工工资上浮10% UPDATE emp_xuzhiguo SET sal = sal*1.1 WHERE deptno = (SELECT deptno FROM emp_xuzhiguo WHERE ename = 'SMITH') --select * from emp_xuzhiguo --子查询根据查询结果不同分为: --单行单列,多行单列:常用在EHERE作为过滤条件 --多行多列:常当作表看待 --当判断的是一个多行单列子查询结果时,通常要配合IN,ANY,ALL,使用 --查看与职位是SALESMAN同部门的其他职位员工 SELECT ename , job,deptno FROM emp_XUZhIGUO WHERE deptno IN (SELECT deptno FROM emp_xuzhiguo WHERE job = 'SALESMAN') AND job <>'SALESMAN' --查看比'SALESMAN'和CLERK职位工资都高的员工 SELECT ename,sal FROM emp_xuzhiguo WHERE sal >ALL( SELECT sal FROM emp_xuzhiguo WHERE job IN ('SALESMAN','CLERK') ) --EXISTS 关键字 --EXISTS 在WHERE 中使用,后面跟一个子查询, --子查询的结果不管注具体的值,只关注是否能查询出数据,只要可以则条件成立 --查看有员工的部门信息 SELECT deptno , dname FROM dept_xuzhiguo d WHERE EXISTS (SELECT * FROM emp_xuzhiguo e WHERE d.deptno = e. deptno) --查询部门最低薪水前提是要高于30号部门的最低薪水? SELECT MIN(sal) , deptno FROM emp_xuzhiguo GROUP BY deptno HAVING MIN(SAL)>(SELECT MIN(sal) FROM emp_xuzhiguo WHERE deptno='30' ) --FROM 子句中使用子查询 --该子查询是当作一张表使用的 --查看比自己所在部门平均工资高的员工 SELECT e.ename , e.sal, e.deptno FROM emp_xuzhiguo e,(SELECT AVG(SAL) avg_sal,deptno FROM emp_xuzhiguo GROUP BY deptno) t WHERE e.deptno = t.deptno AND e.sal>t.avg_sal -- SELECT e.ename , e.sal, (SELECT d.dname FROM dept_xuzhiguo d WHERE d.deptno = e.deptno ) dname FROM emp_xuzhiguo e --分页查询 --分页查询其实就是将数据分段查询出来,当数据量大的时候 --经常会使用分页查询技术,这样可以减少资源开销,提高系统响应速度 --标准的SQL中没有定义分页语法,所以不同的数据库分页语法不一样。 --ORACL中使用伪列ROWNUM实现 --ROWNUM是一个伪列,并不存在于任何表中,但是所有表都可以查询该字段,而该字段的值 --就是查询出来的结果集中每条记录的行号,从1开始自动递增。ROWNUM字段的值生成是伴随 --查询进行的过程中的。每当可以从表中查询出一条记录,那么ROWNUM的值就是该条查询出来记录的行号 --由于ROWNUM的值随查询过程中动态生成,并从1开始,所以在使用ROWNUM对结果集编行号时 --不要要使用ROWNUM在WHERE 中做>1以上数字的判断,否则查不到任何数据 --SELECT ROWNUM ,ename , sal, deptno --FROM emp_xuzhiguo --WHERE ROWNUM >1 --查询6-10 SELECT * FROM (SELECT ROWNUM rn ,ename , sal, deptno FROM emp_xuzhiguo ) WHERE rn BETWEEN 6 AND 10 --取排序后的6到10 , SELECT * FROM (SELECT ROWNUM RN ,t.* FROM (SELECT ename,sal,deptno FROM emp_xuzhiguo ORDER BY SAL DESC) t WHERE ROWNUM <=10)--10以后的不需要排序了 WHERE rn >=6 --pageSize(每页显示的条目数):5 --page(页数):2 --start:(page-1)*pageSize+1 --end : oageSize*page --decode函数,可以实现简单的分支结构 SELECT ename,job,sal, DECODE(job, 'MANAGER',SAL*1.2, 'ANALYST',SAL*1.1, 'SALESMAN',SAL*1.05, SAL) bonus FROM emp_xuzhiguo --和DECODE函数功能相类似的有CASE语句,实现类似与if-else的操作------------------------------------------------------ SELECT ename ,sal , JOB CASE job WHEN ( 'MANAGER' THEN SAL*1.2, 'ANALYST' THEN SAL*1.1, 'SALESMAN' THEN SAL*1.05) ELSE sal END bonus FROM emp_xuzhiguo; -- SELECT COUNT (1) , DECODE(job, 'MANAGER','VIP', 'ANALYST','VIP', 'OTHER') FROM emp_xuzhiguo GROUP BY DECODE(job, 'MANAGER','VIP', 'ANALYST','VIP', 'OTHER') --按字段内容排序 --场景: --dept表中按“OPERATIONS”,“ACCOUNTING”,“SALES”排序,无法按照字面数据排序 SELECT deptno,dname,loc FROM DEPT ORDER BY DECODE (DNAME,'OPERATION','1','ACCOUNTING','2','SALES','3') --排序函数 --排序函数允许对结果集按照指定字段分组,然后在组内按照指定字段排序 --之后为每组的记录编行号 --ROW_NUMBER():生成组内连续且唯一的数字 --查看每个部门的工资排名: SELECT ename ,sal,deptno, ROW_NUMBER() OVER ( PARTITION BY deptno ORDER BY sal DESC ) rank FROM emp_xuzhiguo --RANK函数:组内不连续也不唯一的数字 SELECT ename,sal,deptno, RANK()OVER( PARTITION BY deptno ORDER BY sal DESC )rank FROM emp_xuzhiguo --DENSE_RANK生成组内连续但不唯一的数字 SELECT ename, sal ,deptno, DENSE_RANK() OVER( PARTITION BY deptno ORDER BY sal DESC ) rank FROM emp_xuzhiguo CREATE TABLE sales_tab_xuzhiguo( year_id NUMBER NOT NULL, month_id NUMBER NOT NULL, day_id NUMBER NOT NULL, sales_value NUMBER(10,2) NOT NULL ); select * from sales_tab_xuzhiguo INSERT INTO sales_tab_xuzhiguo SELECT TRUNC(DBMS_RANDOM.value(2010,2012))AS year_id, TRUNC(DBMS_RANDOM.value(1,13))AS month_id, TRUNC(DBMS_RANDOM.value(1,32))AS day_id, ROUND(DBMS_RANDOM.value(1,100),2)AS sale_value FROM dual CONNECT BY level <=1000; --合并职位是‘MANAGER’的员工和薪水大于2500的员工集合,查看两种方式 的结果差别 --UNION 交集 SELECT ename,job , sal FROM emp_xuzhiguo WHERE job = 'MANAGER' UNION SELECT ename,job , sal FROM emp_xuzhiguo WHERE SAL>2500; --UNION ALL全交集 SELECT ename,job , sal FROM emp_xuzhiguo WHERE job = 'MANAGER' UNION ALL SELECT ename,job , sal FROM emp_xuzhiguo WHERE SAL>2500; --INTERSECT交集 SELECT ename,job , sal FROM emp_xuzhiguo WHERE job = 'MANAGER' INTERSECT SELECT ename,job , sal FROM emp_xuzhiguo WHERE SAL>2500; --MINUS差集 SELECT ename,job , sal FROM emp_xuzhiguo WHERE job = 'MANAGER' MINUS SELECT ename,job , sal FROM emp_xuzhiguo WHERE SAL>2500; --高级分组函数 --1:ROLLUP --GROUP BY ROLLUP(A,B,C) --等价于 --GROUP BY A,B,C --UNION ALL --GROUP BY A,B --UNION ALL --GROUP BY A --UNION ALL --全表 SELECT year_id,month_id,day_id,SUM(sales_value) FROM sales_tab_xuzhiguo GROUP BY ROLLUP(year_id,month_id,day_id) ORDER BY year_id,month_id,day_id --CUBE()函数 --CUBE的分组次数是2的参数个数次方 --每一种组合都会进行依次分组 SELECT year_id,month_id,day_id,SUM(sales_value) FROM sales_tab_xuzhiguo GROUP BY CUBE (year_id,month_id,day_id) ORDER BY year_id,month_id,day_id --GROUPING sets 函数 --该函数允许自定义分组模式,然后将这些分组结果合并在一个结果集显示。 --其中每个参数为一种分组模式 --查看每天与每月的营业额? SELECT year_id,month_id,day_id,SUM(sales_value) FROM sales_tab_xuzhiguo GROUP BY GROUPING SETS((year_id,month_id,day_id), (year_id,month_id)) --数据库对象 --数据库对象包含:表,视图,索引,序列 --视图VIEW --视图在SQL语句中体现的角色与表一样。但是视图并非真实存在的表, --它只对对应一条查询语句的结果集。 --使用同通常是为了重用子查询,简化SQL语句的复杂度和限制某些数据的访问。 CREATE VIEW v_emp_10_xuzhiguo AS SELECT empno,ename,sal,job,deptno FROM emp_xuzhiguo WHERE deptno=10 DESC v_emp_10_xuzhiguo SELECT * FROM v_emp_10_xuzhiguo --视图中对应的子查询中若含有函数或表达式,那么该字段必须给别名。 --并且字段的别名会成为该视图对应字段的名字。 --OR REPLACE 若表之前创建了则覆盖之前的,若没有则重新创建 CREATE OR REPLACE VIEW v_emp_10_xuzhiguo AS SELECT empno id,ename name,sal*12 salary,job,deptno FROM emp_xuzhiguo WHERE deptno=10 DESC v_emp_10_xuzhiguo SELECT * FROM v_emp_10_xuzhiguo --针对视图的DML操作 --复杂视图不能进行DML操作 --对简单视图进行DML操作就是对该视图数据来源的基础表进行的。 INSERT INTO v_emp_10_xuzhiguo (id,name,salary,job,deptno) VALUES (1001,'JACK',2000,'CLERK',10) SELECT * FROM v_emp_10_xuzhiguo SELECT * FROM emp_xuzhiguo UPDATE v_emp_10_xuzhiguo SET salary=3000 WHERE name='JACK' SELECT * FROM emp_xuzhiguo alter table emp_xuzhiguo rename column deotno to deptno --更改列名------------------------------ --对视图进行DML操作可能会污染基础表数据, --即:对数图进行DML操作后,视图对数据不可见。 INSERT INTO v_emp_10_xuzhiguo (id,name,salary,job,deptno) VALUES (1001,'JACK',2000,'CLERK',20) UPDATE v_emp_10_xuzhiguo SET deptno=20 SELECT * FROM emp_xuzhiguo --删除不会污染 DELECT --为了避免不当的DML操作会污染基表,可以为视图添加检查选项: --WITH CHECK OPTION --当视图添加了该选项后,那么对视图进行DML操作时,视图会检查执行 --该操作后视图是否对操作的记录可见,不可见则不允许该DML操作。 CREATE OR REPLACE VIEW v_emp_10_xuzhiguo AS SELECT empno id,ename name,sal salary,job,deptno FROM emp_xuzhiguo WHERE deptno = 10 WITH CHECK OPTION SELECT * FROM v_emp_10_xuzhiguo SELECT * FROM emp_xuzhiguo --为视图添加只读选项后,该视图不允许进行DML操作 CREATE OR REPLACE VIEW v_emp_10_xuzhiguo AS SELECT empno id,ename name,sal salary,job,deptno FROM emp_xuzhiguo WHERE deptno=10 WITH READ ONLY --数据字典可以查看用户创建的数据库对象信息 SELECT object_name,object_type FROM user_objects WHERE object_name LIKE '%_xuzhiguo' SELECT view_name,text FROM user_views SELECT table_name FROM user_tables WHERE table_name LIKE '%_xuzhiguo' --创建复杂视图 --当视图对应的SQL语句含有函数,表达式分组,去重或关联查询时, --该视图为复杂视图。 --复杂视图不允许进行DML操作。 --创建一个含有每个部门薪资情况的视图 CREATE VIEW v_dept_sal_xuzhiguo AS SELECT MAX(e.sal) max_sal, MIN(e.sal) min_sal, AVG(e.sal) avg_sal, SUM(e.sal) sum_sal, d.deptno,d.dname FROM emp_xuzhiguo e,dept_xuzhiguo d WHERE e.deptno=d.deptno GROUP BY d.deptno,d.dname SELECT * FROM v_dept_sal_xuzhiguo --查看谁的工资高于所在部门的平均工资? SELECT e.ename,e.sal,e.deptno FROM emp_xuzhiguo e,v_dept_sal_xuzhiguo v WHERE e.deptno=v.deptno AND e.sal>v.avg_sal --删除视图 DROP VIEW v_emp_10 --序列 --序列也是数据库对象之一 --序列的作用是生成一系列的数字 --通常使用序列是为表的主键(ID)字段提供值 --创建序列 CREATE SEQUENCE seq_emp_id_xuzhiguo START WITH 1 INCREMENT BY 1 --序列提供了两个伪列用来取数字 --NEXTVAL:获取序列下一个数字 --序列会根据序列最后生成的数字加上步长来得到。 --NEXTVAL会导致序列步进 --序列是不能回退的,发生步进后之前的数字就无法再次获取 --CURRVAL:获取序列最后生成的数字 --在使用CURRVAL之前至少调用过一次NEXTVAL后才可以使用 SELECT seq_emp_id_xuzhiguo.NEXTVAL FROM DUAL SELECT seq_emp_id_xuzhiguo.CURRVAL FROM DUAL --使用SEQ_EMP_ID_XUZHIGUO为emp表提供主键值 INSERT INTO emp_xuzhiguo (empno,ename,job,sal,deptno) VALUES (seq_emp_id_xuzhiguo.NEXTVAL,'JACK','CLERK',2000,10) SELECT * FROM emp_xuzhiguo --删除序列 DROP SEQUENCE seq_emp_id_xuzhiguo --INDEX索引 --索引是为了提高查询效率 --索引的实现是数据库内部完成的 --创建索引 --在EMP表的ENAME列上建立索引 CREATE INDEX idx_emp_ename_xuzhiguo ON emp_xuzhiguo(ename); SELECT*FROM emp_xuzhiguo where ENAME like 'XXX' --如果经常在ORSER BY子句中使用JOB 和sal作为排序依据,可以建立复合索引 CREATE INDEX idx_emp_job_sal_xuzhiguo ON emp_xuzhiguo(job,sal) --如果需要在emp表的ename列上执行大小写无关搜索,可以在此列上建立一个基于UPPER函数的索引: CREATE INDEX emp_ename_upper_idx_xuzhiguo ON emp(UPPER(ename)); --当做下面的查询时,会自动应用上面建立的索引 SELECT * FROM EMP_XUZHIGUO WHERE UPPER(ename) = 'KING' --如果经常在索引列上执行dml操作,需要经常重建重构索引 ALTER INDEX idx_emp_ename_xuzhiguo REBUILD; --修改删除索引 DROP INDEX idx_emp_ename_xuzhiguo --建表时添加非空约束 CREATE TABLE employees_xuzhiguo( eid NUMBER(6), name VARCHAR2(30) NOT NULL, salary NUMBER(7,2), hiredate DATE CONSTRAINT employees_hiredate_nn_xuzhiguo NOT NULL) DESC FROM employees_xuzhiguo -----------------------------------查看表结构 --修改表时添加非空约束 --可以在建表之后,通过修改表的定义,添加非空约束: ALTER TABLE employees_xuzhiguo MODIFY (eid NUMBER(6) NOT NULL); --取消非空约束 --如果业务要求取消某列的非空约束,可以采用重建表或者修改表的方式 ALTER TABLE employees_xuzhiguo MODIFY (eid NUMBER(6) NULL); --添加唯一性约束 --唯一性约束可以保证字段的值在整张表中每条记录都不一样,NULL除外。 CREATE TABLE employees1_xuzhiguo( eid NUMBER(6) UNIQUE, name VARCHAR2(30) , email VARCHAR2(50) , salary NUMBER(7,2), hiredate DATE, CONSTRAINT employees1_email_uk_xuzhiguo UNIQUE(email)); DESC employees1_xuzhiguo -----------------------------------查看表结构 --添加唯一性约束 --在建表之后增加唯一性约束条件 ALTER TABLE employees1_xuzhiguo ADD CONSTRAINT employees1_name_uk_xuzhiguo UNIQUE(name); --添加主键约束 --在建表时添加主键约束条件: --非空且唯一,且一张表只能有一个字段添加主键约束 CREATE TABLE employees2_xuzhiguo( eid NUMBER(6) PRIMARY KEY, name VARCHAR2(30) , email VARCHAR2(50) , salary NUMBER(7,2), hiredate DATE); DESC employees2_xuzhiguo -----------------------------------查看表结构 --检查约束 --员工薪水必须大于2000元 ALTER TABLE employees2_XZG ADD CONSTRAINT employees2_salary_check_XZG CHECK (SALARY>2000) DDL语句 包含 1)CREATE用于创建对象 2)DROP用于删除对象 3)ALTER用于修改表结构 UPDATE用于修改表数据 二 ROUND函数四舍五入 TRUNC函数截取操作 MOD 函数用于求模 AVG 函数用于求平均值 mod求模函数 因篇幅问题不能全部显示,请点此查看更多更全内容