1.1 MySQL 数据库基础
1.2 MySQL 基础 (一)- 查询语句
#学习内容#
\1. 导入示例数据库,教程 https://www.yiibai.com/mysql/how-to-load-sample-database-into-mysql-database-server.html
\2. SQL是什么?MySQL是什么?
数据库只是一个结构化的数据集合。数据本质上相互关联,例如,产品属于产品类别并与多个标签相关联。这就是为什么要使用关系数据库。
在关系数据库中,我们使用表对产品,类别,标签等数据进行建模。 表包含列和行。它就像一个电子表格(Excel)。表可以涉及的使用有:一对一,一对多,多对一关系等关系。
因为我们要处理大量的数据,所以需要一种方法来定义数据库,表等,并更有效地处理数据。 另外,我们可以将数据转换成数据信息。
SQL代表结构化查询语言(Structured Query Language)。SQL是用于访问数据库的标准化语言。
SQL包含三个部分:
- 数据定义语言包含定义数据库及其对象的语句,例如表,视图,触发器,存储过程等。
- 数据操作语言包含允许您更新和查询数据的语句。
- 数据控制语言允许授予用户权限访问数据库中特定数据的权限。
SQL语句主要分为:
DQL:数据查询语⾔,⽤于对数据进⾏查询,如select
DML:数据操作语⾔,对数据进⾏增加、修改、删除,如insert、udpate、delete
TPL:事务处理语⾔,对事务进⾏处理,包括begin transaction、commit、rollback
DCL:数据控制语⾔,进⾏授权与权限回收,如grant、revoke
DDL:数据定义语⾔,进⾏数据库、表的管理等,如create、drop
CCL:指针控制语⾔,通过控制指针完成表的操作,如declare cursor
对于web程序员来讲,重点是数据的crud(增删改查),必须熟练编写DQL、DML,
能够编写DDL完成数据库、表的操作,其它语⾔如TPL、DCL、CCL了解即可
MySQL是一个数据库管理系统,也是一个关系数据库。
当前主要使⽤两种类型的数据库:关系型数据库、⾮关系型数据库。
Mysql、SQL Sever中关键字语句不区分大小写。
- 查询语句 SELECT FROM (select from)
用SELECT
语句从表或视图获取数据。表由行和列组成,如电子表格。 通常,我们只希望看到子集行,列的子集或两者的组合。SELECT
语句的结果称为结果集,它是行列表,每行由相同数量的列组成。
语句解释
SELECT
语句的语法:
SELECT
column_1, column_2, ...
FROM
table_1
[INNER | LEFT |RIGHT] JOIN table_2 ON conditions
WHERE
conditions
GROUP BY column_1
HAVING group_conditions
ORDER BY column_1
LIMIT offset, length;
SELECT(select)
语句由以下列表中所述的几个子句组成:
-
SELECT
之后是逗号分隔列或星号(*
)的列表,表示要返回所有列。 -
FROM
指定要查询数据的表或视图。 -
JOIN
根据某些连接条件从其他表中获取数据。 -
WHERE
过滤结果集中的行。 -
GROUP BY
将一组行组合成小分组,并对每个小分组应用聚合函数。 -
HAVING
过滤器基于GROUP BY
子句定义的小分组。 -
ORDER BY
指定用于排序的列的列表。 -
LIMIT
限制返回行的数量。
语句中的SELECT
和FROM
语句是必须的,其他部分是可选的。
如果要获取表中所有列的数据,可以列出SELECT
子句中的所有列名,或者只需使用星号(*
)表示您想要从表的所有列获取数据。
前N个语句
CASE…END判断语句
\4. 筛选语句 WHERE
语句解释:如果使用SELECT语句但不使用WHERE子句在表中查询数据,则会获取表中的所有行记录,这些行记录中大部分是不想要的行记录。
WHERE
子句允许根据指定的过滤表达式或条件来指定要选择的行。
运算符/通配符/操作符
下表列出了可用于在WHERE
子句中形成过滤表达式的比较运算符。
操作符 | 描述 |
| 等于,几乎任何数据类型都可以使用它。 |
| 不等于 |
| 小于,通常使用数字和日期/时间数据类型。 |
| 大于, |
| 小于或等于 |
| 大于或等于 |
还有一些有用的运算符可以在WHERE
子句中使用来形成复杂的条件,例如:
- BETWEEN选择在给定范围值内的值。
- LIKE匹配基于模式匹配的值。
- IN指定值是否匹配列表中的任何值。
-
IS NULL
检查该值是否为NULL
。
通配符:查询包含某些内容的语句
操作符:就是给语句加条件的特殊字符
\5. 分组语句 GROUP BY
聚集函数
语句解释
HAVING子句
\6. 排序语句 ORDER BY
语句解释
正序、逆序
\7. 函数
时间函数
数值函数
字符串函数
8,SQL注释:
– 用于单行注释,格式:–注释内容。
/* 内容*/,"/“用于注释文字的开头,”/"用于注释文字的结尾,可在程序中标识多行文字为注释。
\9. SQL代码规范
[SQL编程格式的优化建议] https://zhuanlan.zhihu.com/p/27466166
[SQL Style Guide] https://www.sqlstyle.guide/
#作业#
项目一:查找重复的电子邮箱(难度:简单)
创建 email表,并插入如下三行数据
±—±--------+
| Id | Email |
±—±--------+
| 1 | a@b.com |
| 2 | c@d.com |
| 3 | a@b.com |
±—±--------+
编写一个 SQL 查询,查找 Email 表中所有重复的电子邮箱。
根据以上输入,你的查询应返回以下结果:
±--------+
| Email |
±--------+
| a@b.com |
±--------+
说明:所有电子邮箱都是小写字母。
-- 创建表
CREATE TABLE email (
ID INT NOT NULL PRIMARY KEY,
Email VARCHAR(255)
);
-- 插入数据
INSERT INTO email VALUES('1','a@b.com');
INSERT INTO email VALUES('2','c@d.com');
INSERT INTO email VALUES('3','a@b.com');
项目二:查找大国(难度:简单)
创建如下 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 |
±-------------±------------±-------------+
-- 创建表
CREATE TABLE World (
name VARCHAR(50) NOT NULL,
continent VARCHAR(50) NOT NULL,
area INT NOT NULL,
population INT NOT NULL,
gdp INT NOT NULL
);
-- 插入数据
INSERT INTO World
VALUES('Afghanistan','Asia',652230,25500100,20343000);
INSERT INTO World
VALUES('Albania','Europe',28748,2831741,12960000);
INSERT INTO World
VALUES('Algeria','Africa',2381741,37100000,188681000);
INSERT INTO World
VALUES('Andorra','Europe',468,78115,3712000);
INSERT INTO World
VALUES('Angola','Africa',1246700,20609294,100990000);