西安交通大学数据库实验报告及代码

计算机的同学们,我这份是计试的实验报告,可能和你们的实验内容不一样

2024年补充:若你是研究生,选修了侯老师的数据库理论与技术》课程并发现这篇文章,那么请看这篇博文:西安交通大学《数据库理论与技术》课程实验+期末考试资料全通关_西安交通大学数据库实验-CSDN博客


 第一次实验无需代码,第三次实验只用navicat点点按钮。

四次实验代码及报告下载:

链接: https://pan.baidu.com/s/13UwgODXT6oHqr5lyxmlYsw 提取码: uqga


实验要求:

(实验1)

根据给定的需求说明,以ERWIN 7.1 为工具完成以下数据库建模操作:

1) 完成数据库概念模型设计,绘制ER(IDFE1X)模式图。(具体题目见数据库建模实验(上).doc

2) 完成数据库逻辑模型设计,生成相关的SQL建表语句。

3) 提交以下数据库设计文档:

     a. ERWIN数据模型文件(.erwin文件)

     b. ERWIN生成的SQL建表语句文件(即.DDL文件)。



(实验2)

在MySQL样本数据库上完成下列查询:
(1)    查询每个部门(departments)的编号(dept_no),名称(dept_name),在该部门工作过的雇员(employees)人数,最低工资(salary),平均工资,最高工资及工资总额;
(2)    查询每个部门(departments)的编号(dept_no),名称(dept_name),及各个时间段(from_date,to_date)担任该部门经理(dept_manager)的雇员的编号(emp_no)和姓名(first_name+last_name),并按时间段先后显式;
(3)    查询每位雇员的编号(emp_no),姓名(first_name+last_name),及各个时间段(from_date,end_data)的工资额(salary),并按时间段先后显式;
(4)    查询每位雇员的编号(emp_no),姓名(first_name+last_name),及各个时间段(from_date,end_data)的工作部门名称(dept_name),并按时间段先后显式;
(5)    查询每位雇员的编号(emp_no),姓名(first_name+last_name),及任职过的部门数;
(6)    查询每位雇员的编号(emp_no),姓名(first_name+last_name),及各个时间段(from_date,end_data)担任的职务(title),并按时间段先后显式;
(7)    查询担任每种职务(title)的雇员人数;
(8)    查询每个部门中担任每种职务(title)的雇员人数;
(9)    查询每位雇员的编号(emp_no),姓名(first_name+last_name),及工资额最高的时间段(from_date,end_data)及其工资额;
(10)    查询所有曾经担任过部门经理(dept_manager)的雇员的编号(emp_no)和姓名(first_name+last_name);
(11)    按时间段(from_date,end_data)先后列出每个部门(departments)的编号(dept_no),名称(dept_name),及其经理的姓名(first_name+last_name);
(12)    查询所有曾经在‘Development’工作过雇员的编号(emp_no),姓名(first_name+last_name),及时间段(from_date,end_data);
(13)    查询曾经在所有部门都工作过的雇员的编号(emp_no),姓名(first_name+last_name);
(14)    在dept_emp表中插入适当数据使得至少3个以上雇员满足上一题的查询要求。

请写出上述每一个查询的SQL语句并将执行结果输出到文件results.txt中。


(实验3)


使用SQL EXPLAIN工具(具体方法见:MySQL 性能优化神器 Explain 使用分析)对上一题中的每一条SQL语句进行分析,生成相应的查询执行计划并将查询执行计划保存到文件sql_explians.txt中。

使用SQL EXPLAIN工具(具体方法见:MySQL 性能优化神器 Explain 使用分析)对下列SQL查询语句进行分析,判断哪些索引将可以对下列查询产生加速作用,并通过实验进行验证。
SELECT TITLE,DEPT_NAME,GENDER, COUNT(DISTINCT E.EMP_NO)
FROM DEPARTMENTS D,DEPT_EMP DE,EMPLOYEES E,SALARIES S,TITLES T
WHERE D.DEPT_NO=DE.DEPT_NO AND DE.EMP_NO=E.EMP_NO AND 
E.EMP_NO=S.EMP_NO AND E.EMP_NO=T.EMP_NO
GROUP BY  TITLE,DEPT_NAME,GENDER
ORDER BY  TITLE,DEPT_NAME,GENDER;
在红色上的列建索引
比较速度:
1.不建索引
2.建索引
给出实验过程和结果。


(实验4)


嵌入式实验:
题目:
求身处两个或两个以上部门的员工信息(需要包含emp_np、first_name、emp_no_leader、dept_manager),并利用代码在mysql中创建一个新表并将结果输出进去(注:只需要保存多个部门中的第一个及多个领导中的第一个),并且要求代码运行耗时和时间复杂度尽可能的低。
要求:
任何操作都必须利用代码完成(需要利用嵌入式sql读取数据、建表、输出数据)
提示:
需要employees表(姓名)、dept_emp(工号、两个部门、及部门名称)、dept_manager(领导名称)
从dept_emp中找出在两个部门的人,进而确定他们的离职日期部门名称,依据他们的部门名称s去寻找领导名称s

编写上机实验报告。
 


第二次实验的代码:

2.
SELECT departments.dept_no, departments.dept_name, employees.emp_no,from_date, to_date, CONCAT(first_name,' ',last_name) 
FROM departments, dept_manager, employees
WHERE departments.dept_no=dept_manager.dept_no AND dept_manager.emp_no=employees.emp_no
ORDER BY departments.dept_no
INTO OUTFILE 'F:/mysql_result/2.txt'

3.
SELECT employees.emp_no, CONCAT(first_name,' ',last_name), from_date, to_date, salary 
FROM salaries, employees
WHERE employees.emp_no=salaries.emp_no
ORDER BY employees.emp_no
INTO OUTFILE 'F:/mysql_result/3.txt'

4.
SELECT employees.emp_no, CONCAT(first_name,' ',last_name), from_date, to_date, departments.dept_name 
FROM departments, employees,dept_emp
WHERE employees.emp_no=dept_emp.emp_no AND dept_emp.dept_no=departments.dept_no
ORDER BY employees.emp_no,from_date
INTO OUTFILE 'F:/mysql_result/4.txt'

5.
SELECT employees.emp_no, CONCAT(first_name,' ',last_name), COUNT(DISTINCT dept_emp.dept_no) 
FROM employees,dept_emp
WHERE employees.emp_no=dept_emp.emp_no
GROUP BY employees.emp_no
INTO OUTFILE 'F:/mysql_result/5.txt'

6.
SELECT employees.emp_no, CONCAT(first_name,' ',last_name), from_date,to_date,title
FROM employees,titles
WHERE employees.emp_no=titles.emp_no
ORDER BY employees.emp_no,from_date
INTO OUTFILE 'F:/mysql_result/6.txt'

7.
SELECT title,COUNT(title)
FROM titles
#WHERE employees.emp_no=titles.emp_no
GROUP BY title
INTO OUTFILE 'F:/mysql_result/7.txt'

8.
SELECT title,COUNT(DISTINCT titles.emp_no),dept_no
FROM titles,employees,dept_emp
WHERE employees.emp_no=titles.emp_no AND employees.emp_no=dept_emp.emp_no
GROUP BY dept_emp.dept_no,titles.title
ORDER BY dept_emp.dept_no
INTO OUTFILE 'F:/mysql_result/8.txt'

9.
SELECT CONCAT(first_name,' ',last_name),MAX(salary),employees.emp_no,from_date,to_date
FROM salaries,employees
WHERE employees.emp_no=salaries.emp_no
GROUP BY employees.emp_no
ORDER BY from_date
INTO OUTFILE 'F:/mysql_result/9.txt'

10.
SELECT DISTINCT(CONCAT(first_name,' ',last_name)),employees.emp_no
FROM dept_manager,employees
WHERE employees.emp_no=dept_manager.emp_no
#ORDER BY employees.emp_no
INTO OUTFILE 'F:/mysql_result/10.txt'

11.
SELECT departments.dept_no,dept_name,CONCAT(first_name,' ',last_name)
FROM dept_manager,employees,departments
WHERE employees.emp_no=dept_manager.emp_no AND departments.dept_no=dept_manager.dept_no
#GROUP BY departments.dept_no
ORDER BY departments.dept_no,from_date
INTO OUTFILE 'F:/mysql_result/11.txt'

12.
SELECT employees.emp_no,CONCAT(first_name,' ',last_name),from_date,to_date
FROM dept_emp,employees,departments
WHERE employees.emp_no=dept_emp.emp_no AND departments.dept_name='Development' AND departments.dept_no=dept_emp.dept_no
#GROUP BY departments.dept_no
ORDER BY departments.dept_no,from_date
INTO OUTFILE 'F:/mysql_result/12.txt'

13.
SELECT DISTINCT(employees.emp_no),CONCAT(first_name,' ',last_name)
FROM dept_emp,employees
WHERE NOT EXISTS (
SELECT *
FROM departments
WHERE NOT EXISTS (
SELECT *
FROM dept_emp
WHERE departments.dept_no=dept_emp.dept_no AND dept_emp.emp_no=employees.emp_no
)
)
#GROUP BY departments.dept_no
ORDER BY employees.emp_no
INTO OUTFILE 'F:/mysql_result/13.txt'

第四次实验的代码:

import pymysql
 
# 打开数据库连接
db = pymysql.connect(host='localhost',
                     port=3306,
                     user='root',
                     password='',
                     database='employees')
 
# 使用cursor()方法获取操作游标 
cursor = db.cursor()

index=0
'''
    sql_create_database = 
            CREATE TABLE if not exists `empWith2dep` (
            `id` int(11) NOT NULL AUTO_INCREMENT,
            `song_id` int(11) DEFAULT NULL,
            PRIMARY KEY (`id`)
            )
'''

mylist=[]

# SQL 查询语句

sql_employees = "SELECT emp_no,first_name \
       FROM employees"
sql_dept_emp = "SELECT emp_no,dept_no,from_date \
       FROM dept_emp"
'''
sql_departments = "SELECT * \
       FROM departments"
'''
sql_dept_manager = "SELECT dept_no,emp_no,from_date,to_date \
       FROM dept_manager"

cursor.execute("DROP TABLE IF EXISTS RESULT")
sql_create = "CREATE TABLE result \
                (emp_no INT, \
                 first_name CHAR(14), \
                 dept_no CHAR(4), \
                 manager_no INT)"

cursor.execute(sql_create)
try:
   # 执行SQL语句
    cursor.execute(sql_employees)
   # 获取所有记录列表
    employees = cursor.fetchall()
   #同上 
    cursor.execute(sql_dept_emp)
    dept_emp = cursor.fetchall()

    cursor.execute(sql_dept_manager)
    dept_manager = cursor.fetchall()
    #遍历emloyees表
    for row in employees:
        emp_no = row[0]                   #记录员工编号数据和first_name
        first_name = row[1]
        '''
        debug代码

        if emp_no<=10010:
            print ("aaa")
            print("emp_no=",str(emp_no))
            print("index=",index)
        '''
        #防止越界
        #print("index=",index)
        if index>=len(dept_emp)-1:
            break
        #判断该员工是否满足曾在两个及以上的部门工作过
        if dept_emp[index][0]==dept_emp[index+1][0] and dept_emp[index][0]==emp_no:
            #print("bbb")
            #若有,记录员工在该部门的上岗日期和部门编号
            from_date=dept_emp[index][2]
            dept_no=dept_emp[index][1]
            manager_no=0
            #接下来遍历部门领导表,寻找该人的第一个领导
            for row1 in dept_manager:
                if row1[0]==dept_no and row1[2]<=from_date and row1[3]>=from_date:
                    manager_no=row1[1]
                    break
            #把结果写进mylist
            mylist.append([emp_no,first_name,dept_no,manager_no])
            sql_insert = "INSERT INTO result ( \
                            emp_no,first_name,dept_no,manager_no) \
                            VALUES ('%d','%s','%s','%d')" %(emp_no,first_name,dept_no,manager_no)
            cursor.execute(sql_insert)
            #db.commit()
            #更新index索引值,该值的只增不减保证了时间复杂度
            while index<len(dept_emp)-1 and dept_emp[index][0]==dept_emp[index+1][0]:
                #print("ccc")
                index+=1
        index+=1
        '''
        debug代码
        if emp_no<=10010:
            print("new index=",index)
        '''
#若出错,输出错误原因                
except Exception as e:
    print ("Error: unable to fetch data")
    print (e)
#结果保存到文件
f=open("F:/mysql_result/result.txt","w")

for line in mylist:
    f.write(str(line)+'\n')
db.commit()    
# 关闭数据库连接
db.close()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值