目录
实验二 DMDBMS表查询操作
一、实验目的:
1.掌握查询中操作符的应用;
2.掌握对复杂查询的查询要求拆解分析;
3.掌握SQL语言对数据库信息及用户信息进行查询;
4.理解和掌握SQL语言: 能够熟练地使用distinct、AS some_name(别名)、join、group by、order by、having、limit、like相关命令对表数据进行复杂查询。
5.完成对范例数据的复杂查询,包括对表数据的查询、去重、分组、数据限制、连接查询等。
二、实验要求:
1.掌握对复杂查询的查询要求拆解分析
2.掌握查询中操作符的应用
3.熟悉DQL语言中各参数的使用方法及应用场景
4.理解和掌握SQL语言: 能够熟练地使用distinct、AS some_name(别名)、join、group by、order by、having、limit、like相关命令对表数据进行复杂查询。
5.熟悉例题查询思路。
三、实验重点和难点:
实验重点:别名的使用、条件查询、连接查询、子查询、数据分组、数据排序
实验难点:连接查询、子查询、分组查询、函数的使用
四、实验内容:
- 数据库信息、用户信息查询
- 表数据查询
2.1.去重查询
2.2. 查询列的选择
2.3.别名的使用
2.4. 条件查询
2.5. 连接查询
2.6. 子查询
2.7. 数据分组
2.8.数据排序
2.9.数据限制
五、实验步骤与结果:
说明:每一部分实验内容,请描述实验过程,并搭配实验结果截图
1. 数据库信息、用户信息查询
1.1
//查看数据库名及创建时间
select name,create_time from v$database;
1.2
//查看数据库里所有使用用户
select username,user_id,default_tablespace,profile from dba_users;
1.3
//查看当前登录用户
SELECT USER;
1.4
//当前用户拥有的表
select table_name from user_tables;
1.5
//所有用户的表
select table_name from all_tables;
1.6
//切换模式
set SCHEMA SYSDBA;
1.7
//查看当前模式
select * from v$sessions;
2.表数据查询
//截图SQL指令及输入结果
2.1.去重查询
示例:下表中是一个部门的员工信息(sections),利用distinct关键字来查询员工的岗位和奖金,去除岗位和奖金相同的记录。
select distinct JOB,BONUS from SYSDBA."sections";
2.2. 查询列的选择
查看sections表中员工编号、职位及奖金
select STAFF_ID,JOB,BONUS from SYSDBA."sections";
2.3.别名的使用
示例:表名限定列名,查询学号sid为10的学生的数学成绩和英语成绩。
数学成绩表 math
英语成绩表 English
select SCORE FROM SYSDBA."math" WHERE SID = 10;
select SCORE FROM SYSDBA."English" WHERE SID = 10
2.4. 条件查询
示例:从上表bonuses_depa中查询岗位为developer,且奖金>8000的职员信息。
示例:从上表bonuses_depa中查询姓wang,且奖金在8500~9500之间的职员信息。
select STAFF_ID,NAME FROM SYSDBA."bonuses_depa" WHERE JOB = 'developer' AND "bonuses_depa".BONUS>8000;
select STAFF_ID,NAME FROM SYSDBA."bonuses_depa" WHERE NAME LIKE 'wang%' AND BONUS BETWEEN 8500 AND 9500;
2.5. 连接查询
数据准备:
–创建表training。
CREATE TABLE training(staff_id INT NOT NULL,course_name CHAR(50),exam_date DATETIME,score INT);
--向表training中插入记录。
INSERT INTO training(staff_id,course_name,exam_date,score) VALUES(10,'SQL majorization','2017-06-25 12:00:00',90);
INSERT INTO training(staff_id,course_name,exam_date,score) VALUES(11,'BIG DATA','2018-06-25 12:00:00',92);
INSERT INTO training(staff_id,course_name,exam_date,score) VALUES(12,'Performance Turning','2018-06-29 12:00:00',95);
–创建表education。
CREATE TABLE education(staff_id INT, higest_degree CHAR(8), graduate_school VARCHAR(64), education_note VARCHAR(70));
–向表education中插入记录
INSERT INTO education(staff_id,higest_degree,graduate_school,education_note) VALUES(11,'master','Northwestern Polytechnical University','211&985');
INSERT INTO education(staff_id,higest_degree,graduate_school,education_note) VALUES(12,‘doctor','Peking University','211&985');
INSERT INTO education(staff_id,higest_degree,graduate_school,education_note) VALUES(13,'scholar','Peking University','211&985');
示例:查询员工ID、最高学历和考试分数。使用training和education两个相关的列(staff_id)做查询操作。
SELECT STAFF_ID,EDUCATION.HIGEST_DEGREE,TRAINING.SCORE
FROM SYSDBA.TRAINING JOIN SYSDBA.EDUCATION USING(STAFF_ID);
2.6. 子查询
数据准备:staffs
建表
CREATE TABLE staffs
(
staff_id NUMBER(6) not null,
first_name VARCHAR2(20),
last_name VARCHAR2(25),
email VARCHAR2(25),
phone_number VARCHAR2(20),
hire_date DATE,
employment_id VARCHAR2(10),
salary NUMBER(8,2),
commission_pct NUMBER(2,2),
manager_id NUMBER(6),
section_id NUMBER(4),
graduated_name VARCHAR2(60)
);
插入数据:
insert into staffs (staff_id, first_name, last_name, email, phone_number, hire_date,employment_id, salary, commission_pct, manager_id, section_id)values (198, 'Donald', 'OConnell', 'DOCONNEL', '650.507.9833', to_date('21-06-1999', 'dd-mm-yyyy'), 'SH_CLERK', 2600.00, null, 124, 50);
insert into staffs (staff_id, first_name, last_name, email, phone_number, hire_date,employment_id, salary, commission_pct, manager_id, section_id)values (199, 'Douglas', 'Grant', 'DGRANT', '650.507.9844', to_date('13-01-2000', 'dd-mm-yyyy'), 'SH_CLERK', 2600.00, null, 124, 50);
insert into staffs (staff_id, first_name, last_name, email, phone_number, hire_date,employment_id, salary, commission_pct, manager_id, section_id)values (200, 'Jennifer', 'Whalen', 'JWHALEN', '515.123.4444', to_date('17-09-1987', 'dd-mm-yyyy'), 'AD_ASST', 4400.00, null, 101, 10);
insert into staffs (staff_id, first_name, last_name, email, phone_number, hire_date,employment_id, salary, commission_pct, manager_id, section_id)values (201, 'Michael', 'Hartstein', 'MHARTSTE', '515.123.5555', to_date('17-02-1996', 'dd-mm-yyyy'), 'MK_MAN', 13000.00, null, 100, 20);
insert into staffs (staff_id, first_name, last_name, email, phone_number, hire_date,employment_id, salary, commission_pct, manager_id, section_id)values (202, 'Pat', 'Fay', 'PFAY', '603.123.6666', to_date('17-08-1997', 'dd-mm-yyyy'),
'MK_REP', 6000.00, null, 201, 20);
insert into staffs (staff_id, first_name, last_name, email, phone_number, hire_date,employment_id, salary, commission_pct, manager_id, section_id)values (203, 'Susan', 'Mavris', 'SMAVRIS', '515.123.7777', to_date('07-06-1994', 'dd-mm-yyyy'), 'HR_REP', 6500.00, null, 101, 40);
通过相关子查询,查找每个部门中高出部门平均工资的人员
select STAFFS.first_name,STAFFS.LAST_NAME
from STAFFS,(select AVG(salary) aver,section_id from STAFFS group by section_id)av
where STAFFS.section_id=av.section_id and STAFFS.salary>av.aver;
2.7. 数据分组
数据准备:如图建表(bonuses_depa)且插入数据
示例:该部门按照岗位和奖金分组,查询每组员工数,结果按人数升序排序。
SELECT job,COUNT(*) FROM SYSDBA."bonuses_depa" GROUP
BY JOB ORDER BY COUNT(*);
SELECT BONUS,COUNT(*) FROM SYSDBA."bonuses_depa" GROUP
BY BONUS ORDER BY COUNT(*);
2.8.数据排序
示例:查询下表bonuses_depa中各工种的奖金信息,查询结果先按bonus升序排列,然后按name降序排列。
SELECT NAME,JOB,BONUS FROM SYSDBA."bonuses_depa" ORDER BY BONUS;
SELECT NAME,JOB,BONUS FROM SYSDBA."bonuses_depa" ORDER BY NAME DESC;
2.9.数据限制
示例:查询下表 bonuses_depa中的员工信息。通过增加LIMIT 2 OFFSET 1限定查询时跳过前1行后,查询总共2行数据。
SELECT *FROM SYSDBA."bonuses_depa" LIMIT 2 OFFSET 1;