网站的关键词怎么设置,跳转网站,西安房产网签查询系统,网站在线支付文章目录 前言一、初识MySQL1.1 数据库基础1.2 数据库技术构成1.2.1 数据库系统1.2.2 SQL语言1.2.3 数据库访问接口 1.3 什么是MySQL 二、数据库的基本操作2.1 数据库创建和删除2.2 数据库存储引擎2.2.1 MySQL存储引擎简介2.2.2 InnoDB存储引擎2.2.3 MyISAM存储引擎2.2.4 存储引… 文章目录 前言一、初识MySQL1.1 数据库基础1.2 数据库技术构成1.2.1 数据库系统1.2.2 SQL语言1.2.3 数据库访问接口 1.3 什么是MySQL 二、数据库的基本操作2.1 数据库创建和删除2.2 数据库存储引擎2.2.1 MySQL存储引擎简介2.2.2 InnoDB存储引擎2.2.3 MyISAM存储引擎2.2.4 存储引擎的选择 三、数据表的基本操作3.1 创建数据表3.2 修改数据表3.3 删除数据表3.4 查看数据表结构 四、数据类型和运算符4.1 MySQL数据类型介绍4.1.1 整数类型4.1.2 浮点数类型和定点数类型4.1.3 日期和时间类型4.1.4 字符串类型4.1.5 二进制类型 4.2 如何选择数据类型4.3 常见运算符介绍4.3.1 算术运算符4.3.2 比较运算符4.3.3 逻辑运算符4.3.4 位运算符4.3.5 运算符优先级 五、MySQL函数5.1 MySQL函数简介5.2 数学函数5.3 字符串函数5.4 时间和日期函数5.5 条件判断函数5.6 系统信息函数5.7 加密函数5.8 其他函数 六、数据的增删改查6.1 基本查询数据6.2 单表查询数据6.3 使用集合函数查询6.4 连接查询6.5 子查询6.6 合并查询结果6.7 为表和字段取别名6.8 使用正则表达式查询6.9 数据的新增6.10 数据的修改6.11 数据的删除 七、索引7.1 索引简介7.1.1 索引的含义和特点7.1.2 索引的分类7.1.3 索引的设计原则 7.2 创建索引7.3 删除索引 前言
本文仅介绍MySQL基础内容 一、初识MySQL
1.1 数据库基础
数据库DataBaseDB是一个长期存储在计算机内的有组织的有共享的统一管理的数据集合。它是一个按数据结构来存储和管理数据的计算机软件系统。即数据库包含两层含义保管数据的“仓库”以及数据管理的方法和技术。
1.2 数据库技术构成
数据库系统由硬件部分和软件部分共同构成硬件主要用于存储数据库中的数据包括计算机存储设备等。软件部分则主要包括DBMS支持DBMS运行的操作系统以及支持多种语言进行应用开发的访问技术等。
1.2.1 数据库系统
数据库系统由三个主要的组成部分
数据库用于存储数据的地方数据库管理系统DataBase Management SystemDBMS用于管理数据库的软件。是用户创建管理和维护数据库时所使用的软件位于用户和操作系统之间对数据库进行统一管理。DBMS能定义数据存储结构提供数据的操作机制维护数据库的安全性完整性和可靠性。数据库应用程序为了提高数据库系统的处理能力所使用的的管理数据库的软件补充。大多情况下DBMS无法满足对数据管理的要求。数据库应用程序的使用可以满足对数据管理的更高要求还可以使数据管理过程更加直观和友好。数据库应用程序负责与DBMS进行通信访问和管理DBMS中存储的数据允许用户插入修改删除DB中的数据。
下图辅助理解
DBMS像是一个大管家他接收到我们撰写的SQL之后根据SQL语法对SQL进行分析然后去操作数据库数据库就像是一个仓库他根据SQL在仓库中查找对应的数据或是丢弃删除某些数据又或是对数据进行变更然后将结果返回给用户。
1.2.2 SQL语言
对数据库进行查询和修改操作的语言叫做SQL。SQL语言包含以下4个部分
数据定义语言DDLDROPCREATEALTER等语句。数据操作语言DMLINSERTUPDATEDELETE语句。数据查询语言DQLSELECT语句。数据控制语言DCLCRANTREVOKECOMMITROLLBACK等语句。
1.2.3 数据库访问接口
不同的程序设计语言会有各自不同的数据库访问接口程序语言通过这些接口执行SQL语句进行数据库管理。主要的数据库访问接口有 ODBCOpen Database Connectivity开放数据库互连技术为访问不同的SQL数据库提供了一个共同的接口。ODBC使用SQL作为访问数据的标准。这一接口提供了最大限度的互操作性一个应用程序可以通过共同的一组代码访问不同的SQL数据库管理系统DBMS。 一个基于ODBC的应用程序对数据库的操作不依赖任何DBMS不直接与DBMS打交道所有的数据库操作由对应的DBMS的ODBC驱动程序完成。也就是说不论是AccessMySQL还是Oracle数据库均可用ODBC API进行访问。由此可见ODBC的最大优点是能以统一的方式处理所有的数据库。 JDBCJava Database Connectivityjava数据库连接用于Java程序连接数据库的标准方法是一种用于执行SQL语句的Java API可以为多种关系数据库提供统一访问它由一组用Java语言编写的类和接口组成。 ADO.NET微软在.NET框架下开发设计的一组用于和数据源进行交互的面向对象类库。ADO.NET提供了对关系数据XML和应用程序数据的访问允许和不同类型的数据源以及数据库进行交互。 PDOPHP Data Object为PHP访问数据库定义了一个轻量级的一致性的接口它提供了一个数据访问抽象层这样无论使用什么数据库都可以通过一致性的函数执行查询和获取数据。
1.3 什么是MySQL
MySQL是一个小型关系型数据库管理系统与其他大型数据库管理系统例如OracleDB2SQL Server等相比MySQL规模小功能有限但是它体积小速度快成本低且它提供的功能对稍微复杂的应用来说已经够用。
MySQL的优势如下
速度运行速度快。价格MySQL对多数个人用户来说是免费的。容易使用与其他大型数据库的设置和管理相比其复杂程度较低易于学习。可移植性能够工作在众多不同的系统平台上。丰富的接口提供了用于CJavaPython等语言的API。支持查询语言MySQL可以利用标准SQL语法支持ODBC开放式数据库连接的应用程序。安全性和连接性十分灵活和安全的权限和密码系统允许基于主机的验证。连接到服务器时所有的密码传输均采用加密形式从而保证了密码安全。并且由于MySQL是网络化的因此可以在英特网上的任何地方访问提高数据共享的效率。
二、数据库的基本操作
2.1 数据库创建和删除
创建数据库 CREATE DATABASE database_name;查看数据库定义SHOW CREATE DATABASE;或 SHOW CREATE DATABASE\G;删除数据库DROP DATABASE database_name
2.2 数据库存储引擎
数据库存储引擎是数据库底层软件组件数据库管理系统DBMS使用数据引擎进行创建查询更新和删除数据操作。不同的存储引擎提供不同的存储机制索引技巧锁定水平等功能。MySQL的核心就是存储引擎。
2.2.1 MySQL存储引擎简介
MySQL提供了多个不同的存储引擎包括处理事务安全表的引擎和处理非事务安全表的引擎。在MySQL中不需要在整个服务器中使用同一种存储引擎针对具体的要求可以对每一个表使用不同的存储引擎。show engines;命令查看所有引擎MySQL支持的存储引擎有以下 Support列的值表示某种引擎是否可以使用YES表示可以使用NO表示不能使用DEFAULT表示该引擎为当前默认存储引擎。 Transaction表示是否支持事务XA表示是否支持分布式的交易处理的XA的规范Savepoints表示是否支持 保存点。 由此可见MySQL默认搜索引擎是InnoDB。
2.2.2 InnoDB存储引擎
InnoDB事务型数据库的首选引擎支持事务安全表ACID支持行锁定和外键。MySQL5.5.5之后InnoDB作为默认存储引擎InnoDB主要特性有
InnoDB给MySQL提供了具有提交回滚和崩溃恢复能力的事务安全ACID兼容存储引擎。InnoDB锁定在行级并且也在SELECT语句中提供了一个类似Oracle的非锁定读。InnoDB是为处理巨大数据量的最大性能设计。它的CPU效率可能是任何其他基于磁盘关系的数据库引擎所不能匹敌的。InnoDB存储引擎完全与MySQL服务器整合InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB将他的表和索引放在一个逻辑表空间中表空间可以包含数个文件或原始磁盘分区。这与MyISAM表不同比如在MyISAM表中每个表被存在分离的文件中。InnoDB支持外键完整性约束。存储表中的数据时每张表的存储都按主键顺序存放如果没有显示在表定义时指定主键InnoDB会为每一行生成一个6字节的ROWID并以此作为主键。InnoDB被用在众多需要高性能的大型数据库站点上。InnoDB不创建目录使用InnoDB时MySQL将在MySQL数据目录下创建一个名为ibdata1的10MB大小的自动扩展数据文件以及两个名为ib_logfile0和ib_logfile1的5MB大小的日志文件。
2.2.3 MyISAM存储引擎
MyISAM基于ISAM存储引擎并对其进行扩展。它是在Web数据仓储和其他应用环境下最常用的存储引擎之一。MyISAM拥有较高的插入查询 速度但不支持事务。MyISAM主要特性有
大文件达63位文件长度在支持大文件的文件系统和操作系统上被支持。当把删除和更新及插入操作混合使用的时候动态尺寸的行产生更少碎片。这要通过合并被删除的块以及若下一个块被删除就扩展到下一块来自动完成。每个MyISAN表最大索引数是64这可以通过重新编译来改变。每个索引最大的列数是16个。最大的键长度是1000字节这也可以通过编译来改变。对于键长度超过250字节的情况一个超过1024字节的键将被用上。BOLB和TEXT列可以被索引。NULL值被允许在索引的列中。这个值占每个键的0~1个字节。所有数字键值以搞字节优先被存储以允许一个更高地索引压缩。每个 MyISAM类型的表都有一个AUTO_INCREMENT的内部列当INSERT和UPDATE操作的时候该列被更新同时AUTO_INCREMENT列将被刷新所以说MyISAM类型表的AUTO_INCREMENT列更新比InnoDB类型的AUTO_INCREMENT更快。可以把数据文件和索引文件放在不同目录。每个字符列可以有不同的字符集。有VARCHAR的表可以固定或动态记录长度。VARCHAR和CHAR列可以多达64KB。 使用MyISAN引擎创建数据库将生产3个文件文件的名字以表名字开始扩展名指出文件类型frm文件存储表定义数据文件的扩展名为.MYD索引文件的扩展名是.MYI。
2.2.4 存储引擎的选择
不同的存储引擎都有各自的特点以适应不同的需求。
功能InnoDBMyISAMMemoryArchive存储限制64TB256TBRAMNone支持事务是否否否支持全文索引否是否否支持树索引是是是否支持哈希索引否否是否支持数据缓存是否N/A否支持外键是否否否
如果要提供提交回滚和崩溃恢复能力的事务安全ACID能力并要求实现并发控制InnoDB是个很好的选择。如果数据表 主要用来插入和查询记录则MyISAM引擎能提供较高的处理效率如果只是临时存放数据数据量不大并且不需要较高的数据安全性可以选择将数据保存在内存中的Memory引擎MySQL中使用该引擎作为临时表存放查询的中间结果。如果只有INSERT和SELECT操作可以选择Archive引擎Archive殷勤可以支持高并发的插入操作但是本身并不是事务安全的。Archive存储引擎非常适合存储归档数据如记录日志信息。
三、数据表的基本操作
3.1 创建数据表 创建数据表 CREATE TABLE 表名 ( 字段名1 数据类型[列级别约束条件][默认值], 字段名2 数据类型[列级别约束条件][默认值], … [表级别约束条件] ); 例如 CREATE TABLE tb_emp1 ( id INT(11), name VARCHAR(25), deptId INT(11), salary FLOAT ); 添加主键约束创建表时 CREATE TABLE tb_emp1 ( id INT(11) PRIMARY KEY, name VARCHAR(25), deptId INT(11), salary FLOAT ); 添加主键约束定义完所有列之后 CREATE TABLE tb_emp1 ( id INT(11) , name VARCHAR(25), deptId INT(11), salary FLOAT, PRIMARY KEY(id) ); 多字段联合主键 PRIMARY KEY[字段1字段2…字段n] 例如 CREATE TABLE tb_emp1 ( id INT(11) , name VARCHAR(25), deptId INT(11), salary FLOAT, PRIMARY KEY(id,mame) ); 使用外键约束首先外键是表中的一个字段它可以不是本表子表的主键但对应另外一个表的主键父表。外键的主要作用就是保证数据引用的完整性定义外键后不允许删除在另一个表中具有关联关系的行。外键的作用是保持数据一致性完整性。 主表父表对于两个具有关联关系的表而言相关联字段中主键所在的那个表即是主表。 从表子表对于两个具有关联关系的表而言相关联字段中外键所在的那个表即是从表。 创建外键的语法[CONSTRAINT外键名 FOREING KEY 字段名1[,字段名2,…]] REFERENCES主表名 主键列[,主键列2,…] 例如 CREATE TABLE tb_emp1 ( id INT(11) , name VARCHAR(25), location VARCHAR(50) ); CREATE TABLE tb_emp5 ( id INT(11) , name VARCHAR(25), deptId INT(11), salary FLOAT CONSTRAINT fk_emp_dept1 FORRIGN KEY(deptId) REFERENCES tb_dept1(id); ); 以上语句执行成功之后在表tb_emp5上添加了名称为fk_emp_dept1的外键约束外键名称为deptId其依赖于表tb_dept1的主键id。 使用非空约束 指定字段的值不能为空。 语法字段名 数据类型 NOT NULL。 例如 CREATE TABLE tb_emp1 ( id INT(11) , name VARCHAR(25) NOT NULL, location VARCHAR(50) ); 使用唯一性约束 要求该列唯一允许为空但只能出现一个空值唯一约束可以确保一列或者几列不出现重复值。 语法如下 字段名 数据类型 UNIQUE创建表时 [CONSTRAINT约束名 UNIQUE字段名]定义完所有列之后 例如 CREATE TABLE tb_emp1 ( id INT(11) , name VARCHAR(25) UNIQUE, location VARCHAR(50) ); CREATE TABLE tb_emp1 ( id INT(11) , name VARCHAR(25), location VARCHAR(50), CONSTRAINT STH UNIQUE(name) ); 使用默认约束 指定某列的默认值。例如将某表中的年龄一列指定为默认值20。新插入数据时如果没有指定值就会默认为20. 语法字段名 数据类型 DEFAULT 默认值 例如 CREATE TABLE tb_emp1 ( id INT(11) , name VARCHAR(25) , location VARCHAR(50) DEFAULT ‘徐州’ ); 设置表的属性值自动增加 每次新插入记录时系统自动生成字段的主键值。 一个表只能有一个字段使用AUTO_INCREMENT约束且该字段必须为主键的一部分。AUTO_INCREMENT约束的字段可以是任何整数类型。 语法字段名 数据类型 AUTO_INCREMENT 例如 CREATE TABLE tb_emp1 ( id INT(11) PRIMARY KEY AUTO_INCREMENT, name VARCHAR(25) , location VARCHAR(50) );
3.2 修改数据表
修改表是指修改数据库中已经存在的数据表的结构。MySQL使用ALTER TABLE语句修改表。常用的修改表的操作有修改表名修改字段数据类型或字段名增加和删除字段修改字段的排列位置更改表的存储引擎删除表的外键约束等。 修改表名 语法ALTER TABLE旧表名 RENAME[TO]新表名其中TO为可选参数使用与否均不影响结果。 例如ALTER TABLE tb_dept3 RENAME tb_deptment3将表tb_dept3改名为 tb_deptment3 修改字段数据类型 语法ALTER TABLE表名 MODIFY字段名 数据类型 例如ALTER TABLE tb_dept3 MODIFY name VARCHAR(90) 修改字段名 ALTER TABLE表名 CHANGE旧字段名 新字段名新数据类型 例如ALTER TABLE tb_dept3 CHANGE name name2 VARCHAR(10) 由于不同类型的数据在机器中存储的方式及长度并不相同修改数据类型可能会影响到数据表中已有的数据记录。因此当数据表中已有数据时不要轻易修改数据类型。 添加字段 语法ALTER TABLE表名 ADD 新字段名数据类型 [约束条件][FIRST|AFTER已存在字段名]; FIRST是可选参数其作用是将新添加的字段设置为表的第一个字段 AFTER为可选参数其作用是将新添加的字段添加到指定的“已存在字段名”的后面。 FIRST和AFTER用于指定新增字段在表中的位置如果SQL语句中没有这个两个参数则默认将新添加的字段设置为数据表的最后列。 例如ALTER TABLE tb_dept3 ADD sex VARCHAR(2)默认放在最后一列 ALTER TABLE tb_dept3 ADD sex VARCHAR(2) FIRST放在最前列 ALTER TABLE tb_dept3 ADD sex VARCHAR(2) AFTER name指定为在name列后。 删除字段 语法ALTER TABLE表名 DROP 字段名; 例如ALTER TABLE tb_dept3 DROP sex 修改字段的排列位置 语法ALTER TABLE表名 MODIFY 字段1数据类型FIRST|AFTER字段2; FIRST是可选参数其作用是将新添加的字段设置为表的第一个字段 AFTER为可选参数其作用是将新添加的字段添加到指定的“已存在字段名”的后面。 FIRST和AFTER用于指定新增字段在表中的位置如果SQL语句中没有这个两个参数则默认将新添加的字段设置为数据表的最后列。 例如 ALTER TABLE tb_dept3 MODIFY sex VARCHAR(2) FIRST放在最前列 ALTER TABLE tb_dept3 MODIFY sex VARCHAR(2) AFTER name指定为在name列后。 更改表的存储引 根据自己的需要选择不同的引擎甚至可以为每一张表选择不同的存储引擎。 语法ALTER TABLE 表名 ENGINE更改后的存储引擎名 例如ALTER TABLE tb_dept3 ENGINEMyISAM; 删除表的外键约束 语法ALTER TABLE 表名 DROP FOREIGN KEY外键约束名 例如ALTER TABLE tb_dept3 DROP FOREIGN KEY fk_emp_dept;
3.3 删除数据表 删除数据表之前判断是否存在 语法DROP TABLE [IF EXISTS] 表1,表2,…,表n 例如DROP TABLE IF EXISTS tb_dept2; 直接删除表 语法DROP TABLE 表1 例如DROP TABLE tb_dept2; 删除有外键约束的主表 ALTER TABLE tb_dept1 DROP FOREIGN KEY fk_emp_dept;
3.4 查看数据表结构
语法DESCRIBE 表名或者简写为 DESC 表名
查看数据表详细结构语法SHOW CREATE TABLE 表名\G 使用SHOW CREATE TABLE语句不仅可以查看表创建时候的详细语句而且还可以查看存储引擎和字符编码。加上参数\G之后可以使结果更加直观易于查看。
四、数据类型和运算符
4.1 MySQL数据类型介绍
MySQL支持多种数据类型主要有数值类型日期/时间类型和字符串类型
数值数据类型包括整数类型TINYINTSMALLINTMEDIUMINTINTBIGINT。浮点小数数据类型FLOAT和DOUBLE定点小数类型DECIMAL。日期/时间类型包括YEARTIMEDATEDATETIME和TIMESTAMP。字符串类型包括CHARVARCHARBINARYVARBINARYBLOBTEXTENUM和SET等。
4.1.1 整数类型
数值型数据类型主要用来存储数字MySQL提供了多种数值数据类型不同的数据类型提供不同的取值范围可以存储的值范围越大其所需要的存储空间也会越大。
MySQL中的整数型数据类型以及取值范围
类型名称说明存储需求有符号无符号TINYINT很小的整数1个字节-128~1270~255SMALLINT小的整数2个字节32768~327670~65535MEDIUMINT中等大小的整数3个字节-8388608~83886070~16777215INT(INTEGER)普通大小的整数4个字节-2147483648~21474836470~4294967295BIGINT大整数8个字节-9223372036854775808~92233720368547758070~18446744073709551615
当我们创建表和列的时候给列指定数据类型以及长度例如year INT(4)括号中显示的11是宽度宽度和数据类型的取值范围是无关的。显示宽度只是指明MySQL最大可能显示的数字个数数值的位数小于指定的宽度时会由空格填充如果插入了大于显示宽度的值只要该值不超过该类型整数的取值范围数值依然可以插入而且能够显示出来。例如假如向year字段插入一个数值19999即使数值宽度超过了设定的4宽度但19999依然在INT类型的取值范围内所以MySQL依然显示完整的19999而不是1999。 宽度只是用于显示并不能限制取值范围和占用空间如INT(3)会占用4个字节的存储空间并且允许的最大值也不会是999而是INT整型所允许的最大值。 其他整数数据类型也可以在定义表结构时指定所需要的显示宽度如果不指定则系统为每一种类型指定默认的宽度值。
4.1.2 浮点数类型和定点数类型
MySQL中使用浮点数和定点数来表示小数。浮点类型有两种单精度浮点数FLOAT和双精度浮点类型DOUBLE。定点类型只有一种DECIMAL。浮点类型和定点类型都可以用M,N来表示M称为精度表示总共的位数N称为标度是表示小数的位数。 MySQL中的浮点数和定点数数据类型以及取值范围
类型名称说明存储需求有符号无符号FLOAT单精度浮点数4个字节-3.402823466E38~-1.175494351E-380和1.175494351E-38~3.402823466E38DOUBLE双精度浮点数8个字节-1.7976931348623157E308~-2.2250738585072014E-3080和2.2250738585072014E-308~1.7976931348623157E308DECIMAL(M,D)DEC压缩的“严格”定点数M2个字节
DECIMAL类型不同于FLOAT和DOUBLEDOUBLE实际是以串存放的DECIMAL可能的最大取值范围与DOUBLE一样但是其有效的取值范围由M和D的值决定。如果改变M而固定D则其取值范围将随M的变大而变大。 不论是定点还是浮点类型如果用户指定的精度超出精度范围则会四舍五入进行处理。 例如 插入当前系统日期。
下图示例辅助理解 SQL语句 结果 SQL语句 结果 SQL语句 结果 SQL语句 结果 SQL语句
结果 这是因为MySQL允许“不严格”语法任何标点符号都可以作用日期部分之间的间隔符。例如‘98-12-21’‘98.12.21’‘981221’是等价的这些值可以正确的插入到数据库。 DATETIME DATETIME类型用在需要同时 包含日期和时间信息的值在存储时需要8个字节。日期格式为‘YYYY-MM-DD HH:MM:SS’‘YYYY’表示年‘MM’表示月‘DD’表示日‘HH’表示小时‘MM’表示分钟SS’表示秒。在给DATETIME类型的字段赋值时可以使用字符串类型或者数字类型的数据插入如下所示 1以‘YYYY-MM-DD HH:MM:SS’或者‘YYYYMMDDHHMMSS’字符串格式表示的值取值范围为‘1000-01-01 00:00:00’~‘9999-12-3 23:59:59’。 2以‘YY-MM-DD HH:MM:SS’或者‘YYMMDDHHMMSS’字符串格式表示的日期在这里YY表示两位的年值。‘00~69’范围的年值转换为‘2000 ~ 2069’‘70 ~ 99’范围的年值转换为‘1970 ~ 1999’。 3以YYYYMMDDHHMMSS或者YYMMDDHHMMSS数字格式表示的日期和时间规则和上述一致。 PSMySQL允许“不严格”语法任何标点符号都可以作用日期部分之间的间隔符。例如‘98-12-21 11:30:45’‘98.12.21 113045’‘981221 113045’是等价的这些值可以正确的插入到数据库。 TIMESTAMP TIMESTAMP的显示 格式与DATETIME相同显示宽度固定在19个字符日期格式为YYYY-MM-DD HH:MM:SS在存储时需要4个字节。但是TIMESTAMP列的取值范围小于DATETIME的取值范围为‘1970-01-01 00:00:01’UTC~‘2038-01-19 03:14:07’ UTC其中UTCCoordinated Universal Time为世界标准时间。 如果为一个DATETIME或TIMESTAMP对象分配一个DATE值结果值的时间部分被设置为“00:00:00”因为DATE值未包含时间信息。如果为一个DATE对象分配一个DATETIME或TIMESTAMP值结果值的时间部分会被截断。 TIMESTAMP与DATETIME除了存储字节和支持的范围不同外还有一个最大的区别就是DATETIME在存储日期数据时按实际输入的格式存储即输入什么就存储什么与时区无关而TIMESTAMP值的存储是以UTC世界标准时间格式保存的存储时对当前时区进行转换检索时再转换回当前时区。即查询时根据当前时区的不同显示的时间值是不同的。
下图示例辅助理解 SQL语句 结果 SQL语句 结果
在数据库插入当前系统时间当前是东八区 设置当前时区为东十区 再次查询时时间以东十区显示实际数据库中存储的仍是东八区时间如下所示
4.1.4 字符串类型
字符串类型用来存储字符串数据除了可以存储字符串数据外还可以存储其他数据比如图片和声音的二进制数据。字符串可以进行区分或者不区分大小写的串比较另外还可以进行模式匹配查找。
MySQL字符串数据类型
类型名称说明存储需求CHAR(M)固定长度非二进制字符串M字节1M255VARCHAR(M)变长非二进制字符串L1字节在此LM和1M255TINYTEXT非常小的非二进制字符串L1字节在此L2^8TEXT小的非二进制字符串L2字节在此L2^16MEDIUMTEXT中等大小的非二进制字符串L3字节在此L2^24LONGTEXT大的非二进制字符串L4字节在此L2^32ENUM枚举类型只能有一个枚举字符串值1或2个字节取决于枚举值的数目最大值65535SET一个设置字符串对象可以有零个或多个SET成员1,23,4或8个字节取决于集合成员的数量最多64个成员
VARCHARBLOB和TEXT类型是变长类型对于其存储需求取决于列值的实际长度在前面的表格中用L表示而不是取决于类型的最大可能尺寸。例如一个VARCHAR(10)列能保存最大长度为10个字符的一个字符串实际的存储需要是字符串的长度L加上1个字节以记录字符串长度。例如对于字符“abcd”L是4而存储要求是5个字节。
4.1.5 二进制类型
MySQL支持两类字符型数据文本字符串和二进制字符串。
MySQL中的二进制数据类型
类型名称说明存储需求BIT(M)位字段类型大约M7)/8个字节BINARY(M)固定长度二进制字符串M个字节VARBINARY(M)可变长度二进制字符串M1个字节TINYBLOB(M)非常小的BLOBL1字节在此L2^8BLOB(M)小BLOBL2字节在此L2^16MEDIUMBLOB(M)中等大小的BLOBL3字节在此L2^24LONGBLOB(M)非常大的BLOBL4字节在此L2^32
4.2 如何选择数据类型
MySQL提供了大量的数据类型为了优化存储提高数据库性能在任何情况下均应使用最精确的类型。
整数和浮点数 如果不需要小数部分则使用整数来保存数据如果需要表示小数部分则使用浮点数类型。对于浮点数琚列列入的数值会对该列定义的小数位进行四舍五入。 浮点类型包括FLOAT和DOUBLE类型。DOUBLE类型精度比FLOAT类类型高因此如要求存储精度较高时应选择DOUBLE类型。浮点数和定点数 浮点数FLOAT和DOUBLE相对于定点数DECIMAL的优势是在长度一定的情况下浮点数能表示更大的数据范围。但是由于浮点数容易产生误差因此对精度要求比较高时建议使用DECIMAL来存储。DECIMAL在MySQL中是以字符串存储的用于定义货币等精确度要求较高的数据。在数据迁移中FLOAT(M,D)是非标准SQL定义数据库迁移可能会出现问题最好不要这样使用。另外两个浮点数进行减法和比较运算时也比较容易出问题因此在进行计算的时候一定要小心。如果进行数值比较最好使用DECIMAL类型。日期和时间类型 MySQL对于不同种类的日期和时间有很多的数据类型如果只需要记录年份则使用YEAR类型即可如果只记录时间只需使用TIME类型。 如果同时需要记录日期和时间则可以使用TIMESTAMP或者DATETIME类型。由于TIMESTAMP列的取值范围小于DATETIME的取值范围因此存储范围较大的日期最好使用DATETIME。 TIMESTAMP也有一个DATETIME不具备的属性。默认情况下当插入一条记录但并没有指定TIMESTAMP这个列值时MySQL会把TIMESTAMP列设为当前的时间。因此当需要插入记录同时插入当前时间时使用TIMESTAMP是方便的另外TIMESTAMP在空间上比DATETIME更有效。CHAR和VARCHAR之间的特点与选择 CHAR是固定长度字符VARCHAR是可变长度字符CHAR会自动删除插入数据的尾部空格VARCHAR不会删除尾部空格。 CHAR是固定长度所以它的处理速度比VARCHAR的速度更快但是它的缺点就是浪费存储空间。所以对存储不大但在速度上有要求的可以使用CHAR类型反之可以使用VARCHAR类型来实现。 对于MyISAM存储引擎最好是使用固定长度的数据类型这样可以使整个表静态化从而使数据检索更快用空间换时间。 对于InnoDB存储引擎使用可变长度的数据类型因为InnoDB数据表的存储格式部分固定长度和可变长度因此使用CHAR不一定比使用VARCHAR更好但由于VARCHAR是按照实际的长度存储比较节省空间所以对磁盘IO和数据存储总量比较好。ENUM和SETBOLB和TEXT BLOB是二进制字符串TEXT是非二进制字符串两者均可存放大容量的信息。BLOB主要存储图片音频信息等而TEXT只能存储纯文本文件。
4.3 常见运算符介绍
运算符连接表达式中各个操作数其作用是指明对操作数所进行的运算。
4.3.1 算术运算符
用于各类数值运算包括加减-乘*除/求余或称模运算%。
4.3.2 比较运算符
用于比较的运算符。一个比较运算符的结果总是10,或者是null比较运算符经常在SELECT的查询条件子句中使用用来查询满足指定条件的记录。
MySQL中的比较运算符
运算符作用等于安全的等于(!)不等于小于等于大于等于大于IS NULL判断一个值是否为nullIS NOT NULL判断一个值是否不为nullLEAST在有两个或多个参数时返回最小值GREATEST在有两个或多个参数时返回最大值BETWEEN AND判断一个值是否落在两个值之间ISNULL与IS NULL作用相同IN判断一个值是IN列表中的任意一个值NOT IN判断一个值不是IN列表中的任意一个值LIKE通配符匹配REGEXP正则表达式匹配 “”不能用于null值的判断而“”可以对null进行判断两者都为NULL时返回值为1. “BETWEEN AND”用法示例SELECT 4 BETWEEN 4 AND 6;意思是4是否在4~6之间 “LEAST|”用法示例SELECT least(2,4,5)返回2,45三个数字中最下的值。 同理“GREATEST”与“LEAST”用法一致。 LIKE运算符用来匹配字符串语法格式为expr LIKE 匹配条件LIKE运算符心思进行匹配时一般使用下面两种通配符 1“%”匹配任何数目的字符甚至包括零字符。 2“_”只能匹配一个字符。 REGEXP运算符用来匹配较为复杂的字符串语法格式为expr REGEXP 匹配条件。REGEXP运算符在进行匹配时常用的有下面几种通配符 1‘^‘匹配以该字符后面的字符开头的字符串 2‘$’匹配以该字符后面的字符结尾的字符串 3’.‘匹配任何一个单字符 4’[…]‘匹配在方括号内的任何字符。例如[abc]匹配a,b,c为了命名字符的范围使用一个’-’。[a-z]匹配任何字母而“[0- 9]”匹配任何数字。 5匹配 零个或多个在它面前的字符。例如x匹配任何数量的‘x’字符“[0-9]”匹配任何数量的数字而“.”匹配任何数量的任何字符。
4.3.3 逻辑运算符
在MySQL中逻辑运算符的求值结果为1TRUE0FALSE和NULL。
MySQL中的逻辑运算符
运算符作用NOT或者逻辑非AND 或者 逻辑与OR逻辑或XOR逻辑异或
4.3.4 位运算符
位运算符是用来对二进制字节中的位进行测试移位或者测试处理。
MySQL中的位运算符
运算符作用l位或位与^位异或位左移位右移~位取反反转所有比特
4.3.5 运算符优先级
运算符按照优先级由低到高排列
五、MySQL函数
5.1 MySQL函数简介
函数表示对输入参数值返回一个具有特定关系的值MySQL提供了大量丰富的函数在进行数据库管理以及数据的查询和操作时会经常用到各种函数。通过对数据的处理数据库功能可以变得更加强大更加灵活地满足不同用户的需求。
5.2 数学函数 绝对值函数ABS(x)和返回圆周率函数PI()。 平方根函数SQRT(x)和求余函数MOD(x,y)。 获取整数函数 CEIL(x)CEILING(x)FLOOR(x)。 CEIL(x)与CEILING(x)意义相同返回大于x的最小整数值。FLOOR(x)返回小于x的最大整数值。返回值都转换为BIGINT类型。 获取随机数函数RAND()和RAND(x)。 RAND(x)返回一个随机浮点数值v范围在0到1之间0v1.0。若已指定一个整数参数x则它被用作种子值用来产生重复序列。当RAND(x)的参数相同时将产生相同的随机数不同的x产生的随机数值不同。 四舍五入函数ROUND(x)ROUND(x,y)和TRUNCATE(x,y) 1ROUND(x,y)返回最接近于参数x的数其值被保留到小数点后面y位若y为负值则将保留x值到小数点左边y位保留的小数点左边的相应位数直接保存为0不进行四舍五入。 例如ROUND(1.38,1)保留小数点后面1位四舍五入的结果为1.4ROUND(1.38,0)保留 小数点后面0位即返回四舍五入后的数值ROUND(23.38,-1)保留小数点的左边1位结果即为20ROUND(232.38,-2)保留小数点左边2位结果即为200. 2TRUNCATE(x,y)返回被舍去至小数点后y位的数字x若y的值为0则结果不带有小数点或不带有小数部分。若y设为负数则截去归零x小数点左起第y位开始后面所有低位的值。 例如TRUNCATE(1.31,1)和TRUNCATE(1.99,1)都保留小数点后1位数字返回值分别为1.3和1.9TRUNCATE(1.99,0)返回整数部分值1TRUNCATE(19.99,-1)截去小数点左边第1位后面的值并将整数部分的1位数字置0结果为10. 符号函数SIGN(x) SING(x)返回参数的符号x的值为负零或正时返回结果依次为-1,0或1。 对数运算函数LOG(x)和LOG10(x)。 角度和弧度相互转换的函数RADIANS(x)和DEGREES(x) 正弦函数SIN(x)和反正弦函数ASIN(x) 正切函数TAN(x)反正切函数ATAN(x)余切函数COT(x)
5.3 字符串函数
计算字符串字符数函数CHAR_LENGTH(str)和字符串长度函数LENGTH(str)合并字符串函数CONCAT(s1,s2,…)CONCAT_WS(x,s1,s2,…) CONCAT(s1,s2,…)与CONCAT_WS(x,s1,s2,…)的区别在于如果sn为null的话前者的返回结果即为null后者会忽略null的部分继续拼接合并其他不为null 的值作为结果返回。替换字符串函数INSERT(s1,x,len,s2)。字母大小写转换函数LOWER(str)和LCASE(str)。获取指定长度的字符串函数LEFT(s,n)和RIGHT(s,n)。填充字符串函数LPAD(s1,len,s2)和RPAD(s1,len,s2)。删除空格函数LTRIM(s)RTRIM(s)和TRIM(s)。删除指定字符串函数TRIM(s1 FROM s) 删除字符串s中两端所有的子字符串s1中间的s1字符串不删除。重复生成字符串函数REPEAT(s,n)。空格函数SPACE(n)和替换函数REPLACE(s,s1,s2)。比较字符串大小函数STRCMP(s1,s2)获取子串函数SUBSTRING(s,n,len)和MID(s,n,len) 如果len小于1则结果始终未空字符串。匹配子串开始位置函数 LOCATE(str1,str)POSITION(str1 IN str)INSTR(str,str1)3个函数作用相同返回子字符串str1在字符串str中的开始位置。字符串反转函数REVERSE(s)返回指定位置的字符串函数 ELT(N字符串1字符串2字符串3…字符串N)若N1则返回值为字符串1若N2则返回值为字符串2依次列推。若N小于1或大于参数的数目则返回值为NULL。返回指定字符串位置的函数FIELD(s,s1,s2,…)。返回子串位置的函数FIND_IN_SET(s1,s2)。选取字符串的函数MAKE_SET(x,s1,s2,…)。
5.4 时间和日期函数
获取当前日期的函数CURDATE()CURRENT_DATE()CURRENT_DATE()0可以将当前日期值转换为数值型。获取当前时间的函数CURTIME()CURRENT_TIME()CURRENT_TIME()0可以将当前日期值转换为数值型。获取当前时间和日期的函数CURRENT_TIMESTAMP()LOCALTIME()NOW()SYSDATE()UNIX时间戳函数 UNIX_TIMESTAMP(data)若无参数调用则返回一个Unix时间戳‘1970-01-01 00:00:00’ GMT之后的秒数作为无符号整数。若用date来调用UNIX_TIMESTAMP()它会将参数值以‘1970-01-01 00:00:00’GMT后的秒数的形式返回。date可以是一个DATE字符串DATETIME字符串TIMESTAMP或一个当地时间的YYMMDD或YYYYMMDD格式的数字。 FROM_UNIXTIME(data)函数把UNIX时间戳转换为普通格式的时间与UNIX_TIMESTAMP(data)函数互为反函数。返回UTC日期的函数UTC_DATE()。返回UTC时间的函数UTC_TIME()。获取月份的函数MONTH(data)MONTHNAME(date)获取星期的函数DAYNAME(d)DAYOFWEEK(d)和WEEKDAY(d)获取星期数的函数WEEK(d)WEEKOFYEAR(d)获取天数的函数DAYOFYEAR(d)和DAYOFMONTH(d)获取年份季度小时分钟和秒钟函数 YEAR(date)‘00~69’转换为‘2000 ~ 2069’‘70 ~ 99’转换为‘1970 ~ 1999’ QUARTER(date) MINUTE(time) SECOND(time)获取日期的指定值的函数EXTRACT(type FROM date)时间和秒钟转换函数 TIME_TO_SEC(time)返回已转化为秒的time参数。转换公式为小时3600分钟60秒 SEC_TO_TIME(seconds)返回被转化为小时分钟和秒数的seconds参数值计算日期和时间函数 DATE_ADD()ADDDATE()DATE_SUB()SUBDATE()ADDTIME()SUBTIME()DATE_DIFF()将日期和时间格式化函数DATE_FORMAT(date,format)
5.5 条件判断函数
条件判断函数也称为控制流程函数根据满足的条件的不同执行相应的流程。
IF(expr,v1,v2)函数IFNULL(v1,v2)函数CASE函数
5.6 系统信息函数
获取MySQL版本号连接数和数据库名的函数 VERSION() CONNECTION_ID() SHOW PROCESSLIST或SHOW FULL PROCESSLIST查看有哪些线程显示信息更全 DATABASE()和SCHEMA()查询当前数据库获取用户名的函数 USER()CURRENT_USERCURRENT_USER()SYSTEM_USER()SESSION_USER()获取字符串的字符集和排序方式的函数 CHARSET(str) COLLATION(str)获取最后一个自动生成ID值的函数 LAST_INSERT_ID()
5.7 加密函数
加密函数PASSWORD(str)加密函数MD5(str)加密函数ENCODE(str,pswd_str)解密函数DECODE(crypt_str,pswd_str)
5.8 其他函数
格式化函数FORMAT(x,n)不同进制的数字进行转换的函数CONV(N,from_base,to_base)IP地址与数字互相转换的函数INET_ATON(expr)INET_NTOA(expr)加锁函数和解锁函数 GET_LOCK(str,timeout) RELEASE_LOCK(str) IS_FREE_LOCAK(str) IS_USEE_LOCAK(str)重复执行指定操作的函数 BENCHMARK(count,expr)改变字符集的函数 CONVERT(…USING…)改变数据类型的函数 CAST(x,AS type) CONVERT(x,type)
六、数据的增删改查
6.1 基本查询数据
MySQL从数据表中查询数据的基本语句为SELECT语句。SELECT语句的基本格式是 SELECT {*|字段列表} [FROM表1,表2… WHERE表达式 GROUP BY HAVING ORDER BY LIMIT ]
详细解释
{*|字段列表}包含星号通配符选字段列表表示查询的字段其中字段列至少包含一个字段名称如果要查询多个字段多个字段之间用逗号隔开最后一个字段后不要加逗号。FROM表1,表2…表1和表2表示查询数据的来源可以是单个或者多个WHERE子句是可选项如果选择该项将限定查询行必须满足的查询条件GROUP BY字段该子句告诉MySQL如何显示查询出来的数据并按照指定的字段分组[ORDER BY字段]该子句告诉MySQL按什么样的顺序显示查询出来的数据可以进行的排序有升序ASC降序DESC[LIMIT]该子句告诉MySQL每次显示查询出来的数据条数。
6.2 单表查询数据 查询所有字段 SELECT * FROM 表名; SELECT 字段名2字段名3字段名4…字段名n FROM 表名 查询单个字段 SELECT 字段名2 FROM 表名 查询指定记录WHERE提供查询条件 SELECT 字段名1字段名2…字段名n FROM 表名 WHERE 查询条件 查询IN或NOT IN范围内数据 SELECT 字段名1字段名2…字段名n FROM 表名 WHERE 字段名 IN() SELECT 字段名1字段名2…字段名n FROM 表名 WHERE 字段名 NOT IN() 带BETWEEN AND的范围查询 SELECT 字段名1字段名2…字段名n FROM 表名 WHERE 字段名 BETWEEN 开始值 AND 结束值 带LIKE的字段匹配查询用%或_通配符 SELECT 字段名1字段名2…字段名n FROM 表名 WHERE 字段名 LIKE ‘某些字符’ 查询空值 SELECT 字段名1字段名2…字段名n FROM 表名 WHERE 字段名 IS NULL 带ADN的多条件查询 SELECT 字段名1字段名2…字段名n FROM 表名 WHERE 条件表达式1 AND 条件表达式2 带OR的多条件查询 SELECT 字段名1字段名2…字段名n FROM 表名 WHERE 条件表达式1 OR 条件表达式2 某些情况下OR操作符和IN操作符使用后的结果是一样的他们可以实现相同的功能。但是使用IN操作符使得检索语句更加简洁明了并且IN执行的速度要快于OR。 OR可以和AND一起使用但是在使用时要注意两者的优先级由于AND的优先级高于OR因此先对AND两边的操作数进行操作再与OR中的操作数结合。 查询结果不重复 -SELECT DISTINCT(字段名) FROM 表名 对查询结果排序升序ASC降序DESC默认是ASC不用特意在后面标注 SELECT 字段名 FROM 表名 ORDER BY 字段名1字段名2字段名n 在对多列进行排序的时候首先排序的第一列必须有相同的列值才会对第二列进行排序。如果第一列数据中所有值都是唯一的将不再对二列进行排序。同理后面列名也是一样的。 分组查询 [GROUP BY 字段][HAVING条件表达式] 1GROUP BY关键字通常和聚合函数一起使用MAX()MIN()COUNT()SUM()AVG()。 2GROUP_CONCAT()函数可以将每个分组中的各个字符值显示出来。 3HAVING关键字与WHERE关键字都是用来过滤数据的两者的主要区别在于HAVING在数据分组之后进行过滤来选择分组而WHERE在分组之前用来选择记录。另外WHERE排除的记录不再包括在分组中。 4在GROUP BY子句中使用WITH ROLLUP可以在查询出的分组记录之后增加一条记录该记录就是计算查询出的所有记录的总和即统计记录数量。但是ROLLUP不可以与ORDER BY子句一起使用两个是互斥的。 5GROUP BY可以对多个字段进行分组MySQL根据多字段的值来进行层次分组分组层次是从左到右即先按第一个字段分组然后在第1个字段值相同的记录中再根据第2个字段的值进行分组…依次类推。 LIMIT限制查询结果的数量 LIMIT[位置偏移量]行数 第一个“位置偏移量”参数指示MySQL从哪一行开始显示是一个可选参数如果不指定“位置偏移量”将会从表中的第一条记录开始第一条记录的位置偏移量是0第二条记录的位置偏移量是1…依次类推第二个参数“行数”指示返回的记录条数。 带一个参数的LIMIT指定从查询结果的首行开始唯一的参数表示返回的行数即“LIMIT n”与“LIMIT 0,n”等价。带两个参数的LIMIT可以返回从任何一个位置开始的指定的行数。
6.3 使用集合函数查询
COUNT()函数 1COUNT(*)计算表中总的行数不管某列有数值或者为空值。 2COUNT(字段名)计算指定列下总的行数计算时将忽略空值的行。SUM()函数 SUM()函数是求总和的函数忽略列值为NULL的行。AVG()函数 AVG()函数通过计算返回的行数和每一行数据的和求得指定列数据的平均值。MAX()函数 MAX()函数返回指定列中的最大值MIN()函数 MIN()返回查询列中的最小值。
6.4 连接查询 内连接查询 INNER JOIN 外连接查询 1LEFT JOIN左连接返回包括左表中的所有记录和右表中连接字段相等的记录。 2RIGHT JOIN右连接返回包括右表中的所有记录和右表中连接字段相等的记录。
6.5 子查询
子查询指一个查询语句嵌套在另一个查询语句内部的查询。子查询可以添加到SELECTUPDATEDELETE语句中而且可以进行多层嵌套。
带ANYSOME关键字的查询 ANY关键字接在一个比较操作符的后面表示若与子查询返回的任何值比较为TRUE则返回TRUE。 例如SELECT num1 FROM tb1 WHERE num1 ANY(SELECT num2 FROM tbl2) 在子查询中返回的是tbl2表的所有num2列结果然后将tbl1中的num1列的值与之进行比较只要大于num2列的任意一个数即为符合条件的结果。带ALL关键字的查询 ALLA关键字与ANY和SOME不同使用ALL时需要同时满足所有内层查询的条件。 例如SELECT num1 FROM tb1 WHERE num1 ALL(SELECT num2 FROM tbl2) 在子查询中返回的是tbl2的所有num2列结果然后将tbl1中的num1列的值与之进行比较返回tbl1表中比tbl2表num2列所有值都大的值。带EXISTS关键字的子查询 1EXISTS关键字后面的参数是一个任意的子查询系统对子查询进行运算以判断它是否返回行如果至少返回一行那么EXISTS的结果为true此时外层查询语句将进行查询如果子查询没有返回任何行那么EXISTS返回的结果是false此时外层语句将不进行查询。 2NOT EXISTS与EXISTS使用方法相同返回的结果相反。子查询如果至少返回一行那么NOT EXISTS的结果为false此时外层查询语句将不进行查询如果子查询没有返回任何行那么NOT EXISTS返回的结果为true此时外层语句将进行查询。 3EXISTS和NOT EXISTS的结果只取决于是否会返回行而不取决于这些行的内容所以子查询输入列表通常是无关紧要的。 举例SELECT * FROM fruits WHERE EXISTS(SELECT s_name FROM suppliers WHERE s_id 109) 查询suppliers表中是否存在s_id109的供应商如果存在则查询fruits表中的记录带IN关键字的子查询 IN关键字进行子查询时内层查询语句仅仅返回一个数据列这个数据列里的值将提供给外层查询语句进行比较操作
提示所有有关子查询的操作过程先执行最内层子查询再执行外层查询最内层子查询的结果作为外部查询的比较条件。
6.6 合并查询结果
UNION或者UNION ALL 两者区别UNION ALL 的功能是不删除重复行加上ALL 关键字语句执行时所需要的资源少所以尽可能的使用它因此知道有重复行但是想保留这些行确定查询结果中不会有重复数据或者不需要去掉重复数据的时候应当使用UNION ALL 以提高查询效率。
6.7 为表和字段取别名
表名 [AS] 表别名 列名 [AS] 列别名
6.8 使用正则表达式查询
正则表达式常用字符匹配列表
选项说明列子匹配值示例^匹配文本的开始字符^b’匹配以字母b开头的字符串book,big,banana,bike$匹配文本的结束字符st$匹配以st结尾的字符串test,resist,persist.匹配任何单个字符b.t’匹配以任何b和t之间有一个字符bit,bat,but,bite*匹配零个或多个在它前面的字符f*n’匹配字符n前面有任意个字符ffn,fan,faan,abcn匹配前面的字符1次或多次ba匹配以b开头后面紧跟至少有一个aba,bay,bare,battle字符串匹配包含指定的字符串的文本‘fa’fan,afa,faad[字符集合]匹配字符集中的任何一个字符[xz]匹配x或者zdizzy,zebra,x-ray,extra[^]匹配不在括号中的任何字符[^abc]匹配任何不包含abc的字符串desk,fox,f8ke字符串{n,}匹配前面的字符串至少n次b{2}匹配2个或更多的bbbb,bbbb,bbbbbbb字符串{n,m}匹配前面的字符串至少n次至多m次。如果n为0此参数为可选参数b[2,4]匹配最少2个最多4个bbb,bbb,bbbb
SQL举例 1查询字符“^”匹配以特定字符串或者字符串开头的文本。 SELECT * FROM 表名 WHERE 列名 REGEXP ‘^b’查询以b开头的数据
2查询“$”匹配以特定字符或者字符串结尾的文本。
SELECT * FROM 表名 WHERE 列名 REGEXP ‘y$’查询以y结尾的记录
3用符号“.”来替代字符串中的任意一个字符 SELECT * FROM 表名 WHERE 列名 REGEXP ‘a.g’ 查询语句中“a.g”指定匹配字符中要有字母a和g且两个字母之间包含单个字符并不限定匹配的字符的位置和所在查询字符串的总长度。 4使用“”和“”来匹配多个字符 星号“”匹配前面的字符任意多次包括0次。加好“”匹配前面的字符至少一次。 SELECT * FROM 表名 WHERE 列名 REGEXP ‘^ba*’(必须是以b开头a可有可无因为星号是包含零次的) SELECT * FROM 表名 WHERE 列名 REGEXP ‘^ba(必须是以b开头且a字母必须出现一次) 5匹配指定字符串 使用“|”匹配多个字符串 SELECT * FROM 表名 WHERE 列名 REGEXP on|ap’查询包含字符串“on”或者“ap”的记录 6匹配指定字符中的任意一个 使用方括号[]指定一个字符集合只匹配其中任意一个字符即为所查找的文本 SELECT * FROM 表名 WHERE 列名 REGEXP ‘[ot]查询字段中包含字母o或者t的记录 匹配集合写法例如[1-9]匹配1到9之间的任意数字[a-z]匹配a~z之间的任意字母 7匹配指定字符以外的字符 “[^字符集合]”匹配不在指定集合中的任何字符 SELECT * FROM 表名 WHERE 列名 REGEXP ‘[^a-p1-9]’匹配出字母a-p和数字1-9之外的记录 8使用{n,}或者{n,m}来指定字符串连续出现的次数 子字符串{n,}表示至少匹配n次前面的字符“字符串{n,m}”表示匹配前面的字符串不少于n次不多于m次。例如a{2,}表示字母a连续出现至少2次也可以大于2次a{2,4}表示字母a连续出现最少2次最多不超过4次。 SELECT * FROM 表名 WHERE 列名 REGEXP x{2,}’
6.9 数据的新增
1语法INSERT INTO 表名列名VALUES (数值)或者INSERT INTO 表名 VALUES (数值)保证数值插入顺序和字段名一致就不用再写字段名。 2INSERT INTO person(name,age,info) VALUES(‘HSUDH’,28,‘SHUAHD’),(‘HSUQW’,21,‘AHD’),(‘H’,47,‘WEQ’) 比 INSERT INTO person(name,age,info) VALUES(‘HSUDH’,28,‘SHUAHD’)INSERT INTO person(name,age,info) (‘HSUQW’,21,‘AHD’)效率更高。因为MySQL执行单条INSERT语句插入多行数据比使用多条INSERT语句快。所以在插入多条记录时最好选择使用单条INSERT语句的方式插入。
6.10 数据的修改
1语法UPDATE 表名 SET 列名1value1,列名2value2列名3value3,…,列名nvaluen WHERE (查询条件)
6.11 数据的删除
1语法DELETE FROM 表名 [WHERE 查询条件] 2如果想删除表中的所有记录还可以使用TRUNCATE TABLE语句TRUNCATE将直接删除原来的表并重新创建一个表其语法结构为TRUNCATE TABLE table_name。TRUNCATE 直接删除而不是删除记录因此执行速度比DELETE快。
七、索引
7.1 索引简介
索引是对数据库表中一列或多列的值进行排序的一种结构使用索引可提高数据库中特定数据的查询速度。
7.1.1 索引的含义和特点
索引是一个单独的存储在磁盘上的数据库结构他们包含着对数据表里所有记录的引用指针。使用索引用于快速找出在某个或多个列中有一特定值的行所有MySQL列类型都可以被索引对相关列使用索引是提高查询操作速度的最佳途径。 例如数据库中有2万条记录现在要执行这样一个查询SELECT * FROM 表名 WHERE num 10000。如果没有索引必须遍历整个表直到num等于10000的这一行被找到为止如果在num列上创建索引MySQL不需要任何扫描直接在索引里面找10000就可以得知这一行的位置。 索引是在存储引擎中实现的因此每种存储引擎的索引都不一定完全相同并且每种存储引擎也不一定支持所有索引类型。根据存储引擎定义每个表的最大索引数和最大索引长度。所有存储引擎支持每个表至少16个索引总索引长度至少为256字节。大多数存储引擎有更高的限制。MySQL中索引的存储类型有两种BTREE和HASH具体和表的存储引擎相关MyISAM和InnoDB存储引擎只支持BTREE索引MEMORY/HEAP存储引擎可以支持HASH和BTREE索引。
索引的优点
通过创建唯一索引可以保证数据库表中每一行数据的唯一性。可以大大加快数据的查询速度这也是创建索引的最主要原因。在实现数据的参考完整性方面可以加速表和表之间的连接。在使用分组和排序子句进行数据查询时也可以显著减少查询中分组和排除的时间。
索引的缺点
创建索引和维护索引好费时间并且随着数据量的增加所耗费的时间也会增加。缩阴需要站磁盘空间除了数据表占数据空间之外每个索引还要占一定的物理空间如果有大量的索引索引文件可能比数据文件更快达到最大文件尺寸。当对表中的数据进行增加删除和修改的时候索引也要动态的维护这样就降低了数据的维护速度。
7.1.2 索引的分类
1普通索引和唯一索引 普通索引是MySQL中基本索引类型允许在定义索引的列中插入重复值和空值。 唯一索引索引列的值必须唯一但允许空值。如果是组合索引则列值组合必须唯一。 主键索引是一种特殊的唯一索引不允许有空值。
2单列索引和组合索引 单列索引即一个索引只包含单个列一个表可以有多个单列索引。 组合索引是指在表的多个字段组合上创建的索引只有在查询条件中使用了这些字段的左边字段时索引才会使用、使用组合索引时遵循最左前缀集合。
3全文索引 全文索引类型为FULLTEXT在定义索引的的列上支持值的全文查找允许在这些索引列中插入重复值和空值。MySQL中只有MyISAM存储引擎支持全文索引。
4空间索引 空间索引是对空间数据类型的字段建立的索引MySQL中的空间数据类型有4种分别是GEOMTRYPOINTLINESTRINGPOLYGON。MySQL使用SPATIAL关键字进行扩展使得能够用于创建正规索引类似的语法创建空间索引。创建空间索引的列必须将其声明为NOT NULL空间索引只能在存储引擎为MyISAM的表中创建。
7.1.3 索引的设计原则
索引并非越多越好一个表中如有大量的索引不仅占用磁盘空间而且会有影响INSERTDELETEUPDATE等语句的性能因为当表中的数据更改的同时索引也会进行调整和更新。避免对经常更新的表进行过多的索引并且索引中的列尽可能少。而堆经常用于查询的字段应该创建索引但要避免添加不必要的字段。数据量小的表最好不要使用索引由于数据少查询花费的时间可能比遍历索引的时间还要短索引可能不会产生优化效果。在条件表达式中经常用到的不同值比较多的列上建立索引在不同值少的列上不要建立索引。比如学生表的性别字段。当唯一性是某种数据本身的特征时指定唯一索引。使用唯一索引需能确保定义的列的数据完整性以提高查询速度。在频繁进行排序或分组的列上建立索引如果待排序的列有多个可以在这些列上建立组合索引。
7.2 创建索引
1语法 CREATE TABLE table_name[col_name_data_type] [UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] [index_name] (col_name[length]) [ASC|DESC]
UNIQUEFULLTEXTSPATIAL为可选参数分别表示唯一索引全文索引和空间索引INDEX和KEY为同义词两者作用相同用来指定创建索引col_name为需要创建索引的字段列index_name指定索引的名称为可选参数如果不指定MySQL默认col_name为索引值length为可选参数表示索引的长度只有字符串类型的字段才能指定索引长度ASC或DESC指定升序户降序的索引值存储。
提示组合索引遵从“最左前缀”利用索引中最左边的列集来匹配行这样的列表称为最左前缀。例如这有由id,name,age3个字段组合的索引索引行中按id/name/age的顺序存放索引可以由下面字段组合id,name,ageid,name或id。如果列不构成索引最左面的前缀MySQL不能使用局部索引如age或者name,age组合则不能使用索引。
2查看某一个查询语句是否使用索引 explain SELECT查询语句\G
3查看整个表的索引结构 SHOW INDEX FROM 表名\G
7.3 删除索引
ALTER TABLE 表名 DROP INDEX 索引名 DROP INDEX 索引名 ON 表名 提示添加了AUTO_INCREMENT约束字段的唯一索引不能被删除。