达梦数据库实验二:DMDBMS表查询操作

实验二 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.熟悉例题查询思路。

三、实验重点和难点:

实验重点:别名的使用、条件查询、连接查询、子查询、数据分组、数据排序
实验难点:连接查询、子查询、分组查询、函数的使用

四、实验内容:

  1. 数据库信息、用户信息查询
  2. 表数据查询
    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;

猜你喜欢

转载自blog.csdn.net/david2000999/article/details/122504503