--习题1:写出LAST_NAME列和FIRST_NAME列中间加一个空格连在一起输出,查找出列名为my$name的sql语句
select e.last_name || ' ' || e.first_name as my$name from s_emp e;
select e.last_name || ' ' || e.first_name "my$name" from s_emp e;
---扩充:查找S_EMP表中员工userid为**的入职时间**的信息---
select '员工姓名为'||e.last_name ||''||e.first_name ||'的入职时间'||e.start_date "员工的入职时间" from s_emp e;
---时间只显示年月日--
select '员工姓名为'||e.last_name ||' '||e.first_name ||'的入职时间'|| to_char(e.start_date,'yyyy-mm-dd')
"员工的入职时间" from s_emp e;
--习题2:请查找出表s_emp中,title列不重复的内容
select distinct title from s_emp;
--习题3:s_emp表,查找出员工的id、last_name、年薪,请按照员工的manager_id降序排列,年薪从多到少排序
select id,manager_id,salary*12 "年薪" from s_emp order by manager_id desc,"年薪" desc;
--习题4:在s_emp表中查找出薪水大于1500并小于2000的员工ID、last_name、first_name、salary信息。
select userid,first_name,last_name,salary from s_emp e where salary between 1500 and 2000;
--WHERE SALARY>=1500 AND SALARY<=2000;
--习题5:请在s_emp表中查找出列ID,last_name,筛选出last_name以大写字母M开头或者是小写字母t结尾的信息
select id,last_name from s_emp where last_name like 'M%' or last_name like '%t';
--习题6:找出S_EMP表中,START_DATE是91年的日期,并且以2017.3.28此种格式输出
select to_char(start_date,'YYYY.MM.DD') from s_emp where start_date like '%91';
--习题7:从表S_CUSTOMER,S_REGION中查找出顾客表的NAME、REGION_ID列和区域表的name列,REGION_ID为5号区域
select c.name,c.region_id,r.name from s_customer c,s_region r where c.region_id = r.id and regoin_id = 5;
--习题8:请统计出表S_ORD中,11号销售人员(SALES_REP_ID=11)的顾客数量,以及他的TOTAL平均值
select count(*),avg(total) from s_ord where sales_rep_id = 11;
--习题9:在s_customer表中,统计出信用等级credit_rating为GOOD的顾客数,统计列名为#Cust
select credit_rating,count(*) "#Cust" from s_customer where credit_rating = 'GOOD' group by credit_rating;
--习题10:请用左外连接的oracle语法以及标准sql语法重写以上事例
SELECT E.LAST_NAME,E.ID,C.NAME
FROM S_EMP E,S_CUSTOMER C
WHERE C.SALES_REP_ID=E.ID(+)
ORDER BY E.ID;
SELECT E.LAST_NAME,E.ID,C.NAME
FROM S_CUSTOMER C LEFT OUTER JOIN S_EMP E
ON C.SALES_REP_ID=E.ID
ORDER BY E.ID;
--习题11:在表s_emp中,查询出title列和非'VP'开头的title薪水总和列,此列用别名 PAYROLL显示,查询出该职位的所有员工薪水总和需要大于5000,PAYROLL列按升序排列
SELECT TITLE,SUM(SALARY) PAYROLL
FROM S_EMP
WHERE TITLE NOT LIKE 'VP%'
GROUP BY TITLE
HAVING SUM(SALARY)>5000
ORDER BY PAYROLL;
--习题12:在表s_emp表中,查询出列last_name,title,salary,请仅使用where子查询方法,不能使用group by和having子句,查询出小于salary平均值的员工信息
SELECT LAST_NAME,TITLE,SALARY
FROM S_EMP
WHERE SALARY<(SELECT AVG(SALARY)
FROM S_EMP);
--习题13:请根据下面提供的表S_PHONE创建它的子表S_STUDENT2,
--对于表S_STUDENT2的创建要求是:
--ID列 数值最大位数为10,主键列
--NAME列 最大20个字符,不能为空
--AGE列 数值最大位数为3,检查约束为age大于1小于160
--SEX列 最大字符数为6,检查约束sex是male或female
--GENDER列 最大字符数为20,不能为空
--PHONE列 数值最大位数为11,具有唯一性,在表级别把此列设为外键列,其父表是S_PHONE
--以上所有列的约束条件需要自定义名称,名称请按照'表-列-约束条件'规则定义
--S_STUDENT2表创建好后,请在两张表中分别插入不同数据,验证约束条件是否生效
--提供:
create table s_phone( --创建一个phone父表
id number(11) primary key); --创建id列为11位数字型,主键约束
create table s_student2(
id number(10) constraint pk_s_student2_id primary key, --列名,数字型长度10,约束名,列主键约束
name varchar2(20) constraint nn_s_student2_name not null, --列名,字符型长度20,约束名,列非空约束
age number(3) constraint ck_s_student2_age check(age between 1 and 160),--列检查约束
sex varchar2(6) constraint ck_s_student2_sex check(sex in('male','female')),--列检查约束
gender varchar2(20) constraint nn_s_student2_gender not null, --列非空约束
phone number(11) constraint uk_s_student2_phone unique, --列唯一约束
constraint fk_s_student2_phone foreign key(phone) references s_phone(id) --外键约束
);
insert into s_phone values(13004158667); --在表s_phone中插入数据
insert into s_student2 values(1,'JACK',1,'male','高三一班',13004158667);--插入数据,phone与s_phone中的id一样
--习题14:请对习题13创建的表,分别进行增加列、对增加的列修改其数据类型、增加约束条件、列的重命名、删除列、删除表
ALTER TABLE S_STUDENT2
ADD (CARDID NUMBER(30));
ALTER TABLE S_STUDENT2
MODIFY(CARDID VARCHAR2(18));
ALTER TABLE S_STUDENT2
ADD CONSTRAINT UK_S_STUDENT_CARDID UNIQUE (CARDID);
ALTER TABLE S_STUDENT2
RENAME COLUMN CARDID TO CARD_ID;
DROP TABLE S_STUDENT2;
--习题15:请根据习题14方法创建的表和插入的数据,再使用NSERT INTO子查询方法创建新表和插入数据,并验证其数据类型、约束条件是否生效,创建表代码如下:
CREATE TABLE S_STUDENT2
(
ID NUMBER(10)
CONSTRAINT PK_S_STUDENT2_ID PRIMARY KEY,
NAME VARCHAR2(20)
CONSTRAINT NN_S_STUDENT2_NAME NOT NULL,
AGE NUMBER(3)
CONSTRAINT CK_S_STUDENT2_AGE CHECK(AGE BETWEEN 1 AND 160),
SEX VARCHAR2(6)
CONSTRAINT CK_S_STUDENT2_SEX CHECK(SEX IN('male','female')),
GENDER VARCHAR2(20)
CONSTRAINT NN_S_STUDENT2_GENDER NOT NULL,
PHONE NUMBER(11)
CONSTRAINT UK_S_STUDENT2_PHONE UNIQUE,
CONSTRAINT FK_S_STUDENT2_PHONE
FOREIGN KEY (PHONE)
REFERENCES S_PHONE(ID)
);
INSERT INTO S_PHONE
VALUES (13376410072);
INSERT INTO S_STUDENT2
VALUES (1,'CLEMET',28,'female','博士生一班',13376410072);
COMMIT;
INSERT INTO S_PHONE
VALUES (15972725151);
INSERT INTO S_STUDENT2
VALUES (2,'JOMM',26,'female','博士生二班',15972725151);
COMMIT;
INSERT INTO S_PHONE
VALUES (18063239145);
INSERT INTO S_STUDENT2
VALUES (3,'HOAT',25,'male','博士生三班',18063239145);
COMMIT;
---------------------------------15题答案-----
CREATE TABLE S_STUDENT3
AS
SELECT ID,NAME,AGE,SEX,PHONE
FROM S_STUDENT2
WHERE ID=1;
INSERT INTO S_STUDENT3
SELECT ID,NAME,AGE,SEX,PHONE
FROM S_STUDENT2
WHERE ID in(2,3);
--习题16:将S_EMP表中41号部门的员工数据查出,存入到视图中,查看数据是否正确存入,删除视图
CREATE VIEW V_EMP
AS
SELECT ID,LAST_NAME,TITLE
FROM S_EMP
WHERE DEPT_ID=41;
SELECT * FROM V_EMP;
SELECT ID,LAST_NAME,TITLE
FROM S_EMP
WHERE DEPT_ID=45;
--删除视图
DROP VIEW V_EMP;
--习题17:请为S_EMP表创建一个序列,步长、开始值、最大、最小值请自定义,使用新建的SEQUENCE向表中插入几条数据,删除序列并删除插入的数据
--创建SEQUENCE
CREATE SEQUENCE SEQ_S_EMP
INCREMENT BY 2
START WITH 60
MAXVALUE 9999999
NOCACHE
NOCYCLE;
--使用SEQUENCE
INSERT INTO S_EMP(ID,LAST_NAME,FIRST_NAME,USERID,START_DATE,MANAGER_ID,TITLE,DEPT_ID,SALARY)
VALUES (SEQ_S_EMP.NEXTVAL,'SS','WANG','WANGSS1','2017/2/13',1,'President',50,8888);
--删除SEQUENCE
DROP SEQUENCE SEQ_S_EMP;
--习题1:写出LAST_NAME列和FIRST_NAME列中间加一个空格连在一起输出,查找出列名为my$name的sql语句 select e.last_name || ' ' || e.first_name as my$name from s_emp e; select e.last_name || ' ' || e.first_name "my$name" from s_emp e; ---扩充:查找S_EMP表中员工userid为**的入职时间**的信息--- select '员工姓名为'||e.last_name ||''||e.first_name ||'的入职时间'||e.start_date "员工的入职时间" from s_emp e; ---时间只显示年月日-- select '员工姓名为'||e.last_name ||' '||e.first_name ||'的入职时间'|| to_char(e.start_date,'yyyy-mm-dd') "员工的入职时间" from s_emp e; --习题2:请查找出表s_emp中,title列不重复的内容 select distinct title from s_emp; --习题3:s_emp表,查找出员工的id、last_name、年薪,请按照员工的manager_id降序排列,年薪从多到少排序 select id,manager_id,salary*12 "年薪" from s_emp order by manager_id desc,"年薪" desc; --习题4:在s_emp表中查找出薪水大于1500并小于2000的员工ID、last_name、first_name、salary信息。 select userid,first_name,last_name,salary from s_emp e where salary between 1500 and 2000; --WHERE SALARY>=1500 AND SALARY<=2000; --习题5:请在s_emp表中查找出列ID,last_name,筛选出last_name以大写字母M开头或者是小写字母t结尾的信息 select id,last_name from s_emp where last_name like 'M%' or last_name like '%t'; --习题6:找出S_EMP表中,START_DATE是91年的日期,并且以2017.3.28此种格式输出 select to_char(start_date,'YYYY.MM.DD') from s_emp where start_date like '%91'; --习题7:从表S_CUSTOMER,S_REGION中查找出顾客表的NAME、REGION_ID列和区域表的name列,REGION_ID为5号区域 select c.name,c.region_id,r.name from s_customer c,s_region r where c.region_id = r.id and regoin_id = 5; --习题8:请统计出表S_ORD中,11号销售人员(SALES_REP_ID=11)的顾客数量,以及他的TOTAL平均值 select count(*),avg(total) from s_ord where sales_rep_id = 11; --习题9:在s_customer表中,统计出信用等级credit_rating为GOOD的顾客数,统计列名为#Cust select credit_rating,count(*) "#Cust" from s_customer where credit_rating = 'GOOD' group by credit_rating; --习题10:请用左外连接的oracle语法以及标准sql语法重写以上事例 SELECT E.LAST_NAME,E.ID,C.NAME FROM S_EMP E,S_CUSTOMER C WHERE C.SALES_REP_ID=E.ID(+) ORDER BY E.ID; SELECT E.LAST_NAME,E.ID,C.NAME FROM S_CUSTOMER C LEFT OUTER JOIN S_EMP E ON C.SALES_REP_ID=E.ID ORDER BY E.ID; --习题11:在表s_emp中,查询出title列和非'VP'开头的title薪水总和列,此列用别名 PAYROLL显示,查询出该职位的所有员工薪水总和需要大于5000,PAYROLL列按升序排列 SELECT TITLE,SUM(SALARY) PAYROLL FROM S_EMP WHERE TITLE NOT LIKE 'VP%' GROUP BY TITLE HAVING SUM(SALARY)>5000 ORDER BY PAYROLL; --习题12:在表s_emp表中,查询出列last_name,title,salary,请仅使用where子查询方法,不能使用group by和having子句,查询出小于salary平均值的员工信息 SELECT LAST_NAME,TITLE,SALARY FROM S_EMP WHERE SALARY<(SELECT AVG(SALARY) FROM S_EMP); --习题13:请根据下面提供的表S_PHONE创建它的子表S_STUDENT2, --对于表S_STUDENT2的创建要求是: --ID列 数值最大位数为10,主键列 --NAME列 最大20个字符,不能为空 --AGE列 数值最大位数为3,检查约束为age大于1小于160 --SEX列 最大字符数为6,检查约束sex是male或female --GENDER列 最大字符数为20,不能为空 --PHONE列 数值最大位数为11,具有唯一性,在表级别把此列设为外键列,其父表是S_PHONE --以上所有列的约束条件需要自定义名称,名称请按照'表-列-约束条件'规则定义 --S_STUDENT2表创建好后,请在两张表中分别插入不同数据,验证约束条件是否生效 --提供: create table s_phone( --创建一个phone父表 id number(11) primary key); --创建id列为11位数字型,主键约束 create table s_student2( id number(10) constraint pk_s_student2_id primary key, --列名,数字型长度10,约束名,列主键约束 name varchar2(20) constraint nn_s_student2_name not null, --列名,字符型长度20,约束名,列非空约束 age number(3) constraint ck_s_student2_age check(age between 1 and 160),--列检查约束 sex varchar2(6) constraint ck_s_student2_sex check(sex in('male','female')),--列检查约束 gender varchar2(20) constraint nn_s_student2_gender not null, --列非空约束 phone number(11) constraint uk_s_student2_phone unique, --列唯一约束 constraint fk_s_student2_phone foreign key(phone) references s_phone(id) --外键约束 ); insert into s_phone values(13004158667); --在表s_phone中插入数据 insert into s_student2 values(1,'JACK',1,'male','高三一班',13004158667);--插入数据,phone与s_phone中的id一样 --习题14:请对习题13创建的表,分别进行增加列、对增加的列修改其数据类型、增加约束条件、列的重命名、删除列、删除表 ALTER TABLE S_STUDENT2 ADD (CARDID NUMBER(30)); ALTER TABLE S_STUDENT2 MODIFY(CARDID VARCHAR2(18)); ALTER TABLE S_STUDENT2 ADD CONSTRAINT UK_S_STUDENT_CARDID UNIQUE (CARDID); ALTER TABLE S_STUDENT2 RENAME COLUMN CARDID TO CARD_ID; DROP TABLE S_STUDENT2; --习题15:请根据习题14方法创建的表和插入的数据,再使用NSERT INTO子查询方法创建新表和插入数据,并验证其数据类型、约束条件是否生效,创建表代码如下: CREATE TABLE S_STUDENT2 ( ID NUMBER(10) CONSTRAINT PK_S_STUDENT2_ID PRIMARY KEY, NAME VARCHAR2(20) CONSTRAINT NN_S_STUDENT2_NAME NOT NULL, AGE NUMBER(3) CONSTRAINT CK_S_STUDENT2_AGE CHECK(AGE BETWEEN 1 AND 160), SEX VARCHAR2(6) CONSTRAINT CK_S_STUDENT2_SEX CHECK(SEX IN('male','female')), GENDER VARCHAR2(20) CONSTRAINT NN_S_STUDENT2_GENDER NOT NULL, PHONE NUMBER(11) CONSTRAINT UK_S_STUDENT2_PHONE UNIQUE, CONSTRAINT FK_S_STUDENT2_PHONE FOREIGN KEY (PHONE) REFERENCES S_PHONE(ID) ); INSERT INTO S_PHONE VALUES (13376410072); INSERT INTO S_STUDENT2 VALUES (1,'CLEMET',28,'female','博士生一班',13376410072); COMMIT; INSERT INTO S_PHONE VALUES (15972725151); INSERT INTO S_STUDENT2 VALUES (2,'JOMM',26,'female','博士生二班',15972725151); COMMIT; INSERT INTO S_PHONE VALUES (18063239145); INSERT INTO S_STUDENT2 VALUES (3,'HOAT',25,'male','博士生三班',18063239145); COMMIT; ---------------------------------15题答案----- CREATE TABLE S_STUDENT3 AS SELECT ID,NAME,AGE,SEX,PHONE FROM S_STUDENT2 WHERE ID=1; INSERT INTO S_STUDENT3 SELECT ID,NAME,AGE,SEX,PHONE FROM S_STUDENT2 WHERE ID in(2,3); --习题16:将S_EMP表中41号部门的员工数据查出,存入到视图中,查看数据是否正确存入,删除视图 CREATE VIEW V_EMP AS SELECT ID,LAST_NAME,TITLE FROM S_EMP WHERE DEPT_ID=41; SELECT * FROM V_EMP; SELECT ID,LAST_NAME,TITLE FROM S_EMP WHERE DEPT_ID=45; --删除视图 DROP VIEW V_EMP; --习题17:请为S_EMP表创建一个序列,步长、开始值、最大、最小值请自定义,使用新建的SEQUENCE向表中插入几条数据,删除序列并删除插入的数据 --创建SEQUENCE CREATE SEQUENCE SEQ_S_EMP INCREMENT BY 2 START WITH 60 MAXVALUE 9999999 NOCACHE NOCYCLE; --使用SEQUENCE INSERT INTO S_EMP(ID,LAST_NAME,FIRST_NAME,USERID,START_DATE,MANAGER_ID,TITLE,DEPT_ID,SALARY) VALUES (SEQ_S_EMP.NEXTVAL,'SS','WANG','WANGSS1','2017/2/13',1,'President',50,8888); --删除SEQUENCE DROP SEQUENCE SEQ_S_EMP;
存笔记