MySQL必知必会


了解SQL


什么是数据库:数据库(database)保存有阻止的数据的容器,可以把数据库想象成一个文件柜。

什么是表:表(table) 某种特定类型结构的结构化清单,数据库中的表的名字是唯一的。

什么是列:列(column)表中的一个字段。所有表都是有一个或多个列组成的,理解列的最好办法是将数据库表想象为一个网格,网格中每一列存储着一条特定信息。例如,编号,地址,邮政编码。

什么是行:行(row) 表中的数据是按行存储的,所保存的每个记录存储在自己的行内,例如,每一行存储一个顾客。

什么是主键:主键(primary key ) 一列(或一组列)其值能够唯一区分表中的每一行。唯一标识表中每行的这个列称为主键。主键用来表示一个特定的行,没有主键,更新或删除特定的行很困难,因为没有安全的方法保证只涉及相关的行。

什么是SQL: SQL(发音为字母S-Q-L或sequel)是结构化查询语言(Structured Query Language)的缩写,SQL是一种专门用来与数据库通信的语言。


检索数据


SELECT语句:

检索单个列:SELECT prod_name FROM products;

分析:上述语句利用SELECT语句从products表中检索一个名为prod_name的列。所需的列名在SELECT关键字之后给出,FROM关键字指出从其中检索数据的表名。

检索多个列:SELECT prod_id,prod_name,prod_price FROM products;

分析:指定了3个列名,列名之间用逗号分隔,最后一个列名不加逗号

检索所有列: SELECT * FROM products;

分析:如果给定了一个通配符(*),则返回表中的所有列。列的顺序一般是列在表中定义出现的顺序。但有时候并不是这样的,表的模式的变化(如添加或删除列),可能会导致顺序变化

检索不同的行:SELECT DISTINCT vend_id FROM products ;

分析:SELECT DISTINCT vend_id告诉MySQL只返回不同的vend_id行,如果使用DISTINCT关键字,必须放在列名的最前面

限制结果: SELECT pro_name FROM products LIMIT 5;

分析: 此语句使用SELECT语句检索单个列,LIMIT 5指示MySQL返回不多于5行

为了得到下一个5行,可指定要检索的开始行和行数: SELECT pro_name FROM products LIMIT 5 ,5

分析:LIMIT 5 , 5指示MySQL返回从行5开始的5行。第一个数为开始位置,第二个数为要检索的行数。

  1. 注意:检索从第0行开始

使用完全限定的表名:**完全限定(同时使用表名和列名)SELECT products.prod_name FROM products;


排序检索数据


子句: SQL语句由子句构成,有些子句是必须的,而有的是可选的,

ORDER BY: SELECT prod_name FROM products ORDER BY prod_name

分析: 选择prodects的prod_name列,对prod_name列按照字母升序

多个列排序: SELECT prod_id,pro_price,prod_name FROM products ORDER BY prod_price,prod_name;

分析: 仅在多个行具有相同的prod_price值时才对产品按prod_name进行排序。如果prod_price列中所有的值是唯一的,则不会按prod_name排序

指定排序方向: SELECT prod_id,prod_price,prod_name FROM products ORDER BY prod_price DESC;

分析:以价格降序排序产品

多个列排序: SELECT prod_id,prod_price,prod_name FROM products ORDER BY prod_price DESC,prod_name;

分析: DESC 关键字只应用到直接位于其前面的列名,prod_price列指定DESC,对prod_name列不指定。因此,prod_price列以降序排序,而prod_name仍然按标准的升序排序

  1. 如果想在多个列进行降序排序,必须对每个列指定DESC关键字

升序:ASC,默认值


过滤数据


只检索所需数据需要指定搜索条件,搜索条件也称为过滤条件

在SELECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤,WHERE子句在表名(FROM子句)之后给出

输入: SELECT prod_name,prod_price FROM products WHERE prod_price = 2.50;

分析: 这条语句从products表中检索两个列,但不返回所有行,只返回prod_price值为2.5的行

WHERE子句操作符

操作符 说明
= 等于
<> 不等于
!= 不等于
< 小于
<= 小于等于
> 大于
>= 大于等于
BETWEEN 在指定的两个值之间

检查单个值

输入:SELECT prod_name,prod_price FROM products WHERE prod_name = 'fuses'

分析: 检查WHERE prod_name='fuses'语句,他返回prod_name的值为Fuses的一行。MySQL在执行匹配时默认不区分大小写

范围值检查

输入: SELECT prod_name,prod_price FROM products WHERE prod_price BETWEEN 5 AND 10;

分析: 在使用BETWEEN时,必须指定两个值;所需范围的低端值和高端值,这两个值必须用AND关键字分隔,BETWEEN匹配范围中所有的值,包括指定的开始和结束值。

空值检查

在创建表时,表设计人员可以指定其中的列是否可以不包含值,一个列不包含值时,称其为包含空值NULL

输入: SELECT prod_name FROM products WHERE prod_price IS NULL;

分析: 这条语句返回没有价格的所有产品


数据过滤


AND操作符

为了通过不止一个列进行过滤,可以使用AND操作符给WHERE子句附加条件。下面的代码给出了一个例子:

输入: SELECT prod_id,prod_price,prod_name FROM products WHERE vend_id = 1003 AND prod_price <= 10;

分析:此sql语句检索由供应商1003制造且价格小于等于10美元的所有产品的名称和价格。

AND:用在WHERE子句中的关键字,用来指示检索满足所有给定条件的行

上述例子中使用了只包含一个关键字AND的语句。把两个过滤条件组合在一起。还可以添加多个过滤条件,每添加一条就要使用一个AND

OR操作符

OR操作符与AND操作符不同,他指示MySQL检索任一条件的行

输入: SELECT prod_name,prod_price FROM products WHERE vend_id = 1002 OR vend_id = 1003;

分析: 此SQL语句检索由任一指定供应商的所有产品的产品名和价格。OR操作符告诉DBMS匹配任一条件而不是同时匹配两个条件。

计算次序

输入: SELECT prod_name,prod_price FROM products WHERE( vend_id=1002 OR vend_id =1003) AND prod_price >=10;

分析: 圆括号具有敲AND或OR操作符高的计算次序,DBMS首先过滤圆括号内的OR条件。

IN操作符

圆括号在WHERE子句中还有另外一种用法。IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取合法值的由逗号分隔的清单全都在圆括号中。

输入: SELECT prod_name,prod_price FROM products WHERE vend_id IN(1002,1003) ORDER BY prod_name;

分析: 此SELECT语句检索供应商1002和1003制造的所有产品。操作符后跟由逗号分隔的合法值清单,整个清单必须在圆括号中

IN操作符与OR具有相同的功能

NOT操作符

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

NOT WHERE子句中用来否定后跟条件的关键字。

输入: SELECT prod_name,prod_price FROM products WHERE vend_id NOT IN(1002,1003) ORDER BY prod_name;

分析: 这里的NOT否定跟在他之后的条件,因此MySQL不是匹配1002和1003的vend_id,而是匹配1002和1003之外的供应商的


用通配符进行过滤


百分号(%)通配符

最常用的通配符是百分号(%)。在搜索串中,%表示任何字符出现的任意次数。例如,为了找出所有以词jet开头的产品,可以使用一下SELECT语句:

输入: SELECT prod_id,prod_name FROM products WHERE prod_name LIKE 'jet%';

分析: 此例子使用了搜索模式'jet%',在执行这条子句时,将检索任意以jet起头的词。%告诉MySQL接受jet之后的任意字符,不管他有多少字符

通配符可在搜索模式中任意位置使用,并且可以使用多个通配符,下面的例子使用两个通配符,他们位于模式的两端:

输入: SELECT prod_id,prod_name FROM products WHERE prod_name LIKE '%anvil%';

分析: 搜索模式'%anvil%' 表示匹配任何位置包含文本anvil的值,不论他之前或之后出现什么字符

下划线(_)通配符

另一个有用的通配符是下划线(_).下划线的用途与%一样,但下划线只匹配单个字符而不是多个字符

输入: SELECT prod_id,prod_name FROM products WHERE prod_name LIKE '_ ton anvil';

分析: 与%能匹配0个字符不一样,_总是匹配一个字符,不能多不能少


用正则表达式进行搜索


使用MySQL正则表达式

正则表达式的作用是匹配文本,将一个模式(正则表达式)与一个文本串进行比较,MySQL用WHERE子句对正则表达式提供了初步的支持,允许你指定正则表达式过滤SELECT检索出的数据

基本字符匹配

输入:SELECT prod_name FROM products WHERE prod_name REGEXP '1000' ORDER BY prod_name;

分析: 除了关键字LIKE被REGEXP替代外,这条语句非常像使用LIKE语句,他告诉MySQL:REGEXP后所跟的东西作为正则表达式(与文字正文1000匹配的一个正则表达式)处理

输入: SELECT prod_name FROM products WHERE prod_name REGEXP '.000' ORDER BY prod_name;

分析: 这里使用正则表达式.000 。.是正则表达式语言中一个特殊的 字符,他表示匹配任意一个字符。

示例:

  1. mysql> SELECT NAME FROM account WHERE NAME REGEXP '.s' ORDER BY NAME;
  2. +------+
  3. | NAME |
  4. +------+
  5. | test |
  6. | tsdf |
  7. +------+

进行OR匹配

输入: SELECT prod_name FROM products WHERE prod_name REGEXP '1000|2000' ORDER BY prod_name;

分析: 语句中使用正则表达式1000|2000为正则表达式的OR操作符,他表示匹配其中之一,相当于OR语句。

匹配几个字符之一

匹配任何单一字符,但是,如果你只想匹配特定的字符,可以通过指定一组用[和]括起来的字符来完成

输入: 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)

示例:

  1. mysql> SELECT NAME FROM account WHERE NAME REGEXP '[at]est' ORDER BY NAME;
  2. +------+
  3. | NAME |
  4. +------+
  5. | aest |
  6. | test |
  7. +------+

匹配范围

集合可以用来定义要匹配的一个或多个字符,

输入: SELECT prod_name FROM products WHERE prod_name REGEXP '[1-5]' Ton ORDER BY pord_name;

分析: 这里使用正则表达式[1-5] Ton [1-5]定义了一个范围,这个表达式的意思是匹配1到5

示例:

  1. mysql> SELECT NAME FROM account WHERE NAME REGEXP '[a-z]cc' ORDER BY NAME;
  2. +------+
  3. | NAME |
  4. +------+
  5. | ccc |
  6. | ccc |
  7. +------+

匹配特殊字符

如何匹配 .、|、-等特殊字符

  1. SELECT vend_name FROM vendors WHERE vend_name REGEXP ' \\.' ORDER BY vend_name;

分析:

  1. \\.匹配.,这种处理方式称之为转义

匹配多个实例

重复元字符

元字符 说明
* 0个或者多个匹配
+ 1个或多个匹配(等于{1,})
? 0个或1个匹配(等于{0,1})
{n} 指定数目的匹配
{n,} 不少于指定数目的匹配
{n,m} 匹配数目的范围(m不超过255)

输入:

  1. SELECT prod_name FROM products WHERE prod_name REGEXP '\\([0-9] sticks?)' ORDER BY prod_name;

分析: sticks? 匹配stick和sticks,?表示0个或1个匹配

输入:

  1. SELECT prod_name FROM products WHERE prod_name REGEXP '[[:digit:]]{4}' ORDER BY prod_name;

分析: [:digit:]匹配任意数字 ,{4}:确切的要求他前面的字符(任意数字),出现4次,匹配prod_name文本中包含4个任意连在一起的数字

定位符

目前为止的所有例子都是匹配一个串中任意位置的文本,为了匹配特定位置的文本,需要使用定位符

元字符 说明
^ 文本的开始
$ 文本的结尾
[[:<:]] 词的开始
[[:>:"]] 词的结尾

示例

  1. mysql> SELECT NAME FROM account WHERE NAME REGEXP '[[:<:]]t' ORDER BY NAME;
  2. +------+
  3. | NAME |
  4. +------+
  5. | t57L |
  6. | test |
  7. | tsdf |

创建计算字段


拼接字段

vendors表包含供应商和位置信息。假如要生成一个供应商报表,需要在供应商的名字中按照name(location)这样的格式列出供应商的位置

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

输入: SELECT Concat(vend_name,'(',vend_country,')') FROM vendors ORDER BY vend_name;

分析: Concat()拼接串,既把多个串连接起来形成一个较长的串

示例:

  1. mysql> SELECT CONCAT(RTRIM(NAME),'(',RTRIM(money),')') FROM account ORDER BY NAME;
  2. +------------------------------------------+
  3. | CONCAT(RTRIM(NAME),'(',RTRIM(money),')') |
  4. +------------------------------------------+
  5. | aaa(500) |
  6. | NULL |
  7. | bbb(1500) |
  8. | ccc(1000) |
  9. | ccc(1000) |
  10. | ddd(13240) |
  11. | ddd(13240) |
  12. | t57L(1452) |
  13. | test(66666) |
  14. | tsdf(14520) |
  15. +------------------------------------------+

Trim函数:去除空格

使用别名

从前面的输出中可以看到,SELECT语句拼接地址字段工作得很好,但此新计算列的名字是什么呢?实际上他没有名字,他只是一个值,如果仅在SQL查询工具查看一下结果,这样没有什么不好,但是,一个未命名的列不能用于客户机应用中,因为客户机没有办法引用他。

解决办法是,使用别名(alias),别名是一个字段或者的替换名

输入: SELECT CONCAT(RTRIM(NAME), '(',RTRIM(money),')') AS vend_title FROM account ORDER BY NAME;

分析: 他指示SQL创建一个包含指定计算的名为vend_title的计算字段

执行算数计算

输入:

SELECT prod_id,

quantity,

item_price,

quantity*item_price AS expanded_price

FROM orderitems

WHERE order_num = 20005;

MySQL必知必会1的更多相关文章

  1. 《MySQL 必知必会》读书总结

    这是 <MySQL 必知必会> 的读书总结.也是自己整理的常用操作的参考手册. 使用 MySQL 连接到 MySQL shell>mysql -u root -p Enter pas ...

  2. mysql学习--mysql必知必会1

     例如以下为mysql必知必会第九章開始: 正則表達式用于匹配特殊的字符集合.mysql通过where子句对正則表達式提供初步的支持. keywordregexp用来表示后面跟的东西作为正則表達式 ...

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

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

  4. mysql必知必会系列(一)

    mysql必知必会系列是本人在读<mysql必知必会>中的笔记,方便自己以后查看. MySQL. Oracle以及Microsoft SQL Server等数据库是基于客户机-服务器的数据 ...

  5. 《mysql必知必会》读书笔记--存储过程的使用

    以前对mysql的认识与应用只是停留在增删改查的阶段,最近正好在学习mysql相关内容,看了一本书叫做<MySQL必知必会>,看了之后对MySQL的高级用法有了一定的了解.以下内容只当读书 ...

  6. mysql必知必会

    春节放假没事,找了本电子书mysql必知必会敲了下.用的工具是有道笔记的markdown文档类型. 下面是根据大纲已经敲完的章节,可复制到有道笔记的查看,更美观. # 第一章 了解SQL## 什么是S ...

  7. 《MySQL必知必会》整理

    目录 第1章 了解数据库 1.1 数据库基础 1.1.1 什么是数据库 1.1.2 表 1.1.3 列和数据类型 1.1.4 行 1.1.5 主键 1.2 什么是SQL 第2章 MySQL简介 2.1 ...

  8. 《MySQL必知必会》官方提供的数据库和表

    数据用于配合<MySQL必知必会>(MySQL Crash Course)这本书使用,配套SQL文件也可在Ben Forta网站下载. Ben Forta网址:http://forta.c ...

  9. mysql学习--mysql必知必会

      上图为数据库操作分类:     下面的操作參考(mysql必知必会) 创建数据库 运行脚本建表: mysql> create database mytest; Query OK, 1 row ...

  10. MySQL使用和操作总结(《MySQL必知必会》读书笔记)

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

随机推荐

  1. BZOJ1113 海报PLA1(单调栈入门题)

    一,自己思考下 1,先自己思考下 N个矩形,排成一排,现在希望用尽量少的海报去cover住它们. 2,不懂. 着实不懂. 3,分析下,最优性问题对吧,然后就每什么想法了.. 虽然肯定和单调栈和单调队列 ...

  2. 防火墙firewalld

    增加外部可访问的端口 启动: systemctl start firewalld 查看状态: systemctl status firewalld 停止: systemctl stop firewal ...

  3. Vue.set 向响应式对象中添加响应式属性,及设置数组元素触发视图更新

    一.为什么需要使用Vue.set? vue中不能检测到数组和对象的两种变化: 1.数组长度的变化 vm.arr.length = 4 2.数组通过索引值修改内容 vm.arr[1] = ‘aa’ Vu ...

  4. 3D数据采集和重建

    3D数据采集和重建是从传感器数据生成三维或时空模型.一般而言,这些技术和理论适用于大多数或所有传感器类型,包括光学,声学,激光扫描,[1]雷达,热学,[2]地震.[3][4] 内容 ·        ...

  5. 设置多个className

    有时候我们需要有选择地设置多个className function myComponent(props) { const myClassName = { 'aaa', {'bbb': props.ne ...

  6. 【POJ1321】棋盘问题

    本题传动门 本题知识点:深度优先搜索 + 枚举 + 回溯 题意是要求我们把棋子放在棋盘的'#'上,但不能把两枚棋子放在同一列或者同一行上,问摆好这k枚棋子有多少种情况. 我们可以一行一行地找,当在某一 ...

  7. 刷题记录:2018HCTF&admin

    目录 刷题记录:2018HCTF&admin 一.前言 二.正文 1.解题过程 2.解题方法 刷题记录:2018HCTF&admin 一.前言 经过一个暑假的学习,算是正经一条web狗 ...

  8. 创建批处理文件.bat文件(删除指定文件夹下的文件及文件夹并循环)

    1.针对仅仅是删除文件夹下的文件的操作:使用del命令,单纯的删除文件操作,如下:del /f /s /q C:\Users\dell\AppData\Local\Temp\*.* 2.删除文件夹操作 ...

  9. Nginx配置SSL证书部署HTTPS网站(颁发证书)

    一.Http与Https的区别HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高 ...

  10. 离线安装pycharm数据库驱动

    这个数据库驱动,不是python的链接包 而是打开pycharm pro版后的数据库浏览器驱动. 也就是专业版比社区版方便的一个地方,可以直接边写代码,边看数据库结构,还可以拖动一些变量. 在线安装挺 ...