数据库——简单查询复杂查询

1.实验内容及原理

1. 在 Windows 系统中安装 VMWare 虚拟机,在 VMWare 中安装 Ubuntu 系统,并在

Ubuntu 中搭建 LAMP 实验环境。

2. 使用 MySQL 进行一些基本操作:

(1)登录 MySQL,在 MySQL 中创建用户,并对新建的用户赋予权限。

(2)创建并跳转到新的数据库,显示所有数据库和当前数据库。

(3)显示所有的表和查看表的属性。

(4)导入 emp loyees 和 sakila 两个样例数据库,对这两个数据库进行完整性检查,

对这两个数据库进行备份、导入与导出。

3. SQL DDL 使用

(1) 创建 DDL 脚本,包括创建、删除表,指定主键、候选键和外键;

(2)修改并展示表结构;

(3)创建、删除索引。

4. SQL DDL & DML 使用

(1)数据的增、删、查、改等操作

(2)掌握视图的创建、删除和更新

5. 简单查询

(1)使用 order by、group by、having 等子句;

(2)使用各种谓词;

(3)使用集合函数;

(4)在时间字段上查询。

6. 复杂查询

(1)嵌套子查询;

(2)多表连接查询,包括左连接、右连接、外连接、 自连接。

7. 创建存储过程、函数和触发器,调用创建的存储过程、函数,触动触发器。

8. 安装并使用 phpmyadmin。

2.实验步骤与分析

1. 自行在 Windows 系统中安装 VMWare 虚拟机,在 VMWare 中安装 Ubuntu 系统,在

Ubuntu 中安装 LAMP 步骤如下(也可使用安装菜单):

sudo apt-get install update

sudo apt-get install apache2

sudo apt-get install mysq l-server

sudo apt-get install php

2. 熟悉 MySQL 的基本操作步骤如下:

(1)进入 MySQL:mysq l -u root -p

(2)创建新用户:CREATE USER 'newuser'@' localhost' IDENTIFIED BY 'password';

(3)赋予权限:GRANT ALL PRIVILEGES ON * . * TO 'newuser'@' localhost';

(4)创建新的数据库:CREATE DATABASE newdbname;

(5)跳转到新创建的数据库:USE newdbname;3

(6)显示所有数据库和当前数据库:SHOW DATABASES; SELECT DATABASE();

(7)显示所有的表并查看表的属性:SHOW TABLES; DESCRIBE tabname;

(8)导入两个样例数据库

① 解压数据包:unzip test_db_master.zip

② 进入数据包目录:cd test_db_master

③ 导入 emp loyee 数据库:sudo sudo mysql -t < emp loyees.sql

④ 解压数据包:unzip sakila-db.zip

⑤ 进入数据包目录:cd sakila-db

⑥ 进入 MySQL,导入 sakila schema 数据:SOURCE /path/to/sakila-schema.sq l

⑦ 导入 sakila 数据:SOURCE /path/to/sakila-data.sq l

(9)对导入的两个数据库进行完整性检查

① 查看外键检查状态:show variables like ‘%foreign_key_checks% ’;

② 查看主键检查状态:show variables like ‘%unique_checks% ’;

③ 查看外键检查结果:select @@foreign_key_checks;

④ 查看主键检查结果:select @@unique_checks;

(10)数据库备份(以 employee 为例)

① 不导出任何数据,只导出数据库表结构:

mysqldump -u test_02 -p --no-data emp loyees> employees_bak1.sq l

② 只导出数据,而不添加 CREATE TABLE 语句:

mysqldump -u test_02 -p --no-create-info employees> emp loyees_bak2.sq l

③ 导出全部数据库:

mysqldump -u test_02 -p emp loyees> emp loyees_bak3.sq l

(11)导出和导入(以 sakila 为例)

① 导出为 TXT 文件:

select * from country into outfile '/your/file/path/country';

② 导入 TXT 文件:

load data infile '/your/file/path/country' into table country;

③ 导出为 CSV 文件:4

select * from country into outfile '/your/file/path/country.csv';

④ 导入 CSV 文件:

load data infile '/your/file/path/country.csv' into table country;

⑤ 导出为 xml 文件:

mysql  -u  test_02  -p  --xml  -e  'select  *  from  sakila.country'  >

/your/file/path/country.xml

3. SQL DDL 使用

(1)使用 create 语句创建项目所有的表;

(2)使用 alter 命令修改表结构,删除某个表中的“xxx ”字段;修改某个表中

的“xxx ”字段的类型为 char(2),该字段不能为空,默认值为“m”;

(3)添加类型为 char(2)的‘xxx ’字段数据,添加是否成功,如果失败分析

失败的原因并进行必要的操作使字段添加成功;

(4)修改某个表,添加类型为 varchar2(18)的字段,并添加 check 约束,要求该

字段的长度为 18,并且只能由数字组成,并且指定该字段为候选键;

(5)设置某个表中某个字段的 check 约束为大于 0;设置某个字段默认值为“未

审核 ”,设置某个 ”字段的 check 约束为“未审核 ”、“ 审核已通过 ”、“ 审核不通

过”;

(6)在某个表中创建索引;

(7)使用 describe 命令展示表结构。

4. SQL DDL & DML 使用

(1) 使用 insert 语句将数据插入到相应的表中;

(2) 使用 delete 语句删除表中有关联表外建对应的记录,能否成功删除,如

果不能请分析原因;

(3) 使用 update 语句更新外键数据,能否成功修改,如果不能请分析原因。;

(4) 创建视图;

(5) 对视图进行查询操作;

(6) 对表进行联合查询操作;

(7) 更新视图,分析更新操作可以执行成功或失败的原因。5

5. 简单查询

(1) 查询性别为“ 男 ”的所有学生的学号、姓名和班级号;(单表简单查询)

(2) 查询 xxx 表,获得性别为“女 ”的记录,结果按照班级 ID 降序排列;(order

by)

(3) 查询 xxx 表,按照年龄从小到大排序;(获取子串函数、order by)

(4) 查询学号以“2002 ”开头的学生信息,字段包括学号、姓名、班级号;(使用子

串函数)

(5) 查询学号中包含“01 ”的学生信息,字段包括学号、姓名、班级号;(like)

(6) 查询状态为“未审核 ”,且申请时间在 2013 年 9 月 4 日之后的请假申请

单的信息,包含申请时间为 9 月 4 日的申请单;(单表多条件查询)

(7) 查询审核状态为“未审核 ”和“ 审批已通过 ”两种类型的申请单 ID;(in)

(8) 查询时间在 2013 年 8 月 31 日和 2013 年 9 月 2 日之间所提交的申请单 ID,

请假原因; (between、时间)

(9) 查询 XXX 老师所教课程的的选课人次(一人选两门课程,算两人次);

(10) 查询 XXX 老师所教课程的的选课人数(一人选两门课程,算一人);(distinct)

(11) 查询 XX 老师对请假单审核不通过的请假原因与学生姓名;

(12) 统计每门课的学生的个数(集合函数);

(13)  查询选课人数超 过 3 人 的课程 号 , 并按课程 号 降序排列( group by,

having,order by …desc)。

6. 复杂查询

(1)查询审批通过人数最多的课程名称和教师姓名;

(2)查询选课人数最多和第二多的课程名称和任课老师姓名; (选做)

(3)查询只选了课程《算法设计》的学生姓名;

(4)查询选修了全部课程的学生姓名;

(5)查询选修了课程 3 的学生学号、姓名、身份证号;

(6)据学生学号将 xxx 表与 xxx 表做自然连接查询;

(7)据学号将 xxx 表与 xxx 表进行左连接查询,并解释这样做所具有的业务含 6

义;

(8)据学号将 xxx 表与 xxx 表进行右连接查询,并解释这样做所具有的业务含

义;

(9)总结自然连接、左连接、右连接查询在产生的结果上面有什么区别。

7. 创建并调用存储过程、函数和触发器

(1)创建并调用存储查询过程(以 emp loyee 为例)

① 创建一个查询存储过程:

> delimiter##

> create procedure select_manager(in fname varchar(20), in lname varchar(20))

-> begin

->select * from dept_manager natural join emp loyees where first_name = fname

and

last_name = lname;

->end

> ##

② 调用这个存储查询过程:call select_manager('Xiaobin','Spinelli');

(2)创建并调用函数(以 emp loyee 为例)

① 创建函数:

> delimiter ##

> create function title_num(title_name varchar(50)) returns int

> begin

> declare num int;

> select count(title) from titles where to_date > curdate() and title =

title_name group

by title into num;

> return num;

> end



> ##

set g lobal log_bin_trust_function_creators=1;

② 调用函数:select title_num("manager");7

(3)创建并调用触发器(以 emp loyee 为例)

① 查看表 dept_manager:select * from dept_manager;

② 创建新表 quit:create table quit (emp_no int, depr_no char(4), quit_date

date);

③ 创建触发器:

mysql> delimiter ##

mysql> create trigger after_ insert_ quit after insert on quit for each row

-> begin

-> update dept_ manager set to_ date = curdate( ) where emp_ no = 110039;

-> end

-> ##

④ 触发触发器: insert into quit values (110039, 'd001', curdate());

⑤ 查看新表 quit:select * from quit;

⑥ 再次查看表 dept_manager:select * from dept_manager;

8. 安装 phpmyadmin 步骤如下:

(1)安装 phpmyadmin:sudo apt-get install phpmyadmin

(2)安装 php-mbstring:sudo apt-get install php-mbstring

(3)安装 php-gettext:sudo apt-get install php-gettext

(4)编辑 php.ini: vim /path/to/php. ini 修改;extension=php-mbstring.so

(5)重启 Apache2:sudo /path/to/apache2 restart

(6)查看 IP 地址: ifconfig

(7)登录 phpmyadmin:从浏览器地址 your. ip.4.address/phpmyadmin

3.实验结果与总结

5. 简单查询

在进行简单查询和复杂查询实验前,我新建了一个名为 school 的数据库。内含 4 个表,

各表内容如图所示:

s 表, 内容为学生的个人信息

l 表, 内容为学生的请假申请和审批状态

c 表, 内容为开设课程与授课老师信息

s_c 表, 内容为学生选课与成绩信息

基于以上四个表,我进行了下面两个部分的实验。首先是简单查询的实验:

(1) 查询性别为“  ”的所有学生的学号、姓名和班级号;(单表简单查询)

(2) 查询 xxx 表,获得性别为“女 ”的记录,结果按照班级 ID 降序排列;(order by)

(3) 查询 xxx 表,按照年龄从小到大排序;(获取子串函数、order by

(前三题查询结果)

(4) 查询学号以“2002 ”开头的学生信息,字段包括学号、姓名、班级号;(使用子串函数)

(5) 查询学号中包含“01 ”的学生信息,字段包括学号、姓名、班级号;(like

(第四题与第五题均与字串相关,查询结果如上)

(6) 查询状态为“未审核 ”,且申请时间在 2013 年 9 月 4 日之后的请假申请单的信息,包含申请时间为 9 月 4 日的申请单;(单表多条件查询)

(7)查询审核状态为“未审核 ”和“ 审批已通过”两种类型的申请单 ID;(in

(8) 查询时间在 2013  8  31 日和 2013  9  2 日之间所提交的申请单 ID,请假原因; (between、时间)

(9) 查询 XXX 老师所教课程的的选课人次(一人选两门课程,算两人次);

(10) 查询 XXX 老师所教课程的的选课人数(一人选两门课程,算一人);(distinct

(第九题与第十题的区别为计算重复与否。第十题需排除重复项,所以需要使用 distinct)

(11) 查询 XX 老师对请假单审核不通过的请假原因与学生姓名;

(12) 统计每门课的学生的个数(集合函数);

(使用 group by 语句即可)

(13) 查询选课人数超 3  的课程  并按课程序排列( group by, having,order by desc)。

6. 复杂查询

进行该复杂查询实验时,使用的数据库也为以上创建的 school 数据库

(1)查询审批通过人数最多的课程名称和教师姓名:需要涉及计数、子查询等

(2)查询选课人数最多和第二多的课程名称和任课老师姓名; (选做)

(3)查询只选了课程《算法设计》的学生姓名;

(4) 查询选修了全部课程的学生姓名;

此处若知道课程数量,可以直接使用分组计数的方式。若一名学生选课数量等于课程数(无重复),则可以认为其选修了全部课程。如下图所示:

(5) 查询选修了课程 3 的学生学号、姓名、身份证号;

(6) 据学生学号将 xxx 表与 xxx 表做自然连接查询;

将学生信息表(s)与选课信息表(s_c)做连接查询

(7) 据学号将 xxx 表与 xxx 表进行左连接查询,并解释这样做所具有的业务含义;

将学生信息表(s)与选课信息表(s_c)做连接查询

含义:根据课程名单查询完全确定的选课信息

(8) 据学号将 xxx 表与 xxx 表进行右连接查询,并解释这样做所具有的业务含义;

将学生信息表(s)与选课信息表(s_c)做连接查询

含义:根据学生信息查询所有的选课信息

(9) 总结自然连接、左连接、右连接查询在产生的结果上面有什么区别。

三种连接查询的区别在于:自然连接查询的信息完全确定,左连接与右连接查询得到的信息分别在左侧与右侧的表上完全确定,在另一侧的表上的信息无法完全确定。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/279664.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV-Python(22):直方图的计算绘制与分析

目标 了解直方图的原理及应用使用OpenCV 或Numpy 函数计算直方图使用Opencv 或者Matplotlib 函数绘制直方图学习函数cv2.calcHist()、np.histogram()等 原理及应用 直方图是一种统计图形&#xff0c;是对图像的另一种解释&#xff0c;用于表示图像中各个像素值的频次分布。直…

机器学习归一化和标准化

1. 为什么做归一化和标准化 样本中有多个特征&#xff0c;每一个特征都有自己的定义域和取值范围&#xff0c;他们对距离计算也是不同的&#xff0c;如取值较大的影响力会盖过取值较小的参数。因此&#xff0c;为了公平&#xff0c;样本参数必须做一些归一化处理&#xff0c;将…

UI演示双视图立体匹配与重建

相关文章&#xff1a; PyQt5和Qt designer的详细安装教程&#xff1a;https://blog.csdn.net/qq_43811536/article/details/135185233?spm1001.2014.3001.5501Qt designer界面和所有组件功能的详细介绍&#xff1a;https://blog.csdn.net/qq_43811536/article/details/1351868…

如何理解李克特量表?选项距离相等+题目权重相等!

在学术研究中&#xff0c;通过开展问卷调查获取数据时&#xff0c;调查问卷分为量表题和非量表题。量表题就是测试受访者的态度或者看法的题目&#xff0c;大多采用李克特量表。 李克特量表是一种评分加总式态度量表&#xff08;attitude scale&#xff09;&#xff0c;由美国…

论文阅读——Slide-Transformer(cvpr2023)

Slide-Transformer: Hierarchical Vision Transformer with Local Self-Attention 一、分析 1、改进transformer的几个思路&#xff1a; &#xff08;1&#xff09;将全局感受野控制在较小区域&#xff0c;如&#xff1a;PVT&#xff0c;DAT&#xff0c;使用稀疏全局注意力来…

山西电力市场日前价格预测【2023-12-28】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-12-28&#xff09;山西电力市场全天平均日前电价为814.30元/MWh。其中&#xff0c;最高日前电价为1500.00元/MWh&#xff0c;预计出现在08:00~08:45,17:00~20:15。最低日前电价为394.61元/…

FairyGUI-Cocos Creator官方Demo源码解读

博主在学习Cocos Creator的时候&#xff0c;发现了一款免费的UI编辑器FairyGUI。这款编辑器的能力十分强大&#xff0c;但是网上的学习资源比较少&#xff0c;坑比较多&#xff0c;主要学习方式就是阅读官方文档和练习官方Demo。这里博主进行官方Demo的解读。 从gitee上克隆项目…

Java多线程<二>多线程经典场景

leetcode 多线程刷题 上锁上一次&#xff0c;还是上多次&#xff1f; 同步的顺序。 1. 交替打印字符 使用sychronize同步锁使用lock锁使用concurrent的默认机制使用volitale关键字 Thread.sleep() / Thread.yield机制使用automic原子类 方式1 &#xff1a;使用互斥访问st…

Linux上管理不同版本的 JDK

当在 Linux 上管理不同版本的 JDK 时&#xff0c;使用 yum 和 dnf 可以方便地安装和切换不同的 JDK 版本。本文将介绍如何通过这两个包管理工具安装 JDK 1.8 和 JDK 11&#xff0c;并利用软连接动态关联这些版本。 安装 JDK 1.8 和 JDK 11 使用 yum 安装 JDK 1.8 打开终端并…

Linux 内存数据 Metrics 指标解读

过去从未仔细了解过使用 free、top 等命令时显式的内存信息&#xff0c;只关注了已用内存 / 可用内存。本文我们详解解读和标注一下各个数据项的含义&#xff0c;同时和 Ganglia 显式的数据做一个映射。开始前介绍一个小知识&#xff0c;很多查看内存的命令行工具都是 cat /pro…

Pytorch框架基础

参考资料 pytorch框架基础 Pycharm 页面卡住解决方案 使用ps命令结合grep来查找PyCharm相关的进程 ps aux | grep pycharm kill -9 [PID]关于怎么找这个卡住的进程&#xff0c;据初步观察&#xff0c;卡住进程打印的信息是最长的&#xff0c;此外&#xff0c;在卡住进程的打…

贪心算法—会议安排

与其明天开始&#xff0c;不如现在行动&#xff01; 文章目录 1 安排会议1 题目描述2 解决思路3 代码实现 &#x1f48e;总结 1 安排会议 1 题目描述 一些项目要占用一个会议室宣讲&#xff0c;会议室不能同时容纳两个项目的宣讲。 给你每一个项目开始的时间和结束的时间 你来…

MendelianRandomization | 孟德尔随机化神包更新啦!~(一)(小试牛刀)

1写在前面 今天发现MendelianRandomization包更新v0.9了。&#x1f61c; 其实也算不上更新。&#x1fae0; 跟大家一起分享一下这个包做MR的用法吧。&#x1f929; 还有一个包就是TwoSampleMR&#xff0c;大家有兴趣可以去学一下。&#x1f605; 2用到的包 rm(list ls())# ins…

壮志酬筹>业务被裁>副业转正>收入回正。一个前黑马程序员老师的2023

从年初时的踌躇满志&#xff0c;到年中时整个业务线被砍。全职做前端训练营&#xff0c;四个多月的时间帮助100多名同学拿到了满意的offer&#xff0c;同时也让我的收入重归正轨。仅以这个视频记录我&#xff0c;一个普通程序员的 2023 。 视频版可直接访问 Hello&#xff0c;大…

【年度征文】回顾2023,迎接2024

转眼一年~~2023又到年底了&#xff0c;CSDN年度征文如约而至&#xff01;不知不觉又在CSDN平台写了488篇博文&#xff0c;非常感谢CSDN提供的平台&#xff0c;同时也感谢关注和支持博主的粉丝们&#xff0c;在马上到来新的一年里&#xff0c;我会继续努力&#xff01;也非常感谢…

mysql突然找不到,任务管理器里也没有了(图文详细解决)

右键开始键&#xff0c;选终端&#xff08;管理员&#xff09; 2.点↓的命令提示符&#xff0c;进到以管理员打开命令指示符 3.输入命令&#xff1a; mysqld.exe -install 如果出现这个Service successfully installed. 就代表成功了 4.输入&#xff1a; net start mysql MySO…

如何解决“电脑缺失msvcp110.dll”错误,msvcp110.dll文件解决方法

“msvcr110.dll丢失”。那么&#xff0c;msvcr110.dlll丢失到底是什么意思呢&#xff1f;它对我们的电脑有什么影响&#xff1f;本文将详细介绍msvcr110.dll的作用以及msvcr110.dll丢失对电脑的影响&#xff0c;并提供5个解决方案来解决这个问题。 一、msvcr110.dll的作用 ms…

【三维目标检测/自动驾驶】IA-BEV:基于结构先验和自增强学习的实例感知三维目标检测(AAAI 2024)

系列文章目录 论文&#xff1a;Instance-aware Multi-Camera 3D Object Detection with Structural Priors Mining and Self-Boosting Learning 地址&#xff1a;https://arxiv.org/pdf/2312.08004.pdf 来源&#xff1a;复旦大学 英特尔Shanghai Key Lab /美团 文章目录 系列文…

交互式笔记Jupyter Notebook本地部署并实现公网远程访问内网服务器

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 1.前言2.Jupyter Notebook的安装2.1 Jupyter Notebook下…

Java guava partition方法拆分集合自定义集合拆分方法

日常开发中&#xff0c;经常遇到拆分集合处理的场景&#xff0c;现在记录2中拆分集合的方法。 1. 使用Guava包提供的集合操作工具栏 Lists.partition()方法拆分 首先&#xff0c;引入maven依赖 <dependency><groupId>com.google.guava</groupId><artifa…