MySQL基础篇(一)

本文主要内容为MySQL的基础语句以及正则表达式等内容。mysql

本文操做的数据库内容存在我的github:https://github.com/YuanGao-1/blog_demo.gitgit

init_schema.sql为建表脚本github

init_data.sql为测试数据正则表达式

具体导入过程为:sql

create database (数据库名);
use (数据库名) ;
source init_schema.sql; //先建表
source init_data.sql; //导入测试数据

1.基础概念

这些概念都是基本常识,总结下来能够浏览一下。数据库

数据库(database)指保存有组织的数据的容器(一般是一个文件或一组文件)。框架

表(table)指某种特定类型数据的结构化清单。数据库设计

表是一种结构化的文件,可用来存储某种特定类型的数据。表能够保存顾客清单、产品目录,或者其余信息清单。表名具备惟一性,同一个数据库下,不该有两个相同名字的表。函数

表具备一些特性,这些特性定义了数据在表中如何存储,如能够存储什么样的数据,数据如何分解,各部分信息如何命名,等等。描述表的这组信息就是所谓的模式,模式能够用来描述数据库中特定的表以及整个数据库(和其中表的关系)。工具

模式(schema)指关于数据库和表的布局及特性的信息。

有些资料上的模式和数据库含义相同,须要注意

列(column)指表中的一个字段。全部表都是由一个或多个列组成的。

数据类型(datatype)指所允许的数据的类型。每一个表列都有相应的数据类型,它限制(或允许)该列中存储的数据。

行(row)指表中的一个记录。

主键(primary key)指一列(或一组列),其值可以惟一区分表中每一个行。能够着重理解key

表中的任何列均可以做为主键,只要它知足如下条件:

  • 任意两行都不具备相同的主键值;
  • 每一个行都必须具备一个主键值(主键列不容许NULL值)。

除MySQL强制实施的规则外,应该坚持的几个广泛承认的最好习惯为:

  • 不更新主键列中的值;
  • 不重用主键列的值;
  • 不在主键列中使用可能会更改的值。(例如,若是使用一个名字做为主键以标识某个供应商,当该供应商合并和更改其名字时,必须更改这个主键。)

2.使用Mysql

在CMD中键入mysql -uroot -p

进入mysql状态,接下来须要键入密码

  • 命令输入在 mysql> 以后;
  • 命令用 ;\g 结束,换句话说,仅按 Enter 不执行命令;
  • 输入 help\h 得到帮助,也能够输入更多的文本得到特定命令的帮助(如,输入 help select 得到使用SELECT语句的帮助);
  • 输入 quitexit 退出命令行实用程序。

2.1 关键字

MySQL中一样具备关键字。如:ues, show, SELECT等等(cmd中不区分大小写)

先举例一些基本的命令:

  • use + 名字(database);打开某数据库
  • show databases;返回可用数据库的一个列表
  • show tables;返回当前选择的数据库内可用表的列表
  • show columns from 名字(table);这个命令要求给出表名,返回表中的属性信息。它对每一个字段返回一行,行中包含字段名、数据类型、是否容许NULL、键信息、默认值以及其余信息(如字段id的auto_increment)。此外,须要注意的是此命令等效于describe 名字(table)

举例:

什么是自动增量? 某些表列须要惟一值。例如,订单编号、雇员ID或(如上面例子中所示的)顾客ID。在每一个行添加到表中时,MySQL能够自动地为每一个行分配下一个可用编号,不用在添加一行时手动分配惟一值(这样作必须记住最后一次使用的值)。这个功能就是所谓的自动增量。若是须要它,则必须在用CREATE语句建立表时把它做为表定义的组成部分。咱们将在第21章中介绍CREATE语句。

此外,相关的show命令还有:

MySQL 5支持一个新的INFORMATION_SCHEMA命令,可用它来得到和过滤模式信息。

2.2 检索语句(SELECT)

上述语句利用SELECT 语句从user 表中检索一个名为password的列。所需的列名在SELECT关键字以后给出,FROM关键字指出从其中检索数据的表名。如上的一条简单SELECT语句将返回表中全部行。数据没有过滤(过滤将得出结果集的一个子集),也没有排序

SQL语句和大小写 请注意,SQL语句不区分大小写,所以SELECT与select是相同的。一样,写成Select也没有关系。许多SQL开发人员喜欢对全部SQL关键字使用大写,而对全部列和表名使用小写,这样作使代码更易于阅读和调试。不过,必定要认识到虽然SQL是不区分大小写的,但有些标识符(如数据库名、表名、列名)可能不一样:在MySQL 4.1及以前的版本中,这些标识符默认是区分大小写的;在MySQL 4.1.1版本中,这些标识符默认是不区分大小写的。最佳方式是按照大小写的惯例,且使用时保持一致。MySQL8.0中不区分,可是可根据本身的状况进行调整。

检索多个列:

惟一的不一样是必须在SELECT关键字后给出多个列名,列名之间必须以逗号分隔。

检索全部列:

SELECT * FROM 表名,为检索全部列。优势:能检索出名字未知的列。缺点:若是不是肯定须要全部列的信息,使用通配符*讲会下降检索和应用程序的性能。

检测不一样的行:

解决办法是使用DISTINCT关键字,顾名思义,此关键字指示MySQL只返回不一样(惟一)的值。

实际上type中有多个重复的0,1,2行。

限制结果

此语句使用SELECT语句检索单个列。LIMIT 5指示MySQL返回很少于5行。

其中,LIMIT后若跟两个数字,如:5,5,则指示MySQL返回从行5开始的5行。第一个数为开始位置,第二个数为要检索的行数。

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

值得注意的是:

  • 检索出来的第一行为行0而不是行1。所以,LIMIT 1,1 将检索出第二行而不是第一行。
  • 行数不够时,LIMIT中指定要检索的行数为检索的最大行数。若是没有足够的行(例如,给出LIMIT 10, 5,但只有13行),MySQL将只返回它能返回的那么多行。

此外,LIMIT还有一种表示方法: LIMIT 10,5等效于 LIMIT 5 OFFSET 10第一个数字为检索的行数,第二个数字为偏移量即开始的位置。

彻底限定

有一些情形须要彻底限定名,例如:使用彻底限定的名字来引用列(同时使用表名和列字)。表名也能够是彻底限定的。(community是数据库,user为其中一个表,id为user中的一个列)

2.3 排序检索

2.2部分检索出的数据并非以纯粹的随机顺序显示的。若是不排序,数据通常将以它在底层表中出现的顺序显示。这能够是数据最初添加到表中的顺序。可是,若是数据后来进行过更新或删除,则此顺序将会受到MySQL重用回收存储空间的影响。所以,若是不明确控制的话,不能(也不该该)依赖该排序顺序。关系数据库设计理论认为,若是不明确规定排序顺序,则不该该假定检索出的数据的顺序有意义。

在这里新介绍一个概念,子句:SQL语句由子句构成,有些子句是必需的,而有的是可选的。一个子句一般由一个关键字和所提供的数据组成。子句的例子有SELECT语句中的FROM子句。

为了明确地排序用SELECT语句检索出的数据,可以使用ORDER BY子句。ORDER BY子句取一个或多个列的名字,据此对输出进行排序。请看下面的例子:

这条语句除了指示MySQL对 email 列以字母顺序排序数据的ORDER BY子句外,与前面的语句相同。也可用其余列进行排列以后显示email字段。

按多个列排序

以下所示,先对 type 字段进行排序。以后在 type 相同的行中,对 username 字段进行排序。若 type 均不一样,则不会对 username 进行排序。

指定排序方向:数据排序不限于升序排序(从A到Z)。这只是默认的排序顺序,还可使用ORDER BY子句以降序(从Z到A)顺序排序。为了进行降序排序,必须指定DESC关键字。

注意:对哪一个列进行降序排列,就须要在列后加 DESCORDER BY默认是升序,关键字为 ASC

在对文本性的数据进行排序时,A与a相同吗?a位于B以前仍是位于Z以后?这些问题不是理论问题,其答案取决于数据库如何设置。
在字典(dictionary)排序顺序中,A被视为与a相同,这是MySQL(和大多数数据库管理系统)的默认行为。可是,许多数据库管理员可以在须要时改变这种行为(若是你的数据库包含大量外语字符,可能必须这样作)。

注意,使用的时候,LIMIT要放在ORDER BY以后,不然会报错。

2.3部分学习了如何用SELECT语句的ORDER BY子句对检索出的数据进行排序。这个子句必须是SELECT语句中的最后一条子句。

2.4 过滤数据(WHERE)

过滤数据,即指定数据的搜索条件,毕竟在实际应用中检索全部数据的状况是很少的。

在SELECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤。WHERE子句在表名(FROM子句)以后给出。这个例子采用的是相等测试:它检查一个列是否具备指定的值,据此进行过滤。可是SQL容许作的事情不只仅是相等测试。

在同时使用ORDER BY和WHERE子句时,应该让ORDER BY位于WHERE以后,不然将会产生错误

值得注意的是,

MySQL在执行匹配时默认不区分大小写,因此systemSYSTEM匹配。

范围值检查

为了检查某个范围的值,可以使用BETWEEN操做符。其语法与其余WHERE子句的操做符稍有不一样,由于它须要两个值,即范围的开始值和结束值。
例如,BETWEEN操做符可用来检索id在11和22之间的全部用户名。

从这个例子中能够看到,在使用BETWEEN时,必须指定两个值——所需范围的低端值和高端值。这两个值必须用AND关键字分隔。BETWEEN匹配范围中全部的值,包括指定的开始值和结束值。

空值检查

在建立表时,表设计人员能够指定其中的列是否能够不包含值。在一个列不包含值时,称其为包含空值NULL。

NULL 无值(no value),它与字段包含0、空字符串或仅仅包含空格不一样

组合WHERE子句

为了进行更强的过滤控制,MySQL容许给出多个WHERE子句。这些子句能够两种方式使用:以AND子句的方式或OR子句的方式使用。

操做符(operator) 用来联结或改变WHERE子句中的子句的关键字。也称为逻辑操做符(logical operator)

接下来介绍几个操做符:

AND 用在WHERE子句中的关键字,用来指示检索知足全部给定条件的行。

OR操做符与AND操做符不一样,它指示MySQL检索匹配任一条件的行。

在这里值得注意的是SQL(像多数语言同样)在处理OR操做符前,优先处理AND操做符。优先级不一样,须要记住。

举例以下:

这句命令的含义为:检索全部的,activation_code不为空且id小于22这种状况,以及type=1这种状况的记录。

注意:在WHERE子句中使用圆括号 任什么时候候使用具备AND和OR操做符的WHERE子句,都应该使用圆括号明确地分组操做符。不要过度依赖默认计算次序,即便它确实是你想要的东西也是如此。使用圆括号没有什么坏处,它能消除歧义。

例:(和开发语言相同的习惯,再也不赘述)

SELECT username,id,activation_code,type FROM user WHERE (activation_code IS NOT NULL AND id<22) OR type=1;

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

其实,这句命令等效于

SELECT username,id,activation_code,type FROM user WHERE type=1 OR type =2 ;

为何要使用IN操做符?其优势具体以下:

  • 在使用长的合法选项清单时,IN操做符的语法更清楚且更直观。
  • 在使用IN时,计算的次序更容易管理(由于使用的操做符更少)。
  • IN操做符通常比OR操做符清单执行更快。
  • IN的最大优势是能够包含其余SELECT语句,使得可以更动态地创建WHERE子句。(将在第二篇博客子查询部分详解)

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

例:

检索的为 type =0的记录。

3.使用通配符进行过滤

前面介绍的全部操做符都是针对已知值进行过滤的。无论是匹配一个仍是多个值,测试大于仍是小于已知值,或者检查某个范围的值,共同点是过滤中使用的值都是已知的。可是,这种过滤方法并非任什么时候候都好用。例如,怎样搜索产品名中包含文本anvil的全部产品?用简单的比较操做符确定不行,必须使用通配符。利用通配符可建立比较特定数据的搜索模式。在这个例子中,若是你想找出名称包含anvil的全部产品,可构造一个通配符搜索模式,找出产品名中任何位置出现anvil的产品。

通配符(wildcard) 用来匹配值的一部分的特殊字符。

搜索模式(search pattern) 由字面值、通配符或二者组合构成的搜索条件。

通配符自己实际是SQL的WHERE子句中有特殊含义的字符,SQL支持几种通配符。

为在搜索子句中使用通配符,必须使用LIKE操做符。LIKE指示MySQL,后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较。

3.1 百分号(%)通配符

在搜索串中,%表示任何字符出现任意次数

举例以下:

搜索的为:username开头是nowcoder的全部记录。

根据MySQL的配置方式,搜索能够是区分大小写的。

通配符可在搜索模式中任意位置使用,而且可使用多个通配符。下面的例子使用两个通配符,它们位于模式的两端:%anvil%这样的话就能够找到符合本章开头的产品记录了。天然也可放在中间,再也不赘述。

值得注意的是,除了一个或多个字符外,%还能匹配0个字符。%表明搜索模式中给定位置的0个、1个或多个字符。

尾空格可能会干扰通配符匹配。例如,在保存词anvil 时, 若是它后面有一个或多个空格, 则子句WHEREprod_name LIKE '%anvil'将不会匹配它们,由于在最后的l后有多余的字符。解决这个问题的一个简单的办法是在搜索模式最后附加一个%。一个更好的办法是使用函数(本系列第二篇博客将会介绍)去掉首尾空格。

此外,虽然彷佛%通配符能够匹配任何东西,但有一个例外,即NULL。即便是WHERE prod_name LIKE '%'也不能匹配用值NULL的行。

3.2 下划线(_)通配符

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

如上所示,利用的是3个下划线通配符,匹配的为username只有3个字符的记录。

使用通配符须要注意如下几点:

  • 不要过分使用通配符。若是其余操做符能达到相同的目的,应该使用其余操做符。
  • 在确实须要使用通配符时,除非绝对有必要,不然不要把它们用在搜索模式的开始处。把通配符置于搜索模式的开始处,搜索起来是最慢的。
  • 仔细注意通配符的位置。若是放错地方,可能不会返回想要的数据。

4.使用正则表达式进行搜索

Java中已有正则表达式的相关描述,再也不在本篇博客中解释。

若是你熟悉正则表达式,须要注意:MySQL仅支持多数正则表达式实现的一个很小的子集。本章介绍MySQL支持的大多数内容。

4.1 基本字符匹配

这里的用例能够看一下,与章节3相比,将LIKE操做符换成了REGEXP,表示将使用正则表达式。REGEXP后跟的是正则表达式。

再看一个例子:

这里使用了一个特殊字符.,含义是匹配任意一个字符。

其实,这里也能够用LIKE实现,区别在于若是LIKE匹配的是整个串,而REGEXP匹配的是子串。

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

4.2 进行OR匹配

为搜索两个串之一(或者为这个串,或者为另外一个串),使用 | 。和Java语言有些相似。

此外,OR匹配还有另外一种描述:

使用中括号,[12]定义一组字符,它的意思是匹配1或2。实际上是[1|2]的缩写。

使用中括号的好处在于,假定有两行命令:

SELECT username,id,activation_code,type FROM user WHERE type REGEXP '[12] ton';
SELECT username,id,activation_code,type FROM user WHERE type REGEXP '1|2 ton';

这两行命令结果是不一样的,'1|2 ton'返回的是符合正则表达式12 ton的全部记录。

字符集合也能够被否认,即,它们将匹配除指定字符外的任何东西。为否认一个字符集,在集合的开始处放置一个便可。所以,尽管[123]匹配字符一、2或3,但中括号中若为** 123**却匹配除这些字符外的任何东西。

此外,还可进行简写,[123]可直接写为[1-3]

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

\\也用来引用元字符(具备特殊含义的字符),如表9-1所列。

多数正则表达式实现使用单个反斜杠转义特殊字符,以便能使用这些字符自己。但MySQL要求两个反斜杠(MySQL本身解释一个,正则表达式库解释另外一个)。

4.3 字符类

为方便工做,SQL预约义了一些字符集,成为字符类,可见下图。

接下来说一下,匹配多个实例的状况下该怎么作?

试想,若是咱们须要匹配知足正则表达式'stick'和'sticks'的实例,使用OR匹配确实能够作到,可是有更简单的方法。举原文中例子:

匹配多个实例,须要使用\\(匹配内容)

另外还有一个例子值得学习:

4.4 定位符

目前为止本博客以上的全部例子都是匹配一个串中任意位置的文本。为了匹配特定位置的文本,须要使用表9-4列出的定位符。

^的双重用途 ^有两种用法。在集合中(用[和]定义),用它来否认该集合,不然,用来指串的开始处。

举例:

检索以1结尾的记录。

LIKEREGEXP的不一样在于,LIKE匹配整个串而REGEXP匹配子串。利用定位符,经过用^开始每一个表达式,用$结束每一个表达式,可使REGEXP的做用与LIKE同样。

5.建立计算字段

字段(field) 基本上与列(column)的意思相同,常常互换使用,不过数据库列通常称为列,而术语字段一般用在计算字段的链接上。

存储在数据库表中的数据通常不是应用程序所须要的格式。下面举几个例子。

  • 若是想在一个字段中既显示公司名,又显示公司的地址,但这两个信息通常包含在不一样的表列中。
  • 城市、州和邮政编码存储在不一样的列中(应该这样),但邮件标签打印程序却须要把它们做为一个恰当格式的字段检索出来。
  • 列数据是大小写混合的,但报表程序须要把全部数据按大写表示出来。
  • 物品订单表存储物品的价格和数量,但不须要存储每一个物品的总价格(用价格乘以数量便可)。为打印发票,须要物品的总价格。须要根据表数据进行总数、平均数计算或其余计算。

在上述每一个例子中,存储在表中的数据都不是应用程序所须要的。咱们须要直接从数据库中检索出转换、计算或格式化过的数据;而不是检索出数据,而后再在客户机应用程序或报告程序中从新格式化。

这就是计算字段发挥做用的所在了。与前面各章介绍过的列不一样,计算字段并不实际存在于数据库表中。计算字段是运行时在SELECT语句内建立的。

5.1 拼接字段Concat()

Concat()拼接串,即把多个串链接起来造成一个较长的串。Concat()须要一个或多个指定的串,各个串之间用逗号分隔。

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

为了解决这个问题,SQL支持列别名。别名(alias)是一个字段或值的替换名。别名用AS关键字赋予。请看下面的SELECT语句:

它指示SQL建立一个包含指定计算的名为vend_title的计算字段。从输出中能够看到,结果与之前的相同,但如今列名为vend_title,任何客户机应用均可以按名引用这个列,就像它是一个实际的表列同样。

5.2 执行算术计算

这个就比较容易理解了,举例以下:

demo 列是执行计算id*from_id计算后的列。

本系列浏览量太低,MySQL基础部分将再也不更新,后续可能更新进阶部分或进入框架阶段。

相关文章
相关标签/搜索