文章目录

  • 1. 了解SQL
    • 1.1 什么是数据库
    • 1.2 什么是SQL
  • 2. MySQL简介
    • 2.1 什么是MySQL
  • 3. 使用MySQL
    • 3.1 连接
  • 4. 检索数据
    • 4.1 select 语句
  • 5. 排序检索数据
    • 5.1 排序数据
    • 5.2 按多个列排序
    • 5.3 指定排序方向
  • 6. 过滤数据
  • 7. 数据过滤
  • 8. 用通配符进行过滤
  • 9. 用正则表达式进行搜索
    • 1. 基本字符匹配
    • 2. 进行 or 匹配
    • 3. 匹配范围
    • 4. 匹配特殊字符
    • 5. 匹配字符类
    • 6. 匹配多个实例
    • 7. 定位符
  • 10. 创建计算字段
    • 1. 拼接
    • 2. 执行算术计算
  • 11. 使用数据处理函数
    • 1. 文本处理函数
    • 2. 日期和事件处理函数
    • 3. 数值处理函数
  • 12. 汇总数据
    • 1. 聚集函数
    • 2. 聚集不同的值
    • 3. 组合聚集函数
  • 13. 分组数据
    • 1. 分组 group by
  • 14. 使用子查询
    • 1. 利用子查询进行过滤
    • 2. 作为计算字段使用子查询

这本书从简单的数据检索开始,逐步引入一些复杂的内容,包括联结的使用、子查询、正则表达式和基于全文本的搜索,存储过程、游标、触发器、表约束等等。

1. 了解SQL

1.1 什么是数据库

数据库(database):保存有组织的数据的容器(通常是一个文件或一组文件)。

数据库软件被称为DBMS(数据库管理系统),数据库是通过DBMS创建和操纵的容器。

数据库和数据库软件的关系:使用 DBMS 来访问数据库。

:某种特定类型数据的结构化清单。
表名:在相同的数据库中不能两次使用相同的表名,但在不同的数据库中却可以使用相同的表名。
模式:关于数据库和表的布局及特性的信息。
:表中的一个字段,所有表都是由一个或多个列组成的。
数据类型:所容许的数据的类型。每个表列都用相应的数据类型。
:表中的一个记录。

主键:一列(或一组列),其值能够唯一区分表中每个行。
表中的任何列都可以作为主键,只要它满足以下条件:
 任意两行都不具有相同的主键值;
 每个行都必须具有一个主键值(主键列不允许NULL值)。

1.2 什么是SQL

SQL是结构化查询语言,是一种专门与数据库通信的语言。

2. MySQL简介

2.1 什么是MySQL

MySQL是一种DBMS,它是一种数据库管理软件。

DBMS可以分为两类:一类是基于共享文件系统的DBMS,另一类是基于客户机–服务器的DBMS。、

MySQL、 Oracle以及Microsoft SQL Server等数据库是基于客户机—服务器的数据库。客户机—服务器应用分为两个不同的部分。 服务器部分是负责所有数据访问和处理的一个软件。这个软件运行在称为数据库服务器的计算机上。客户机是与用户打交道的软件。

MySQL的当前版本为版本5(许多公司正在使用MySQL 3 和4)。
下面是最近版本中引入的主要更改。
 4——InnoDB引擎,增加事务处理(第26章)、并(第17章)、改进全文本搜索(第18章)等的支持。
 4.1——对函数库、子查询(第14章)、集成帮助等的重要增加。
 5——存储过程(第23章)、触发器(第25章)、游标(第24章)、
视图(第22章)等。
版本4.1和版本5对MySQL增加了重要的功能。

使用时:
 命令输入在mysql>之后;
 命令用;或\g结束,换句话说,仅按Enter不执行命令;
 输入help或\h获得帮助,也可以输入更多的文本获得特定命令的
帮助(如,输入help select获得使用SELECT语句的帮助);
 输入quit或exit退出命令行实用程序。

3. 使用MySQL

3.1 连接

MySQL与所有客户机—服务器DBMS一样,要求在能执行命令之前登录到DBMS。

登录之后可实现一些基本操作:

#显示数据库
show databases;
#使用某一个数据库
use test;
#显示该数据库中的表
show tables;
#显示某个表的表列
show columns from customers;
#还可以使用describe来显示表列
describe customers;
#显示广泛的服务器状态信息
show status;
#用来显示授予用户(所有用户或特定用户)的安全权限
show grants;
#显示服务器错误消息
show errors;
#显示服务器警告消息
show warnings;
#显示允许的show语句
help show;

4. 检索数据

4.1 select 语句

1. 普通检索

# 检索单个列
select prod_name from products;
# 检索多个列
select pro_id, prod_name, prod_price from products;
# 检索所有的列
select * from products;

2. distinct关键字

# distinct表示只返回唯一的值,它只能放在列名的前面
#使用时注意distinct关键字应用于所有的列而不仅是它前置的列
select distinct ven_id from products;

3. 限制结果

# 下面的语句表示返回前5行(不超过5行)
select prod_name from products limit 5;
# 下面的语句表示从第4行(行3)开始,返回5行
select prod_name from products limit 3, 5;

带一个值的LIMIT总是从第一行开始,给出的数为返回的行数。
带两个值的LIMIT可以指定从行号为第一个值的位置开始。

行0 检索出来的第一行为行0而不是行1。因此, LIMIT 1, 1
将检索出第二行而不是第一行。

4. 使用完全限定的表名

select products.prod_name from crashcourse.products;

5. 排序检索数据

5.1 排序数据

使用 order by

select prod_name from products order by prod_name;

通过非选择列进行排序 通常, ORDER BY子句中使用的列将是为显示所选择的列。但是,实际上并不一定要这样,用非检索的列排序数据是完全合法的。

5.2 按多个列排序

select prod_name, prod_price, prod_name from products
order by prod_price, prod_name;

5.3 指定排序方向

默认为ASC(ASCENDING)升序,可以不设置,而降序需要设置为DESC。

#按价格以降序排序产品(最贵的排在最前面)
select pro_id, prod_price, prod_name from products
order by prod_price DESC;#以降序排序产品(最贵的在最前面),然后再对产品名排序
select pro_id, prod_price, prod_name from products
order by prod_price DESC,prod_name;#使用ORDER BY和LIMIT的组合,能够找出一个列中最高或最低的值
select prod_price from products order by prod_price DESC
limit 1;

6. 过滤数据

使用where语句指定搜索条件

# 查找价格为2.50的行
select prod_name, prod_price from products
where prod_price = 2.50;
# 查找不是由供应商1003制造的所有产品
select vend_id, prod_name from products
where vend_id <> 1003;
# between 的使用
select prod_name, prod_price from products
where prod_price between 5 and 10;# 空值检查
select prod_name from products where prod_price is null;

需要注意:在同时使用ORDER BY和WHERE子句时,应该让ORDER BY位于WHERE之后, 否则将会产生错误。

7. 数据过滤

组合where字句,这些子句可以两种方式使用:以AND子句的方式或OR子句的方式使用。

需要注意:and操作符的优先级高于or,因此在同时使用时可以根据情况加上括号

# and 操作符
select prod_id, prod_price, prod_name from products
where vend_id = 1003 and prod_price <= 10;# or 操作符
select prod_name, prod_price from products
where vend_id = 1002 or vend_id = 1003;# and 和 or 同时使用
select prod_name, prod_price from products
where (vend_id = 1002 or vend_id  = 1003) and prod_price
>= 10;# in 操作符
select prod_name, prod_price from products
where vend_id in(1002,1003) order by prod_name;# not 操作符
select prod_name, prod_price from products
where vend_id not in(1002,1003) order by prod_name;

为什么要使用IN操作符?其优点具体如下。
 在使用长的合法选项清单时, IN操作符的语法更清楚且更直观。
 在使用IN时,计算的次序更容易管理(因为使用的操作符少)。
 IN操作符一般比OR操作符清单执行更快。
 IN的最大优点是可以包含其他SELECT语句,使得能够更动态地建立WHERE子句。

WHERE子句中的NOT操作符有且只有一个功能,那就是否定它之后所跟的任何条件。

MySQL中的 NOT MySQL 支 持 使 用 NOT 对 IN 、 BETWEEN 和EXISTS子句取反,这与多数其他DBMS允许使用NOT对各种条件取反有很大的差别。

8. 用通配符进行过滤

# % 通配符
# 表示搜索以jet开头的数据所在的行
select prod_id,prod_name from products where prod_name like 'jet%';# 搜索包含文本anvil的数据所在的行
select prod_id,prod_name from products where prod_name like '%anvil%';# 下划线 _ 通配符(只匹配单个字符)
select prod_id,prod_name from products where prod_name like
'_ ton anvil';

9. 用正则表达式进行搜索

随着过滤条件的复杂性的增加, WHERE子句本身的复杂性也有必要增加。

这也就是正则表达式变得有用的地方。正则表达式是用来匹配文本的特殊的串(字符集合)。如果你想从一个文本文件中提取电话号码,可以使用正则表达式。如果你需要查找名字中间有数字的所有文件,可以使用一个正则表达式。如果你想在一个文本块中找到所有重复的单词,可以使用一个正则表达式。如果你想替换一个页面中的所有URL为这些URL的实际HTML链接, 也可以使用一个正则表达式或者是两个正则表达式。

1. 基本字符匹配

关键字 regexp

# 检索出列prod_name包含文本1000的所有行
select prod_name from products
where prod_name regexp '1000'
order by prod_name;


r如果要把包含1000的都找到,使用下面的语句

regexp '.000’

# 检索出列prod_name包含文本000的所有行
select prod_name from products
where prod_name regexp '.000'
order by prod_name;

匹配不区分大小写 MySQL中的正则表达式匹配(自版本3.23.4后)不区分大小写(即,大写和小写都匹配)。为区分大小写,可使用BINARY关键字,如 WHERE prod_name REGEXP BINARY ‘JetPack .000’。

2. 进行 or 匹配

select prod_name from products
where prod_name regexp '1000|2000'
order by prod_name;

select prod_name from products
where prod_name regexp '[123] Ton'
order by prod_name;


这里,使用了正则表达式[123] Ton。 [123]定义一组字符,它的意思是匹配1或2或3,因此, 1 ton 和2 ton 都匹配且返回(没有3 ton)。

字符集合也可以被否定,即,它们将匹配除指定字符外的任何东西。为否定一个字符集,在集合的开始处放置一个^即可。因此,尽管[123]匹配字符1、 2或3,但 [ ^123]却匹配除这些字符外的任何东西。

3. 匹配范围

select prod_name from products
where prod_name regexp '[1-5] Ton'
order by prod_name;

4. 匹配特殊字符

为了匹配特殊字符,必须用\为前导。\-表示查找-, \.表示查找.。

select prod_name from products
where prod_name regexp '\\.'
order by prod_name;

5. 匹配字符类

6. 匹配多个实例


7. 定位符

10. 创建计算字段

1. 拼接

拼接:将值联结到一起构成单个值。

解决办法是把两个列拼接起来。在MySQL的SELECT语句中,可使用Concat()函数来拼接两个列。

select concat(vend_name, ' (', vend_country, ')')
from vendors order by vend_name;


**Concat()**拼接串,即把多个串连接起来形成一个较长的串。

**Concat()**需要一个或多个指定的串,各个串之间用逗号分隔。上面的SELECT语句连接以下4个元素:
 存储在vend_name列中的名字;
 包含一个空格和一个左圆括号的串;
 存储在vend_country列中的国家;
 包含一个右圆括号的串。

Trim函数 MySQL除了支持RTrim()(正如刚才所见,它去掉串右边的空格),还支持LTrim()(去掉串左边的空格)以及Trim()(去掉串左右两边的空格)

select concat(rtrim(vend_name), ' (', rtrim(vend_country), ')') as vend_title from vendors order by vend_name;

2. 执行算术计算

检索订单号20005中的所有物品

select prod_id, quantity, item_price from orderitems
where order_num = 20005;


item_price列包含订单中每项物品的单价。如下汇总物品的价格(单
价乘以订购数量):

select prod_id, quantity, item_price, quantity*item_price as
expended_price from orderitems where order_num = 20005;



如何测试计算 SELECT提供了测试和试验函数与计算的一个很好的办法。虽然SELECT通常用来从表中检索数据,但可以省略FROM子句以便简单地访问和处理表达式。例如, SELECT3*2;将返回6, SELECT Trim(‘abc’);将返回abc,而SELECTNow()利用Now()函数返回当前日期和时间。通过这些例子,可以明白如何根据需要使用SELECT进行试验。

11. 使用数据处理函数

1. 文本处理函数

select vend_name,Upper(vend_name) as vend_name_upcase
from vendors order by vend_name;


2. 日期和事件处理函数

MySQL使用的日期格式。无论你什么时候指定一个日期,不管是插入或更新表值还是用WHERE子句进行过滤,日期必须为格式yyyy-mm-dd。因此, 2005年9月1日,给出为2005-09-01。

如果要的是日期,请使用Date() 如果你想要的仅是日期,则使用Date()是一个良好的习惯,即使你知道相应的列只包含日期也是如此。这样,如果由于某种原因表中以后有日期和时间值,你的SQL代码也不用改变。

select cust_id, order_num from orders
where date(order_date) = '2005-09-01';select cust_id, order_num from orders
where date(order_date) between '2005-09-01' and '2005-09-30';# 还有另外一种办法(一种不需要记住每个月中有多少天或不需要操心闰年2月的办法):
select cust_id, order_num from orders
where year(order_date)  =  2005' and month(order_date) = 9;

3. 数值处理函数

12. 汇总数据

1. 聚集函数

聚集函数:运行在行组上,计算和返回单个值的函数。

COUNT()函数有两种使用方式。
‰ 使用COUNT(*)对表中行的数目进行计数, 不管表列中包含的是空值(NULL)还是非空值。
‰ 使用COUNT(column)对特定列中具有值的行进行计数,忽略NULL值。

select avg(prod_price) as avg avg_price
from products where vend_id = 1003;select count(*) as num_cust from customers;select max(prod_price) as max_price from products;select min(prod_price) as min_price from products;select sum(quantity) as items_ordered from orderitems
where order_num = 20005;select sum(item_price*quantity) as total_price from orderitems
where order_num = 20005;

2. 聚集不同的值

聚集函数中 distinct 的使用:

distinct必须使用列名,不能用于计算或表达式。

select avg(distinct prod_price) as avg_price from products
where vend_id = 1003;

3. 组合聚集函数

select count(*) as num_items,
min(prod_price) as price_min,
max(prod_price) as price_max,
avg(prod_price) as price_avg,
from products;

13. 分组数据

1. 分组 group by

GROUP BY子句必须出现在 WHERE 子句之后, ORDER BY 子句之前。

where 和 having 的区别:

WHERE过滤行,而HAVING过滤分组。也就是说WHERE在数据分组前进行过滤, HAVING在数据分组后进行过滤。这是一个重要的区别, WHERE排除的行不包括在分组中。


2. 排序 group by 和 order by

一般在使用GROUP BY子句时,应该也给出ORDER BY子句。这是保证数据正确排序的唯一方法。千万不要仅依赖GROUP BY排序数据。

14. 使用子查询

1. 利用子查询进行过滤


最里边的子查询返回订单号列表,此列表用于其外面的子查询的WHERE子句。外面的子查询返回客户ID列表,此客户ID列表用于最外层查询WHERE子句。最外层查询确实返回所需的数据。

列必须匹配 在WHERE子句中使用子查询(如这里所示),应该保SELECT语句具有与WHERE子句中相同数目的列。通常,子查询将返回单个列并且与单个列匹配,但如果需要也可以使用多个列。

2. 作为计算字段使用子查询


这 条 SELECT 语 句 对 customers 表 中 每 个 客 户 返 回 3 列: cust_name、 cust_state和orders。 orders是一个计算字段,它是由圆括号中的子查询建立的。该子查询对检索出的每个客户执行一次。在此例子中,该子查询执行了5次,因为检索出了5个客户。

子查询中的WHERE子句与前面使用的WHERE子句稍有不同,因为它使用了完全限定列名(在第4章中首次提到)。下面的语句告诉SQL比较orders表中的cust_id与当前正从customers表中检索的cust_id:

where orders.cust_id = customers.cust_id

MySQL必知必会(一)相关推荐

  1. MySQL必知必会教程:深入理解MySQL技术内幕

    2019独角兽企业重金招聘Python工程师标准>>> MySQL必知必会教程:深入理解MySQL技术内幕 作为最流行的开源数据库软件之一,MySQL数据库软件已经是广为人知了.当前 ...

  2. mysql必知必会_《MySQL必知必会》学习小结

    关于SQL,之前通过sqlzoo的题目,完成了入门,也仅仅是入门而已. 最近都在忙着投简历和找新的数据分析项目做(为了练python和面试的时候有的聊),所以SQL放了一段时间没练.目前的工作用不到, ...

  3. mysql正则表达式关键字_《MySQL必知必会》正则表达式

    <MySQL必知必会>正则表达式 正则表达式 1.1.关键字 REGEXP 正则表达式的使用需要用到关键字 REGEXP . select prod_name from products ...

  4. 《MySQL必知必会》所有SQL语句图表集合(可作为查询表使用)---已完结

    本篇文章是对<MySQL必知必会>所有语句知识点的图表集合,适合快速查询遗忘的SQL语句. 本文的脉络结构,首先先给出<MySQL必知必会>的目录和本书中用到的数据表的UML图 ...

  5. MYSQL必知必会学习笔记(二)

    MYSQL必知必会四-五章--检索.排序 书中部分代码展示: ##第四第五章 SELECT prod_name FROM products; /*从products表中检索一个叫prod_name的列 ...

  6. mysql必知必会学习笔记(一)

    MYSQL必知必会第三章--了解数据库和表 书中部分代码展示: CREATE DATABASE crashcourse; /*创建名为 crashcourse 的新数据库*/SHOW DATABASE ...

  7. mysql第四章分页显示查询出租房屋信息_MYSQL必知必会读书笔记第四章之检索数据...

    MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理. 使用Select语句返回的数据,可能会发现显 ...

  8. 《MySQL必知必会》[01] 基本查询

    <MySQL必知必会>(点击查看详情) 1.写在前面的话 这本书是一本MySQL的经典入门书籍,小小的一本,也受到众多网友推荐.之前自己学习的时候是啃的清华大学出版社的计算机系列教材< ...

  9. mysql必_MySQL必知必会(一)

    摘自<MySQL必知必会> 1.1.1 什么是数据库 数据库:保存有组织的数据的容器(通常是一个文件或一组文件) 人们通常用数据库这个术语来代表他们使用的数据库软件.这是不正确的,它是引起 ...

  10. mysql中用完即删用什么_MySQL使用和操作总结(《MySQL必知必会》读书笔记)

    简介 MySQL是一种DBMS,即它是一种数据库软件.DBMS可分为两类:一类是基于共享文件系统的DBMS,另一类是基于客户机--服务器的DBMS.前者用于桌面用途,通常不用于高端或更关键应用. My ...

最新文章

  1. java语言显示运算时间_JAVA语言之ACM日期计算:输入一个日期,格式如:2010 10 24 ,判断这一天是这一年中的第几天...
  2. inventor应用程序错误---解决方法
  3. 泊松分布E(X^2)
  4. spring20:Aspectj实现前置通知@Before
  5. php乱炖,linux使用crontab实现PHP执行定时任务 | 乱炖
  6. hihoCoder #1639 图书馆
  7. java+log日志服务器_Logserver日志服务器结构
  8. 学习 AngularJs 终于有点进步了。
  9. postman本地请求ip地址变成ipv6_华为认证-IPv6技术-ICMPv6介绍
  10. css权威指南笔记,《CSS权威指南》读书笔记(1)
  11. npm 可视化html编辑器,Vue + element从零打造一个H5页面可视化编辑器——pl-drag-template...
  12. 360驱动器显示服务器失败,360驱动大师显示驱动安装失败该怎么办 - 卡饭网
  13. Linux下用rm删除的文件的恢复方法
  14. 搭建亿万级别短信服务发送平台
  15. 云计算是一种商业模式
  16. MIT公开课 线性代数(1)
  17. 计算机教研评课记录,信息技术2.0 | 评课磨课共成长 信息技术促进步 ——东光县第二实验小学信息技术2.0数学组 课例研讨...
  18. Could not publish server configuration for Tomcat v8.0 Server at localhost.
  19. lightroom 闪退_微信QQ一碰就闪退,别人永远看不了你的隐私~
  20. html怎么制作图文混排页面,CSS 网页图文混排的10个技巧

热门文章

  1. J2EE Architecture(6)
  2. python全栈开发-Day3 字符串
  3. 2018上半年广东省中小学教师资格认定流程
  4. 关于Android Studio使用高德地图地位
  5. Effects on PV3D
  6. (自动重命名论文)PaperDownloader (Chrome插件) + EndNote (附下载链接) + Zotero
  7. 中介者模式(Mediator) 笔记
  8. LigerUI学习使用
  9. android stuido 快捷键
  10. 20135234mqy-——信息安全系统设计基础第七周学习总结