MySQL基础 -- 查询语句

SQL查询语句

  • 1. 导入示例数据库
  • 2. SQL与MySQL
  • 3. SELECT FROM
    • 3.1 解释
    • 3.2 去重语句
    • 3.3 前N个语句
    • 3.4 CASE...END语句
  • 4. 筛选语句 WHERE
    • 4.1 解释
    • 4.2 运算符
      • 4.2.1 操作符
      • 4.2.2 通配符
  • 5. 分组语句 GROUP BY
    • 5.1 聚集函数
    • 5.2 分组函数(GROUP BY)
    • 5.3 HAVING过滤条件
  • 6. 排序语句 ORDER BY
  • 7. 创建计算字段
    • 7.1 拼接字段
    • 7.2 执行算术计算
  • 8. 函数
    • 8.1 时间函数
    • 8.2 数值函数
    • 8.3 字符串函数
  • 9. SQL注释
  • 10. SQL代码规范
  • 11. 小项目练习
    • 11.1 查找重复的电子邮箱
    • 11.2 查找大国
    • 11.3 查找两门以及两门以上不及格的同学的平均分
  • 12. 子查询
    • 12.1 where子查询
    • 12.2 from型子查询
    • 12.3 exists子查询

1. 导入示例数据库

教程:MySQL导入示例数据库

2. SQL与MySQL

  • SQL
    (发音为字母 S-Q-L 或 sequel)是 Structured Query Language(结构化查询语言)的缩写,是一种用于操作数据库的语言,它是用于所有数据库基本语言,虽然不同数据库之间存在较小语法差距,但基本的SQL保持不变。
  • MySQL
    MySQL是一种关系型数据库管理系统(RDBMS),MySQL也是使用SQL语言来访问数据库。

具体区别:http://m.php.cn/article/412972.html

3. SELECT FROM

以下例子都是在Navicat for MySQL软件下编写,SQL语言不区分大小写,但是关键字通常用大写。

3.1 解释

#从一个名为tables的表中检索一个名为col_names的列
select col_name from tables  
#检索多个列
select col_1, col_2, col_3 from tables
#检索所有列
select * from tables

MySQL基础 -- 查询语句_第1张图片

3.2 去重语句

#去掉重复项
select distinct col_name from table

MySQL基础 -- 查询语句_第2张图片
MySQL基础 -- 查询语句_第3张图片

3.3 前N个语句

#返回前N行
select col_name from tables LIMIT N
#检索从第a+1行开始,累加b条记录 - limit [offset,] N
select col_name from tables LIMIT a,b - 偏移a行,取b条记录
#返回从这一列第M个数(不包括M)开始后的N行
select col_name from tables LIMIT N offset M

3.4 CASE…END语句

直接看例子:
MySQL基础 -- 查询语句_第4张图片

4. 筛选语句 WHERE

4.1 解释

在大量数据中,只检索所需数据需要指定搜索条件(search criteria),搜索条件也称为过滤条件(filter condition)。
SELECT 列名称 FROM 表名称 WHERE 列 运算符 值

4.2 运算符

4.2.1 操作符

MySQL基础 -- 查询语句_第5张图片

#范围检查
select col_name, price from tables where price between 5 and 10
#空置检查
select col_name from tables where price is null

当然还有其他操作符:

  • AND, OR
    AND的顺序优先于OR,在联合使用时最好加个括号,防止出错!
  • IN(功能与OR相当)
    那为什么要使用IN操作符?其优点如下:
  1. 在有很多合法选项时,IN操作符的语法更清楚,更直观。
  2. 在与其他AND和OR操作符组合使用IN时,求值顺序更容易管理。
  3. IN操作符一般比一组OR操作符执行得更快。
  4. IN的最大优点是可以包含其他 SELECT语句,能够更动态地建立WHERE子句。
    MySQL基础 -- 查询语句_第6张图片
  • NOT
    WHERE子句中的NOT操作符有且只有一个功能,那就是否定其后所跟的任何条件。
    SELECT officeCode from employees WHERE officeCode NOT IN (2,3);

注意:SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号。

4.2.2 通配符

前面介绍的所有操作符都是针对已知值进行过滤的。不管是匹配一个值还是多个值,检验大于还是小于已知值,或者检查某个范围的值,其共同点是过滤中使用的值都是已知的。但是,这种过滤方法并不是任何时候都好用。例如,怎样搜索产品名中包含文本 bean bag的所有产品?用简单的比较操作符肯定不行,必须使用通配符。

  • 通配符(wildcard)—— 用来匹配值的一部分的特殊字符。
  • 搜索模式(Search Pattern):由字面意义的文本、通配符字符或者二者的任意组合构成的搜索条件。
  • %:“匹配出现任意次数的任意字符——可以是0次”
  • _:“只匹配单个字符——不多也不少”
Select * from emp where ename like 'M%';
注意:谓词(predicate)
操作符何时不是操作符?答案是,它作为谓词时。从技术上说,LIKE是谓词而不是操作符。
虽然最终的结果是相同的,但应该对此术语有所了解,以免在 SQL文献或手册中遇到此术语时不知所云。

/*
 % 表示多个字值,_ 下划线表示一个字符;
 M% : 为能配符,正则表达式,表示的意思为模糊查询信息为 M 开头的。
 %M% : 表示查询包含M的所有内容。
 %M_ : 表示查询以M在倒数第二位的所有内容。
 */
 在匹配的时候注意空格,有可能因为原文中多了一个空格,而我们匹配不出来。因此可以用函数去掉空格或者自己加多一个空格。

MySQL基础 -- 查询语句_第7张图片

5. 分组语句 GROUP BY

5.1 聚集函数

SQL中提供的聚集函数可以用来统计、求和、求最值等等。
MySQL基础 -- 查询语句_第8张图片
MySQL基础 -- 查询语句_第9张图片

注意:
COUNT()
* :计数所有选择的行,包括NULL值;
ALL 列名:计数指定列的所有非空值行,如果不写,默认为ALL;
DISTINCT 列名:计数指定列的唯一非空值行

SUM()
只有ALL与DISTINCT两种计数规范,无*。

5.2 分组函数(GROUP BY)

SQL中数据可以按列名分组,搭配聚合函数十分实用。
MySQL基础 -- 查询语句_第10张图片
分组中也可以加入筛选条件WHERE,不过这里一定要注意的是,执行顺序为:WHERE过滤→分组→聚合函数。
MySQL基础 -- 查询语句_第11张图片

5.3 HAVING过滤条件

说了WHERE过滤、分组操作、聚合函数的执行顺序,那如果我们希望在聚合之后执行过滤条件怎么办?
11
所以WHER是分组前对数据进行过滤,HAVING是分组后对数据进行过滤。
这里提及一下SQL的执行顺序:
一、sql执行顺序
(1) from
(3) join
(2) on
(4) where
(5) group by(开始使用select中的别名,后面的语句中都可以使用)
(6) 聚合函数(avg,sum…)
(7) having
(8) select
(9) distinct
(10) order by
(11) limit

6. 排序语句 ORDER BY

  • ORDER BY 语句用于根据指定的列对结果集进行排序。
  • ORDER BY 语句默认按照升序对记录进行排序。
  • 如果希望按照降序对记录进行排序,可以使用 DESC 关键字。
    MySQL基础 -- 查询语句_第12张图片
    MySQL基础 -- 查询语句_第13张图片
    注意以上两图的不同(DESC的位置决定了谁逆顺序,当然全部逆也可以)。

7. 创建计算字段

存储在数据库表中的数据一般不是应用程序所需要的格式,下面举几个例子。

  1. 需要显示公司名,同时还需要显示公司的地址,但这两个信息存储在不同的表列中。
  2. 列数据是大小写混合的,但报表程序需要把所有数据按大写表示出来。
  3. 物品订单表存储物品的价格和数量,不存储每个物品的总价格(价格乘以数量)。但为打印发票,需要物品的总价格。

在上述每个例子中,存储在表中的数据都不是应用程序所需要的。我们需要直接从数据库中检索出转换、计算或格式化过的数据,这就是计算字段可以派上用场的地方了。(字段(field):基本上与列(column)的意思相同,经常互换使用,不过数据库列一般称为列,而术语字段通常与计算字段一起使用。)

7.1 拼接字段

拼接(concatenate):将值联结到一起(将一个值附加到另一个值)构成单个值。
在MySQL中,使用Concat函数
MySQL基础 -- 查询语句_第14张图片

7.2 执行算术计算

例如对应一开始的第三个例子:
MySQL基础 -- 查询语句_第15张图片

8. 函数

8.1 时间函数

参考:时间函数

8.2 数值函数

这里详细列出了SQL数值函数:数值函数
这里是某些常用函数的具体用法:具体用法

8.3 字符串函数

参考:字符串函数

9. SQL注释

  • 单行注释:# 这是注释,只能放一行
  • 多行注释:/* 这里可以放很多行 */

10. SQL代码规范

参考:
SQL编程格式的优化建议
SQL Style Guide

11. 小项目练习

11.1 查找重复的电子邮箱

  • 创建email表:
    MySQL基础 -- 查询语句_第16张图片
  • email表结果:
    15
  • 任务:查找email表中所有重复的电子邮箱:
    MySQL基础 -- 查询语句_第17张图片

11.2 查找大国

  • 新建World表:
    MySQL基础 -- 查询语句_第18张图片
  • World表结果:
    MySQL基础 -- 查询语句_第19张图片
  • 如果一个国家的面积超过300万平方公里,或者(人口超过2500万并且gdp超过2000万),那么这个国家被称为大国。任务:输出表中所有大国名字、人口和面积。
    MySQL基础 -- 查询语句_第20张图片
    这里补充一点:
    sql关系型运算符优先级高到低为:not >and> or
    所以上图中最后一行的括号可以不加,因为先进行 AND 运算再进行 OR 运算,但是为了增强程序可读性,建议添加!

11.3 查找两门以及两门以上不及格的同学的平均分

MySQL基础 -- 查询语句_第21张图片
结果:
在这里插入图片描述

做法一:
在这里插入图片描述
做法二:
在这里插入图片描述

12. 子查询

12.1 where子查询

把内层查询结果作为外层查询的比较条件。

12.2 from型子查询

把内层的查询结果当成临时表,供外层sql再次查询。

12.3 exists子查询

把外层的查询结果,拿到内层,看内层的查询是否成立。
例如:查询有商品编号的栏目
select cat_id,cat_name from category where exists (select * from goods where goods.cat_id = category.cat_id);

你可能感兴趣的:(MySQL)