MySQL基础 -- 查询语句

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

2

3.2 去重语句

#去掉重复项
select distinct col_name from table

3
4

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语句

直接看例子:
1

4. 筛选语句 WHERE

4.1 解释

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

4.2 运算符

4.2.1 操作符

2

#范围检查
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子句。
    2.1
  • 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在倒数第二位的所有内容。
 */
 在匹配的时候注意空格,有可能因为原文中多了一个空格,而我们匹配不出来。因此可以用函数去掉空格或者自己加多一个空格。

6

5. 分组语句 GROUP BY

5.1 聚集函数

SQL中提供的聚集函数可以用来统计、求和、求最值等等。
7
8

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

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

5.2 分组函数(GROUP BY)

SQL中数据可以按列名分组,搭配聚合函数十分实用。
9
分组中也可以加入筛选条件WHERE,不过这里一定要注意的是,执行顺序为:WHERE过滤→分组→聚合函数。
10

5.3 HAVING过滤条件

说了WHERE过滤、分组操作、聚合函数的执行顺序,那如果我们希望在聚合之后执行过滤条件怎么办?
11
所以WHER是分组前对数据进行过滤,HAVING是分组后对数据进行过滤。
这里提及一下SQL的执行顺序:
一、sql执行顺序
(1) from
(2) join
(3) 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 关键字。
    12
    13
    注意以上两图的不同(DESC的位置决定了谁逆顺序,当然全部逆也可以)。

7. 创建计算字段

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

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

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

7.1 拼接字段

拼接(concatenate):将值联结到一起(将一个值附加到另一个值)构成单个值。
在MySQL中,使用Concat函数
在这里插入图片描述

7.2 执行算术计算

例如对应一开始的第三个例子:
在这里插入图片描述

8. 函数

8.1 时间函数

参考:时间函数

8.2 数值函数

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

8.3 字符串函数

参考:字符串函数

9. SQL注释

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

10. SQL代码规范

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

11. 小项目练习

11.1 查找重复的电子邮箱

  • 创建email表:
    14
  • email表结果:
    15
  • 任务:查找email表中所有重复的电子邮箱:
    16

11.2 查找大国

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

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

在这里插入图片描述
结果:
在这里插入图片描述

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

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值