学习内容
- 导入示例数据库,教程
- SQL是什么?MySQL是什么?
- 查询语句 SELECT FROM
语句解释
去重语句
前N个语句
CASE…END判断语句 - 筛选语句 WHERE
语句解释
运算符/通配符/操作符 - 分组语句 GROUP BY
聚集函数
语句解释
HAVING子句 - 排序语句 ORDER BY
语句解释
正序、逆序 - 函数
时间函数
数值函数
字符串函数 - SQL注释
- SQL代码规范
SQL编程格式的优化建议
SQL Style Guide
导入示例数据库
第一种方法是在命令提示符中用source
命令,详见教程
另外,我们可以在Navicat导入,先新建数据库如图:
在右键点击建好的数据库,运行SQL文件:
这样就导入成功啦~
SQL与MySQL
- SQL(发音为字母 S-Q-L或 sequel)是 Structured Query
Language(结构化查询语言)的缩写。SQL是一种专门用来与数据库沟通的语言。设计SQL的目的是为了简单有效地从数据库中读写数据。 - MySQL是一种DBMS(数据库管理系统),可以完成数据的所有存储、检索、管理和处理等操作。
查询语句
Select productNAME
from products;
-
productNAME
是列名,用来选需要查询的列,如查询多列,用,
隔开即可,products
是表名。Select
和form
是SQL的关键字,也叫保留字,关键字有特殊含义,不来用来做表名和列名。 -
另外,SQL不区分大小写,也没有空格、提行等要求要求,可以有自己的风格
我的习惯是和英语一致,语句首字母大写,后面小写,并且有一些提行,语句结束有分号。(和一般的关键字全大写不太一样)Select distinct productline
from products;
distinct
是实现去除重复的关键字。
Select productline
from products
limit 1,5;
前N行用limit
实现,1,5
表示从第2行开始的前5行结果,(MySQL和C,python一样也是从0开始编号)。如果从1行开始,0可以不写。
Select checkNumber,case when amount>1e5 then'优秀'
when amount<=1e5 then'良好'
end as '总计'
from payments;
CASE…END判断语句,用来根据查询数据新建一列。
筛选语句
Select checkNumber,amount
from payments
where amount>1e4;
where
是筛选的关键字,后面跟一个判断条件。SQL的使用=
进行相等判断,不等用!=
或<>
均可,另外还有between
和is null
等和逻辑判断符and,or,in,not,xor
等。(和其他语言也比较类似)
Select productCode
from products
where productCode like 'S1%9';
通配符%
和_
和like
配合使用,%
代替多个字符,_
代替单个字符
分组语句
Select productline,count(*) as num
from products
group by productLine
having count(*)>10;
简单看下输出
group by
用来实现,count(*)
用来计数,having
子句一般用来过滤分组。
排序语句
Select productline,count(*) as num
from products
group by productLine
order by num desc;
刚才的例子小小的改一下,order by
是排序的关键词,默认是升序asc
,降序用desc
函数
与其他大多数计算机语言一样,SQL支持利用函数来处理数据。函数一般是在数据上执行的,它给数据的转换和处理提供了方便。主要有时间函数、数值函数、字符串函数等类。一般根据实际使用查询即可,这有一个汇总的表可以参考。
SQL注释
SQL单行注释用#
或者--
注意后面有空格。多行注释用/*
开始,*/
结束。
SQL代码规范
代码规范资料有,一般要求易读就行。我的自己风格可能也并不好,不过全大写的化感觉怪怪的。嗯~
作业
项目一:查找重复的电子邮箱(难度:简单)
创建 email表,并插入如下三行数据
±—±--------+
| Id | c |
±—±--------+
| 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');
– 简单的查询语言可以实现,解答如下:
Select Email
from email
group by email
having count(*)>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 |
±-------------±------------±-------------+
– 创建表
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);
– 这道题也可以用简单查询实现:
Select name,population,area
from World
where population>25000000 or (area>3000000 and gdp>20000000);
至此,MySQL的简单查询已经基本学会啦,后续还需要多加练习。