006-Archer@冯鹤楠 MySQL 打卡作业2
2019年4月2日

1.导入示例数据库,教程 https://www.yiibai.com/mysql/how-to-load-sample-database-into-mysql-database-server.html

2.SQL是什么?MySQL是什么?

SQL(发音为字母S-Q-L或sequel)是结构化查询语言(Structured Query Language)的缩写。SQL是一种专门用来与数据库沟通的语言。

MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

3. 查询语句 SELECT FROM

使用SELECT语句从表或视图获取数据。表由行和列组成,如电子表格。 通常,我们只希望看到子集行,列的子集或两者的组合。SELECT语句的结果称为结果集,它是行列表,每行由相同数量的列组成。

SELECT语句的语法:

SELECT column_1, column_2, ...
FROMtable_1
[INNER | LEFT |RIGHT] JOIN table_2 ON conditions
WHEREconditions
GROUP BY column_1
HAVING group_conditions
ORDER BY column_1
LIMIT offset, length;

SELECT语句由以下列表中所述的几个子句组成:

SELECT之后是逗号分隔列或星号(`*`)的列表,表示要返回所有列。
FROM 指定要查询数据的表或视图。
JOIN 根据某些连接条件从其他表中获取数据。
WHERE过滤结果集中的行。
GROUP BY将一组行组合成小分组,并对每个小分组应用聚合函数。
HAVING 过滤器基于 GROUP BY 子句定义的小分组。
ORDER BY 指定用于排序的列的列表。
LIMIT 限制返回行的数量。
去重语句
DISTINCT
SELECT DISTINCT jobtitle FROM employees;##### 前N个语句SELECT语句返回指定表中所有匹配的行,很可能是每一行。如果你只想返回第一行或者一定数量的行,该怎么办呢?这是可行的,然而遗憾的是,各种数据库中的这一SQL实现并不相同。在SQL Server和Access中使用SELECT时,可以使用TOP关键字来限制最多返回多少行,如下所示:```sql
SELECT customerName
FROM customers
LIMIT 5;

也可以实现M至N(某一段的)记录查询

LIMIT offset, recnum

其中offset

SELECT customerName
FROM customers
LIMIT 2, 5;

其中offset为从第几条(M+1)记录开始,recnum为返回的记录条数。

)

CASE…END判断语句

https://dev.mysql.com/doc/refman/5.7/en/case.html

CASE case_valueWHEN when_value THEN statement_list[WHEN when_value THEN statement_list] ...[ELSE statement_list]
END CASE

Or:

CASEWHEN search_condition THEN statement_list[WHEN search_condition THEN statement_list] ...[ELSE statement_list]
END CASE

当然我们可以在那个教程提供的数据库上随便试一下

SELECT
(CASEWHEN customerNumber  > 150 THEN 'A'WHEN customerNumber <= 150 THEN 'B'
END)
FROM    payments;

4.筛选语句 WHERE

如果使用SELECT语句但不使用WHERE子句在表中查询数据,则会获取表中的所有行记录,这些行记录中大部分是不想要的行记录。例如,在一些表中存放商业交易中的数据。 从这些表中获取所有行,尤其是对于诸如员工,销售订单,采购订单,生产订单等的大型表格来说,这是没有意义的,因为我们经常想要的是一些特定的数据,例如本季度的销售额 ,今年销量比去年同期的销量等等。

WHERE子句允许根据指定的过滤表达式或条件来指定要选择的行。

可用于 WHERE 子句中的比较运算符

BETWEEN 运算符
expr [NOT] BETWEEN begin_expr AND end_expr;

取值范围 [begin_expr, end_expr]

MySQL LIKE运算符

LIKE 匹配基于模式匹配的值。LIKE操作符通常用于基于模式查询选择数据。以正确的方式使用LIKE运算符对于增加/减少查询性能至关重要。
LIKE操作符允许您根据指定的模式从表中查询选择数据。 因此,LIKE运算符通常用在SELECT语句的WHERE子句中。
MySQL提供两个通配符,用于与 LIKE 运算符一起使用,
它们分别是:百分比符号 '%'  和下划线 '_'。百分比('%')通配符允许匹配任何字符串的零个或多个字符。下划线('_')通配符允许匹配任何单个字符。

MySQL LIKE 与 ESCAPE子句

有时想要匹配的模式包含通配符,例如 10%,_20 等这样的字符串时。在这种情况下,您可以使用 ESCAPE 子句指定转义字符,以便 MySQL 将通配符解释为文字字符。如果未明确指定转义字符,则反斜杠字符 \ 是默认转义字符。
SELECT productCode, productName
FROMproducts
WHEREproductCode LIKE '%\_20%';

OR

SELECT productCode, productName
FROMproducts
WHEREproductCode LIKE '%$_20%' ESCAPE '$';

LIKE 操作符强制MySQL扫描整个表以找到匹配的行记录,因此,它不允许数据库引擎使用索引进行快速搜索。因此,当要从具有大量行的表查询数据时,使用LIKE运算符来查询数据的性能会大幅降低。

MySQL IN操作符介绍

SELECT column1,column2,...
FROMtable_name
WHERE (expr|column_1) IN ('value1','value2',...);

MySQL IN与子查询

SELECT orderNumber, customerNumber, status, shippedDate
FROMorders
WHEREorderNumber IN (SELECT orderNumberFROMorderDetailsGROUP BY orderNumberHAVING SUM(quantityOrdered * priceEach) > 60000);

上面的整个查询可以分为2个查询。

首先,子查询使用orderDetails表中的GROUP BY和HAVING子句返回总额大于60000的订单号列表。

SELECT orderNumber
FROMorderDetails
GROUP BY orderNumber
HAVING SUM(quantityOrdered * priceEach) > 60000;
mysql> SELECT orderNumber
FROMorderDetails
GROUP BY orderNumber
HAVING SUM(quantityOrdered * priceEach) > 60000;
+-------------+
| orderNumber |
+-------------+
|       10165 |
|       10287 |
|       10310 |
+-------------+
3 rows in set
其次,主查询从 orders 表中获取数据,并在 WHERE 子句中应用 IN 运算符。
SELECT orderNumber, customerNumber, status, shippedDate
FROMorders
WHEREorderNumber IN (10165,10287,10310);
mysql> SELECT orderNumber, customerNumber, status, shippedDate
FROMorders
WHEREorderNumber IN (10165,10287,10310);
+-------------+----------------+---------+-------------+
| orderNumber | customerNumber | status  | shippedDate |
+-------------+----------------+---------+-------------+
|       10165 |            148 | Shipped | 2013-12-26  |
|       10287 |            298 | Shipped | 2014-09-01  |
|       10310 |            259 | Shipped | 2014-10-18  |
+-------------+----------------+---------+-------------+
3 rows in set
  1. 分组语句 GROUP BY

MySQL GROUP BY子句简介

GROUP BY子句通过列或表达式的值将一组行分组为一个小分组的汇总行记录。 GROUP BY子句为每个分组返回一行。换句话说,它减少了结果集中的行数。
经常使用 GROUP BY子句与聚合函数一起使用,如 SUM, AVG, MAX, MIN 和 COUNT。 SELECT子句中使用聚合函数来计算有关每个分组的信息。
GROUP BY子句是SELECT语句的可选子句。 下面是 GROUP BY子句语法:SELECT c1, c2,..., cn, aggregate_function(ci)
FROMtable
WHEREwhere_conditions
GROUP BY c1 , c2,...,cn;GROUP BY 子句必须出现在 FROM 和 WHERE 子句之后。 在 GROUP BY关键字之后是一个以逗号分隔的列或表达式的列表,这些是要用作为条件来对行进行分组。

MySQL GROUP BY与聚合函数

https://www.yiibai.com/mysql/group-by.html

可使用聚合函数来执行一组行的计算并返回单个值。 GROUP BY子句通常与聚合函数一起使用以执行计算每个分组并返回单个值。
例如,如果想知道每个状态中的订单数,可以使用COUNT函数与GROUP BY子句查询语句,如下所示:
SELECT status, COUNT(*) AS total_number
FROMorders
GROUP BY status;

MySQL GROUP BY与HAVING子句

可使用HAVING子句过滤GROUP BY子句返回的分组。以下查询使用HAVING子句来选择2013年以后的年销售总额。

6 排序语句 MySQL ORDER BY子句简介

当使用 SELECT 语句查询表中的数据时,结果集不按任何顺序进行排序。要对结果集进行排序,请使用 ORDER BY子句。 ORDER BY子句允许:对单个列或多个列排序结果集。按升序或降序对不同列的结果集进行排序。ORDER BY子句的语法:
SELECT column1, column2,...
FROM tbl
ORDER BY column1 [ASC|DESC], column2 [ASC|DESC],...

7.函数

MySQL聚合函数 - 提供最常用的MySQL聚合函数的简要概述。

数值函数

avg()函数 - 计算一组值或表达式的平均值。

count()函数 - 计算表中的行数。

instr()函数 - 返回子字符串在字符串中第一次出现的位置。

sum()函数 - 计算一组值或表达式的总和。

min()函数 - 在一组值中找到最小值。

max()函数 - 在一组值中找到最大值。

group_concat()函数 - 将字符串从分组中连接成具有各种选项(如DISTINCTORDER BYSEPARATOR)的字符串。

日期和时间函数

curdate()函数 - 返回当前日期。

datediff()函数 - 计算两个DATE值之间的天数。

day()函数 - 获取指定日期月份的天(日)。

date_add()函数 - 将时间值添加到日期值。

date_sub()函数 - 从日期值中减去时间值。

date_format()函数 - 根据指定的日期格式格式化日期值。

dayname()函数 - 获取指定日期的工作日的名称。

dayofweek()函数 - 返回日期的工作日索引。

extract()函数 - 提取日期的一部分。

now()函数 - 返回当前日期和时间。

month()函数 - 返回一个表示指定日期的月份的整数。

str_to_date()函数 - 将字符串转换为基于指定格式的日期和时间值。

sysdate()函数 - 返回当前日期。

timediff()函数 - 计算两个TIMEDATETIME值之间的差值。

timestampdiff()函数 - 计算两个DATEDATETIME值之间的差值。

week()函数 - 返回一个日期的星期数值。

weekday()函数 - 返回一个日期表示为工作日/星期几的索引。

year()函数 - 返回日期值的年份部分。

字符串函数

concat()函数 - 将两个或多个字符串组合成一个字符串。

length()函数&char_length()函数 - 以字节和字符获取字符串的长度。

left()函数 - 获取指定长度的字符串的左边部分。

replace()函数 - 搜索并替换字符串中的子字符串。

substring()函数 - 从具有特定长度的位置开始提取一个子字符串。

trim()函数 - 从字符串中删除不需要的字符。

find_in_set()函数 - 在逗号分隔的字符串列表中找到一个字符串。

format()函数 - 格式化具有特定区域设置的数字,舍入到小数位数。

8.SQL注释

1.
SELECT prod_name -- 这是一条注释 FROM Products;
2.
# 这是一条注释
SELECT prod_name FROM Products;
3.
/* SELECT prod_name, vend_id FROM Products; */
SELECT prod_name
FROM Products;

9.SQL代码规范

[SQL编程格式的优化建议] https://zhuanlan.zhihu.com/p/27466166

[SQL Style Guide] https://www.,dsqlstyle.guide/

#作业#

项目一:查找重复的电子邮箱(难度:简单)

创建 email表,并插入如下三行数据

+----+---------+
| Id | Email   |
+----+---------+
| 1  | a@b.com |
| 2  | c@d.com |
| 3  | a@b.com |
+----+---------+

编写一个 SQL 查询,查找 Email 表中所有重复的电子邮箱。

根据以上输入,你的查询应返回以下结果:

+---------+
| Email   |
+---------+
| a@b.com |
+---------+

答案:

SELECT Email
FROMemail
GROUP BY Email
HAVING COUNT(Email) > 1;

说明:所有电子邮箱都是小写字母。

项目二:查找大国(难度:简单)

创建如下 World 表

+-----------------+------------+------------+--------------+---------------+
| name            | continent  | area       | population   | gdp           |
+-----------------+------------+------------+--------------+---------------+
| Afghanistan     | Asia       | 652230     | 25500100     | 20343000      |
| Albania         | Europe     | 28748      | 2831741      | 12960000      |
| Algeria         | Africa     | 2381741    | 37100000     | 188681000     |
| Andorra         | Europe     | 468        | 78115        | 3712000       |
| Angola          | Africa     | 1246700    | 20609294     | 100990000     |
+-----------------+------------+------------+--------------+---------------+

如果一个国家的面积超过300万平方公里,或者(人口超过2500万并且gdp超过2000万),那么这个国家就是大国家。

编写一个SQL查询,输出表中所有大国家的名称、人口和面积。

例如,根据上表,我们应该输出:

+--------------+-------------+--------------+
| name         | population  | area         |
+--------------+-------------+--------------+
| Afghanistan  | 25500100    | 652230       |
| Algeria      | 37100000    | 2381741      |
+--------------+-------------+--------------+

答案2 :

SELECT name, population, area
FROMWorld
WHERE   area > 3000000 or (population > 25000000 AND gdp > 20000000);

006-Archer@冯鹤楠 MySQL 打卡作业2相关推荐

  1. 数据库MySQL(课下作业,必做)

    数据库MySQL(课下作业,必做) 题目要求: 下载附件中的world.sql.zip, 参考http://www.cnblogs.com/rocedu/p/6371315.html#SECDB,导入 ...

  2. MySQL数据库大作业——学生管理系统GUI

    MySQL数据库大作业--学生管理系统GUI 原程序链接: https://www.bbsmax.com/A/kmzL3WQBdG/ 为了完成数据库大作业, 我在其基础上进行了一定的修改和扩充. 如果 ...

  3. 基于微信小程序+VUE+Springboot+Mysql的中小学生作业管理系统

    基于微信小程序+VUE+Springboot+Mysql的中小学生作业管理系统 ✌全网粉丝20W+,csdn特邀作者.博客专家.CSDN新星计划导师.java领域优质创作者,博客之星.掘金/华为云/阿 ...

  4. SSH+Mysql实现的作业批改管理系统(功能包含分学生、教师、管理员三种角色登录,作业上传、给老师留言、学习内容下载、作业评分、给学生留言、教师学生管理、公告管理、学习资源管理、作业管理等)

    博客目录 SSH+Mysql实现的作业批改管理系统 实现功能截图 系统功能 使用技术 代码 完整源码 SSH+Mysql实现的作业批改管理系统 本系统是一个作业批改管理系统系统,分为三个角色:学生.教 ...

  5. mysql 启动卡主,cpu 100%

    [mysql@mysqlhq scripts]$ cat /etc/redhat-release Kylin Linux release 3.3.1707 (Core) mysql version S ...

  6. sqoop从HDFS导出数据到Mysql,卡在Running job: job_1571036741208_0010不动了,或者map 100% reduce 0%不动了

    用sqoop从HDFS导出数据到mysql,一直卡在Running job: job_1571036741208_0010,应该是内存太小,导致速度太慢 在 yarn-site-xml中增加下面两个, ...

  7. mysql安装卡在最后一步解决方案(附带万能安装方案)

    mysql5版本安装问题 造成这种现象的原因主要是因为之前安装过MySQL没有卸载干净,数据库服务项被占用了.网上的解决方法主要有以下几种,每个人情况不一样,若一种方法不行就多试几种. 可以直接跳到我 ...

  8. mysql定期卡顿_MySQL卡顿和优化

    转载别人论坛的评论:mysql 1.若是是你,你怎么处理慢查询引发的问题,而且在之后避免这种状况发生?sql 对于MySQL的慢查询问题,一般咱们是这么干的: 1)开启MySQL服务器的慢查询记录功能 ...

  9. win10安装mysql一直卡在最后一步进行不下去

    新买的电脑,mysql的win10一直安装不了,一直卡在最后一步.仔细阅读下面文章解决. https://blog.csdn.net/fpga_zy/article/details/80689265 ...

  10. php mysql防卡_php mysql防止sql注入详解

    引发 SQL 注入攻击的主要原因,是因为以下两点原因: 1. php 配置文件 php.ini 中的 magic_quotes_gpc选项没有打开,被置为 off 2. 开发者没有对数据类型进行检查和 ...

最新文章

  1. 怎么解决tomcat占用8080端口问题图文教程
  2. 如何测试tomcat安装成功
  3. SAP修改消息内容和报错类型(SE91和OBA5)
  4. socket编程中常见的概念问题!
  5. Xshell中输入rz提示:-bash: rz: command not found
  6. ERP customizing extraction - how extraction function module is determined
  7. java rc2加密_急求java RC2加密算法
  8. 百度SEO站群易优CMS 聚合关键词seo插件(上权重神器)
  9. Android NDK开发Crash错误定位
  10. hawk物联网组态工具_物联网web组态网关在智慧农业中的应用
  11. [4G5G专题-45]:物理层-基带子载波数字调制解调(星座图, 相位调制PSK, 正交幅度相位调制QAM)
  12. dz中footer.php在哪找,去掉DZ顶部标题,美化底部左下方版权,详细教程
  13. 摄影小白入门相机选择(个人出发)
  14. 用台达PLC485通信控制11台英威腾变频启动停止速度设定
  15. 如何让“后浪”热爱工作,来自“前浪”的十大拷问
  16. 前端练习:day02
  17. matlab特征值意义,特征值 - MATLAB Simulink - MathWorks 中国
  18. Rufus轻松创建USB启动盘
  19. 经典推荐:盛大架构师周爱民回顾职业历程,分享十项建议
  20. Longhorn配置参数详解

热门文章

  1. Mac启动台显示白色问号图标
  2. 信捷用c语言编写梯形图,PLC一键启停编程梯形图实例
  3. VM虚拟机win2003桥接模式本地连接受限制问题
  4. Laravel5利用163邮箱实现发送邮件mail功能
  5. html上下两个箭头符号怎么打出来,上下两个半箭头符号怎么打啊?高手进来看下,有图示的!...
  6. TPS65217DRSLR 电源管理IC 设计用于便携式设备
  7. Travis CI 持续集成工具 教程
  8. HFSS 3D LAYOUT TDR仿真
  9. 第三方支付接口搜集(附下载)
  10. “霜”面打击,你的电脑HOLD住吗?