MySQL入门(二):查询语句

SQL是什么?MySQL是什么?

1.SQL
Structured Query Language(结构化查询语言)的缩写。它是一种专门用来与数据库沟通的语言。

2.MySQL
是一个关系型数据库管理系统,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。

一、导入数据库

第一步:下载示例数据库

第二步:将下载的文件解压缩到文件夹中(这里地址为D:\data\yiibaidb\yiibaidb.sql)

第三步:连接到MySQL服务器并创建数据库
1.连接数据库
找到MySQL Server 8.0\bin位置,然后打开命令提示符

cd C:\Program Files\MySQL\MySQL Server 8.0\bin
mysql -hlocalhost -uroot -p

MySQL入门(二):查询语句
2.创建数据库

mysql> CREATE DATABASE IF NOT EXISTS yiibaidb DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
mysql> use yiibaidb;

3.导入数据

mysql> use yiibaidb;
mysql> source D:\data\yiibaidb\yiibaidb.sql

第四步:测试并导入结果

mysql> select city,phone,country from `offices`;

MySQL入门(二):查询语句

二、语句类型

本章节的展示基于Navicat 12.1

(一)查询语句 SELECT FROM

1.语句解释
从一个或多个表中检索信息。

2.通用语法
以下为在MySQL数据库中查询数据通用的 SELECT 语法:

SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]
  • 查询语句中可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。
  • SELECT 命令可以读取一条或者多条记录。
  • 可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据
  • 可以使用 WHERE 语句来包含任何条件。
  • 可以使用 LIMIT 属性来设定返回的记录数。
  • 可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。

3.操作示例
目标:查询 yiibaidb数据库customers表格的信息

SELECT * FROM customers ;

MySQL入门(二):查询语句
4.特殊案例
4.1去重语句
(1)定义:在 SELECT 后面加入 DISTINCT 可筛选出不同的(具有唯一性)的值。
(2)目标:查询yiibaidb数据库customers表格中city值有哪些

SELECT DISTINCT city  FROM customers ;

MySQL入门(二):查询语句
4.2 限制语句
(1)定义:使用 LIMIT 语句可以限制返回的条数,若同时使用 OFFSET 会加入偏移(即从第几行开始取)。
需要注意:第一个被检索的行是第 0行,而不是第 1行。例如,LIMIT 1 OFFSET 1会检索第 2行,而不是第 1行。

(2)目标:从3行开始选取yiibaidb数据库customers表5条数据。

SELECT * FROM customers LIMIT 5 OFFSET 3 ;

MySQL入门(二):查询语句
4.3 CASE.WHEN.END判断语句
(1)定义:CASE WHEN END 语法一般用于判断条件后返回对应的值
(2)分类:

-- 简单函数
CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END
-- 搜索函数
CASE WHEN [expr] THEN [result1]…ELSE [default] END

需要注意:case函数只返回第一个符合条件的值,剩下的case部分将会被自动忽略。

(3)目标:
对于简单函数

SELECT *,
	CASE country
	  WHEN 'France' THEN '欧洲'
	  WHEN 'USA' THEN '美洲'
	  ELSE '其他'
	END '大洲'
FROM customers ;

MySQL入门(二):查询语句
对于搜索函数
MySQL入门(二):查询语句

(二)筛选语句 WHERE

1.语句解释
实现有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句中。

2.通用语法

SELECT field1, field2,...fieldN FROM table_name1, table_name2...
[WHERE condition1 [AND [OR]] condition2.....
  • 查询语句中你可以使用一个或者多个表,表之间使用逗号, 分割,并使用WHERE语句来设定查询条件。
  • 可以在 WHERE 子句中指定任何条件。
  • 可以使用 AND 或者 OR 指定一个或多个条件。
  • WHERE 子句也可以运用于 SQL 的 DELETE 或者 UPDATE 命令。
  • WHERE 子句类似于程序语言中的 if 条件,根据 MySQL 表中的字段值来读取指定的数据。

3.操作符
以下为操作符列表,可用于 WHERE 子句中。
MySQL入门(二):查询语句
操作示例:
目标:查找yiibaidb数据库customers表中符合以下条件数据:国别是美国且creditlimit大于100000
MySQL入门(二):查询语句
4.通配符
在 SQL 中,通配符与 SQL LIKE 操作符一起使用。SQL 通配符用于搜索表中的数据。

在 SQL 中,可使用以下通配符:
MySQL入门(二):查询语句
操作示例:
目标:查找yiibaidb数据库customers表中符合以下条件数据:contactfirstname 是 J 开头
MySQL入门(二):查询语句
5.运算符
MySQL 主要有以下几种运算符:

  • 算术运算符
  • 比较运算符
  • 逻辑运算符
  • 位运算符

(1)算术运算符
MySQL 支持的算术运算符包括:
MySQL入门(二):查询语句
在除法运算和模运算中,如果除数为0,将是非法除数,返回结果为NULL。

(2)比较运算符
SELECT 语句中的条件语句经常要使用比较运算符。通过这些比较运算符,可以判断表中的哪些记录是符合条件的。比较结果为真,则返回 1,为假则返回 0,比较结果不确定则返回 NULL。

MySQL入门(二):查询语句
(3)逻辑运算符

逻辑运算符用来判断表达式的真假。如果表达式是真,结果返回 1。如果表达式是假,结果返回 0。

MySQL入门(二):查询语句
(4)位运算符
位运算符是在二进制数上进行计算的运算符。位运算会先将操作数变成二进制数,进行位运算。然后再将计算结果从二进制数变回十进制数。

MySQL入门(二):查询语句

(三)分组语句 GROUP BY

1.语句解释
GROUP BY 语句根据一个或多个列对结果集进行分组。在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。

2.通用语法

SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;

3.操作示例
目标:统计yiibaidb数据库customers表中country类别数据
MySQL入门(二):查询语句

注意:在分组后的结果中,不可以使用 WHERE 对分组结果进行筛选,只能使用 HAVING 语句

(四)排序语句 ORDER BY

1.语句解释
对读取的数据进行排序,此时可以使用 MySQL 的 ORDER BY 子句来设定想按哪个字段哪种方式来进行排序,再返回搜索结果。

2.通用语法

SELECT field1, field2,...fieldN FROM table_name1, table_name2...
ORDER BY field1, [field2...] [ASC [DESC]]

ORDER BY 语句用于根据指定的列对结果集进行排序。ORDER BY 语句默认按照升序对记录进行排序。如果希望按照降序对记录进行排序,可以使用 DESC 关键字。

  • 可以使用任何字段来作为排序的条件,从而返回排序后的查询结果。
  • 可以设定多个字段来排序。
  • 可以使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列。
  • 可以添加 WHERE…LIKE 子句来设置条件。

3.操作示例
目标:对yiibaidb数据库customers表数据先按照customername排序,再按照customernumber排序
MySQL入门(二):查询语句

三、函数

MySQL 有很多内置的函数:

  • 字符串函数
  • 数字函数
  • 日期函数

具体可查看MySQL 函数|菜鸟教程

四、SQL注释

(一)单行注释

1.使用 #

#单行注释方法一
select * from customers;

或者
2.使用–


-- 单行注释方法二
select * from customers

注意:–后跟有一个空格

(二)多行注释

注释从 /* 开始,到 / 结束, / 和 */ 之间的任何内容都是注释。

/*
此处为注释....
*/
select * from customers;

五、SQL代码规范

可参看

SQL编程格式的优化建议
SQL style guide by Simon Holywell

练习

练习一:查找重复的电子邮箱(难度:简单)
创建 email表,并插入如下三行数据
±—±--------+
| Id | Email |
±—±--------+
| 1 | [email protected] |
| 2 | [email protected] |
| 3 | [email protected] |
±—±--------+
编写一个 SQL 查询,查找 email 表中所有重复的电子邮箱。
根据以上输入,你的查询应返回以下结果:
±--------+
| Email |
±--------+
| [email protected] |
±--------+
说明:所有电子邮箱都是小写字母。

第一步:新建数据库

mysql> CREATE DATABASE IF NOT EXISTS emailtest DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
mysql> use emailtest;

第二步:新建数据表

mysql> CREATE TABLE email ( ID INT NOT NULL PRIMARY KEY, Email VARCHAR(255));

第三步:插入数据

mysql> INSERT INTO email VALUES('1','[email protected]');
mysql> INSERT INTO email VALUES('2','[email protected]');
mysql> INSERT INTO email VALUES('3','[email protected]');

第四步:查询数据

SELECT Email FROM email GROUP BY Email HAVING COUNT(Email)>1

MySQL入门(二):查询语句

项目二:查找大国(难度:简单)
创建如下 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 |
±-------------±------------±-------------+
第一步:新建数据库

mysql> CREATE DATABASE IF NOT EXISTS worldtest DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
mysql> use worldtest;

第二步:新建数据表

mysql> 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);

第三步:插入数据

mysql>INSERT INTO World VALUES( 'Afghanistan', 'Asia',652230,25500100,20343000);
mysql>INSERT INTO World VALUES( 'Albania', 'Europe' ,28748,2831741,12960000);
mysql>INSERT INTO World VALUES( 'Algeria', 'Africa' ,2381741,37100000,188681000);
mysql>INSERT INTO World VALUES( 'Andorra' , 'Europe' ,468,78115,3712000);
mysql>INSERT INTO World VALUES( 'Angola' , 'Africa' ,1246700,20609294,100990000);

第四步:查询数据

SELECT name, population, area FROM world WHERE area > 3000000 OR (population>25000000 AND gdp>20000000);

MySQL入门(二):查询语句
参考资料:
1.MySQL导入示例数据库
2.MySQL命令行学习
3.MySQL命令行工具和基本操作
4.MySQL基础 - 查询语句
5.MySQL 教程
6.SQL的case when then else end语句的用法