MySQL菜鸟教程

发布时间:   来源:文档文库   
字号:
MySQL教程

Mysql是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(RelationalDatabaseManagementSystem:关系数据库管理系统应用软件之一。
在本教程中,会让大家快速掌握Mysql的基本知识,并轻松使用Mysql数据库。

什么是数据库
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据。
我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。所以,现在我们使用关系型数据库管理系统RDBMS来存储和管理的大数据量。所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
RDBMS即关系数据库管理系统(RelationalDatabaseManagementSystem的特点:

1.数据以表格的形式出现2.每行为各种记录名称
3.每列为记录名称所对应的数据域


4.许多的行和列组成一张表单5.若干的表单组成database

RDBMS术语
在我们开始学习MySQL数据库前,让我们先了解下RDBMS的一些术语:

数据库:数据库是一些关联表的集合。.
数据表:表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。

:一列(数据元素包含了相同的数据,例如邮政编码的数据。行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。

冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。主键主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。

外键:外键用于关联两个表。
复合键复合键(组合键)将多个列作为一个索引键,一般用于复合索引。索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。

参照完整性:参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。

Mysql数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,目前属于Oracle公司。MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

Mysql是开源的,所以你不需要支付额外的费用。
Mysql支持大型的数据库。可以处理拥有上千万条记录的大型数据库。MySQL使用标准的SQL数据语言形式。
Mysql可以允许于多个系统上,并且支持多种语言。这些编程语言包括CC++PythonJavaPerlPHPEiffelRubyTcl等。

MysqlPHP有很好的支持,PHP是目前最流行的Web开发语言。MySQL支持大型数据库,支持5000万条记录的数据仓库,32位系统表文件最大可支持4GB64位系统支持最大的表文件为8TB

Mysql是可以定制的,采用了GPL协议,你可以修改源码来开发自己的Mysql系统。

在开始学习本教程前你应该了解
在开始学习本教程前你应该了解PHPHTML的基础知识,并能简单的应用。本教程的很多例子都跟PHP语言有关,我们的实例基本上是采用PHP语言来演示。
如果你还不了解PHP,你可以通过本站的PHP教程来了解该语言。

MySQL安装

所有平台的Mysql下载地址为:MySQL下载.挑选你需要的MySQLCommunityServer版本及对应的平台。

Linux/UNIX上安装Mysql
Linux平台上推荐使用RPM包来安装Mysql,MySQLAB提供了以下RPM包的下载地址:

MySQL-MySQL服务器。你需要该选项,除非你只想连接运行在另一台机器上的MySQL服务器。

MySQL-client-MySQL客户端程序,用于连接并操作Mysql服务器。MySQL-devel-库和包含文件,如果你想要编译其它MySQL客户端,例如Perl模块,则需要安装该RPM包。

MySQL-shared-该软件包包含某些语言和应用程序需要动态装载的共享*,使用MySQL

MySQL-bench-MySQL数据库服务器的基准和性能测试工具。
接下来我们在Centos系统下使用yum命令安装MySql检测系统是否自带安装mysql:rpm-qa|grepmysql
如果你系统有安装,那可以选择进行卸载:rpm-emysql

mysqld_safe&
如果你想关闭目前运行的MySQL服务器,你可以执行以下命令:root@host#cd/usr/bin
./mysqladmin-uroot-pshutdownEnterpassword:******

MySQL用户设置
如果你需要添加MySQL用户,你只需要在mysql数据库中的user表添加新用户即可。
以下为添加用户的的实例,用户名为guest,密码为guest123,并授权用户可进SELECT,INSERTUPDATE操作权限:root@host#mysql-uroot-pEnterpassword:*******mysql>usemysql;Databasechanged
mysql>INSERTINTOuser(host,user,password,
select_priv,insert_priv,update_privVALUES('localhost','guest',PASSWORD('guest123','Y','Y','Y';QueryOK,1rowaffectedsec


mysql>FLUSHPRIVILEGES;QueryOK,1rowaffectedsec
mysql>SELECThost,user,passwordFROMuserWHEREuser='guest';+-----------+---------+------------------+
|host|user|password|+-----------+---------+------------------+|localhost|guest|6f8c114b58f2ce9e|+-----------+---------+------------------+1rowinsetsec
在添加用户时,请注意使用MySQL提供的PASSWORD(函数来对密码进行加密。你可以在以上实例看到用户密码加密后为:6f8c114b58f2ce9e.注意:user表的password已换成了authentication_string注意:在注意需要执行FLUSHPRIVILEGES语句。这个命令执行后会重新载入授权表。
如果你不使用该命令,你就无法使用新创建的用户来连接mysql服务器,除非你重启mysql服务器。
你可以在创建用户时,为用户指定权限,在对应的权限列中,在插入语句中设置'Y'即可,用户权限列表如下:

Select_privInsert_privUpdate_privDelete_priv


Create_privDrop_privReload_privShutdown_privProcess_privFile_privGrant_privReferences_privIndex_privAlter_priv
另外一种添加用户的方法为通过SQLGRANT命令,你下命令会给指定数据库TUTORIALS添加用户zara,密码为zara123root@host#mysql-uroot-ppassword;Enterpassword:*******mysql>usemysql;Databasechanged
mysql>GRANTSELECT,INSERT,UPDATE,DELETE,CREATE,DROP->ONTUTORIALS.*->TO'zara'@'localhost'->IDENTIFIEDBY'zara123';
以上命令会在mysql数据库中的user表创建一条用户信息记录。注意:MySQLSQL语句以分号(;作为结束标识。


/etc/文件配置
一般情况下,你不需要修改该配置文件,该文件默认配置如下:[mysqld]
datadir=/var/lib/mysqlsocket=/var/lib/mysql/[]
user=mysqlbasedir=/var/lib
[safe_mysqld]err-log=/var/log/pid-file=/var/run/mysqld/
在配置文件中,你可以指定不同的错误日志文件存放的目录,一般你不需要改动这些配置。

管理MySQL的命令
以下列出了使用Mysql数据库过程中常用的命令:

USE数据库名:
选择要操作的Mysql数据库,使用该命令后所有Mysql命令都只针对该数据库。

mysql>useRUNOOB;Databasechanged


SHOWDATABASES:
列出MySQL数据库管理系统的数据库列表。mysql>SHOWDATABASES;+--------------------+|Database|+--------------------+|information_schema||RUNOOB||cdcol||mysql||onethink||performance_schema||phpmyadmin||test||wecenter||wordpress|+--------------------+10rowsinsetsec

SHOWTABLES:
显示指定数据库的所有表,使用该命令前需要使用use命令来选择要操作的数据库。

mysql>useRUNOOB;Databasechangedmysql>SHOWTABLES;+------------------+|Tables_in_runoob|


+------------------+|employee_tbl||runoob_tbl||tcount_tbl|+------------------+3rowsinsetsec

SHOWCOLUMNSFROM数据表:
显示数据表的属性,属性类型,主键信息,是否为NULL,默认值等其他信息。

mysql>SHOWCOLUMNSFROMrunoob_tbl;+-----------------+--------------+------+-----+---------+-------+
|Field|Type|Null|Key|Default|Extra|+-----------------+--------------+------+-----+---------+-------+
|runoob_id|int(11|NO|PRI|NULL|||runoob_title|varchar(255|YES||NULL|||runoob_author|varchar(255|YES||NULL|||submission_date|date|YES||NULL||+-----------------+--------------+------+-----+---------+-------+4rowsinsetsec

SHOWINDEXFROM数据表:
显示数据表的详细索引信息,包括PRIMARYKEY(主键)。mysql>SHOWINDEXFROMrunoob_tbl;
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+


|Table|Non_unique|Key_name|Seq_in_index|Column_name|Collation|Cardinality|Sub_part|Packed|Null|Index_type|Comment|Index_comment|

+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

|runoob_tbl|0|PRIMARY|1|runoob_id|A|2|NULL|NULL||BTREE|||

+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+1rowinsetsec

SHOWTABLESTATUSLIKE[FROMdb_name][LIKE'pattern']\G:该命令将输出Mysql数据库管理系统的性能及统计信息。mysql>SHOWTABLESTATUSFROMRUNOOB;#显示数据库RUNOOB中所有表的信息


mysql>SHOWTABLESTATUSfromRUNOOBLIKE'runoob%';#表名runoob开头的表的信息
mysql>SHOWTABLESTATUSfromRUNOOBLIKE'runoob%'\G;#加上\G,查询结果按列打印
Gif图演示:

MySQL安装MySQLPHP语法
笔记列表
1.oocarain
记录MySQL学习过程遇到的问题。系统:win32

MySQL版本:
MySQL语法对大小写不敏感,但是大写更容易看出。一、启动关闭MySQL服务
1【开始菜单】搜索打开windows【服务管理器】,可以在此开启关闭MySQL服务。
2cmd中使用命令:netstartmysql#启动mysql服务netstopmysql#关闭mysql服务遇到net命令无法识别,如下:
这是环境变量没有配置的原因,究竟是哪一个文件的环境变量没有配置呢C:\windows\system32\这个路径下的没有配置环境变量现切换到这个路径下试一下可不可以使用net命令:Powershell需要使用.\netstopmysql关闭服务。
cmd中可以直接使用netstartmysql启动服务。

c:\windows\system32添加到系统的Path中后:成功!!!oocarainoocarain
5个月前(03-062.一条鱼
参考地址
insert添加用户时,可能会报错:
ERROR1364(HY000:Field'ssl_cipher'doesn'thaveadefaultvalue中有一条语句:
指定了严格模式,为了安全,严格模式禁止通过insert这种形式直接修mysql库中的user表进行添加新用户
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLESSTRICT_TRANS_TABLES删掉之后即可使用insert添加


MySQL连接

使用mysql二进制方式连接
您可以使用MySQL二进制方式进入到mysql命令提示符下来连接MySQL数据库。
实例
以下是从命令行中连接mysql服务器的简单实例:[root@host]#mysql-uroot-pEnterpassword:******
在登录成功后会出现mysql>命令提示窗口,你可以在上面执行任何SQL语句。以上命令执行后,登录成功输出结果如下:
WelcometotheMySQLmonitor.Commandsendwith;or\g.
YourMySQLconnectionidis2854760toserverversion:'help;'or'\h'forhelp.Type'\c'toclearthebuffer.
在以上实例中,我们使用了root用户登录到mysql服务器,当然你也可以使用其他mysql用户登录。
如果用户权限足够,任何用户都可以在mysql的命令提示窗口中进行SQL操作。退出mysql>命令提示窗口可以使用exit命令,如下所示:mysql>exitBye


使用PHP脚本连接MySQL
PHP提供了mysqli_connect(函数来连接数据库。
该函数有6个参数,在成功链接到MySQL后返回连接标识,失败返回FALSE
语法
mysqli_connect(host,username,password,dbname,port,socket;参数说明:
参数hostusernamepassworddbnameportsocket
描述
可选。规定主机名或IP地址。可选。规定MySQL用户名。可选。规定MySQL密码。可选。规定默认使用的数据库。
可选。规定尝试连接到MySQL服务器的端口号。可选。规定socket或要使用的已命名pipe
你可以使用PHPmysqli_close(函数来断开与MySQL数据库的链接。该函数只有一个参数为mysqli_connect(函数创建连接成功后返回的MySQL连接标识符。
语法
boolmysqli_close(mysqli$link

本函数关闭指定的连接标识所关联的到MySQL服务器的非持久连接。如果没有指定link_identifier,则关闭上一个打开的连接。
提示:通常不需要使用mysqli_close(,因为已打开的非持久连接会在脚本执行完毕后自动关闭。
实例
你可以尝试以下实例来连接到你的MySQL服务器:
连接MySQL
$dbhost='localhost:3306';mysqli_error(;}echo'';mysqli_close($conn;>
MySQL创建数据库

使用mysqladmin创建数据库
使用普通用户,你可能需要特定的权限来创建或者删除MySQL数据库。所以我们这边使用root用户登录,root用户拥有最高权限,可以使用mysqlmysqladmin命令来创建数据库。
实例
以下命令简单的演示了创建数据库的过程,数据名为RUNOOB:[root@host]#mysqladmin-uroot-pcreateRUNOOB

Enterpassword:******
以上命令执行成功后会创建MySQL数据库RUNOOB

使用PHP脚本创建数据库
PHP使用mysqli_query函数来创建或者删除MySQL数据库。该函数有两个参数,在执行成功时返回TRUE,否则返回FALSE
语法
mysqli_query(connection,query,resultmode;
参数connectionquery
描述
必需。规定要使用的MySQL连接。必需,规定查询字符串。
可选。一个常量。可以是下列值中的任意一个:
resultmode
MYSQLI_USE_RESULT(如果需要检索大量数据,请使用这个)MYSQLI_STORE_RESULT(默认)
实例
以下实例演示了使用PHP来创建一个数据库:
创建数据库
连接成功
';$sql='CREATEDATABASERUNOOB';$retval=mysqli_query($conn,$sql;if(!$retval{die('创建数据库失败:'.

mysqli_error($conn;}echo"数据库RUNOOB创建成功\n";mysqli_close($conn;>
执行成功后,返回如下结果:

如果数据库已存在,执行后,返回如下结果:

MySQL删除数据库

使用mysqladmin删除数据库
使用普通用户登陆mysql服务器,你可能需要特定的权限来创建或者删除MySQL数据库。
所以我们这边使用root用户登录,root用户拥有最高权限,可以使用mysqlmysqladmin命令来创建数据库。
在删除数据库过程中,务必要十分谨慎,因为在执行删除命令后,所有数据将会消失。
以下实例删除数据库RUNOOB(该数据库在前一章节已创建[root@host]#mysqladmin-uroot-pdropRUNOOBEnterpassword:******
执行以上删除数据库命令后,会出现一个提示框,来确认是否真的删除数据库:

Droppingthedatabaseispotentiallyaverybadthingtodo.Anydatastoredinthedatabasewillbedestroyed.
Doyoureallywanttodropthe'RUNOOB'database[y/N]yDatabase"RUNOOB"dropped

使用PHP脚本删除数据库
PHP使用mysqli_query函数来创建或者删除MySQL数据库。该函数有两个参数,在执行成功时返回TRUE,否则返回FALSE
语法
mysqli_query(connection,query,resultmode;
参数connectionquery
描述
必需。规定要使用的MySQL连接。必需,规定查询字符串。
可选。一个常量。可以是下列值中的任意一个:
resultmode
MYSQLI_USE_RESULT(如果需要检索大量数据,请使用这个)MYSQLI_STORE_RESULT(默认)
实例
以下实例演示了使用PHPmysqli_query函数来删除数据库:
删除数据库

$dbhost='localhost:3306';mysqli_error($conn;}echo'连接成功/>';$sql='DROPDATABASERUNOOB';$retval=mysqli_query($conn,$sql;if(!$retval{die('删除数据库失败:'.mysqli_error($conn;}echo"数据库RUNOOB删除成功\n";mysqli_close($conn;>
执行成功后,数结果为:

注意:在使用PHP脚本删除数据库时,不会出现确认是否删除信息,会直接删除指定数据库,所以你在删除数据库时要特别小心。

MySQL选择数据库
在你连接到MySQL数据库后,可能有多个可以操作的数据库,所以你需要选择你要操作的数据库。

从命令提示窗口中选择MySQL数据库
mysql>提示窗口中可以很简单的选择特定的数据库。你可以使用SQL命令来选择指定的数据库。
实例
以下实例选取了数据库RUNOOB:[root@host]#mysql-uroot-p

Enterpassword:******mysql>useRUNOOB;Databasechangedmysql>
执行以上命令后,你就已经成功选择了RUNOOB数据库,在后续的操作中都会RUNOOB数据库中执行。
注意:所有的数据库名,表名,表字段都是区分大小写的。所以你在使用SQL令时需要输入正确的名称。

使用PHP脚本选择MySQL数据库
PHP提供了函数mysqli_select_db来选取一个数据库。函数在执行成功后返回TRUE,否则返回FALSE
语法
mysqli_select_db(connection,dbname;
参数
描述
connection必需。规定要使用的MySQL连接。dbname必需,规定要使用的默认数据库。
实例
以下实例展示了如何使用mysqli_select_db函数来选取一个数据库:
删除数据库

$dbhost='localhost:3306';mysqli_error($conn;}echo'';mysqli_select_db($conn,'RUNOOB';mysqli_close($conn;>
MySQL数据类型
MySQL中定义数据字段的类型对你数据库的优化是非常重要的。
MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符型。

数值类型
MySQL支持所有标准SQL数值数据类型。
这些类型包括严格数值数据类型(INTEGERSMALLINTDECIMALNUMERIC以及近似数值数据类型(FLOATREALDOUBLEPRECISION关键字INTINTEGER的同义词,关键字DECDECIMAL的同义词。
BIT数据类型保存位字段值,并且支持MyISAMMEMORYInnoDBBDB表。作为SQL标准的扩展,MySQL也支持整数类型TINYINTMEDIUMINTBIGINT下面的表显示了需要的每个整数类型的存储和范围。
类型TINYINT
大小1字节
范围(有符号)范围(无符号)用途
小整数
(-128127
(0255
大整数
SMALLINT2字节(-3276832767(065535


MEDIUMINT3字节INTINTEGER
(-83886088388607
(-21474836482147483647(-9233372036854
BIGINT
8字节
7758089223372036854775807823466E+38494
FLOAT
4字节
351E-3804940494351E-38351E-38823466823466E+38351E+386931348623157E+308073858507
DOUBLE8字节
2014E-30800738585072014E-3086931348623157E+308

DECIMAL
DECIMAL(M,D如果M>DM+2否则为D+2

依赖于MD的值赖于MD的值数值
0073858507201双精度4E-308693134浮点数8623157E+308
大整数
(016777215
大整数
(04294967295

4字节
(018446744073极大整709551615
数值
单精度浮点数
日期和时间类型
表示时间值的日期和时间类型为DATETIMEDATETIMESTAMPTIMEYEAR

每个时间类型有一个有效值范围和一个""值,当指定不合法的MySQL不能表示的值时使用""值。
TIMESTAMP类型有专有的自动更新特性,将在后面描述。
大小
类型
(字节
DATETIMEYEAR
331
1000-01-01/9999-12-31'-838:59:59'/'838:59:59'1901/21551000-01-01
YYYY-MM-DD日期值
时间值或持续
HH:MM:SS
时间
YYYY
年份值
范围
格式
用途
DATETIME8
YYYY-MM-DD混合日期和时
间值混合日期和时间值,时间戳

00:00:00/9999-12-3123:59:59HH:MM:SS1970-01-0100:00:00/2037YYYYMMDD某时
HHMMSS
TIMESTAMP4
字符串类型
字符串类型指CHARVARCHARBINARYVARBINARYBLOBTEXTENUMSET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。
类型CHARVARCHARTINYBLOBTINYTEXT
大小
0-255字节0-65535字节0-255字节0-255字节
定长字符串变长字符串
不超过255个字符的二进制字符串短文本字符串
用途

BLOBTEXT
0-65535字节0-65535字节
二进制形式的长文本数据长文本数据
MEDIUMBLOB0-16777215字节二进制形式的中等长度文本数据MEDIUMTEXT0-16777215字节中等长度文本数据LONGBLOB
0-4294967295
LONGTEXT
0-4294967295
二进制形式的极大文本数据
极大文本数据
CHARVARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。BINARYVARBINARY类类似于CHARVARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。BLOB是一个二进制大对象,可以容纳可变数量的数据。有4BLOB类型:TINYBLOBBLOBMEDIUMBLOBLONGBLOB。它们只是可容纳值的最大长度不同。
4TEXT类型:TINYTEXTTEXTMEDIUMTEXTLONGTEXT。这些对应4BLOB类型,有相同的最大长度和存储需求。

MySQL创建数据表
创建MySQL数据表需要以下信息:

表名表字段名定义每个表字段
语法
以下为创建MySQL数据表的SQL通用语法:
CREATETABLEtable_name(column_namecolumn_type;
以下例子中我们将在RUNOOB数据库中创建数据表runoob_tblCREATETABLEIFNOTEXISTS`runoob_tbl`(`runoob_id`INTUNSIGNEDAUTO_INCREMENT,`runoob_title`VARCHAR(100NOTNULL,`runoob_author`VARCHAR(40NOTNULL,`submission_date`DATE,PRIMARYKEY(`runoob_id`
ENGINE=InnoDBDEFAULTCHARSET=utf8;实例解析:
如果你不想字段为NULL可以设置字段的属性为NOTNULL在操作数据库时如果
输入该字段的数据为NULL,就会报错。
AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1PRIMARYKEY关键字用于定义列为主键。您可以使用多列来定义主键,列间以逗号
分隔。
ENGINE设置存储引擎,CHARSET设置编码。


通过命令提示符创建表
通过mysql>命令窗口可以很简单的创建MySQL数据表。你可以使用SQL语句CREATETABLE来创建数据表。
实例
以下为创建数据表runoob_tbl实例:root@host#mysql-uroot-pEnterpassword:*******mysql>useRUNOOB;Databasechanged
mysql>CREATETABLErunoob_tbl(
->runoob_idINTNOTNULLAUTO_INCREMENT,->runoob_titleVARCHAR(100NOTNULL,->runoob_authorVARCHAR(40NOTNULL,->submission_dateDATE,->PRIMARYKEY(runoob_id
->ENGINE=InnoDBDEFAULTCHARSET=utf8;QueryOK,0rowsaffectedsecmysql>
注意:MySQL命令终止符为分号(;

使用PHP脚本创建数据表
你可以使用PHPmysqli_query(函数来创建已存在数据库的数据表。

该函数有两个参数,在执行成功时返回TRUE,否则返回FALSE
语法
mysqli_query(connection,query,resultmode;
参数connectionquery
描述
必需。规定要使用的MySQL连接。必需,规定查询字符串。
可选。一个常量。可以是下列值中的任意一个:
resultmode
MYSQLI_USE_RESULT(如果需要检索大量数据,请使用这个)MYSQLI_STORE_RESULT(默认)
实例
以下实例使用了PHP脚本来创建数据表:
创建数据表
连接成功
';$sql="CREATETABLErunoob_tbl("."runoob_idINTNOTNULLAUTO_INCREMENT,"."runoob_titleVARCHAR(100NOTNULL,"."runoob_authorVARCHAR(40NOTNULL,"."submission_dateDATE,".
"PRIMARY
KEY
(
runoob_id
ENGINE=InnoDB
DEFAULT
CHARSET=utf8;
";
mysqli_select_db($conn,'RUNOOB';$retval=mysqli_query($conn,$sql;if(!$retval{die('据表创建失败:'.mysqli_error($conn;}echo"数据表创建成功\n";mysqli_close($conn;>
执行成功后,就可以通过命令行查看表结构:


MySQL删除数据表
MySQL中删除数据表是非常容易操作的,但是你再进行删除表操作时要非常小心,因为执行删除命令后所有数据都会消失。
语法
以下为删除MySQL数据表的通用语法:DROPTABLEtable_name;

在命令提示窗口中删除数据表
mysql>命令提示窗口中删除数据表SQL语句为DROPTABLE
实例
以下实例删除了数据表runoob_tbl:

root@host#mysql-uroot-pEnterpassword:*******mysql>useRUNOOB;Databasechanged
mysql>DROPTABLErunoob_tblQueryOK,0rowsaffectedsecmysql>

使用PHP脚本删除数据表
PHP使用mysqli_query函数来删除MySQL数据表。
该函数有两个参数,在执行成功时返回TRUE,否则返回FALSE
h3>语法
mysqli_query(connection,query,resultmode;
参数connectionquery
描述
必需。规定要使用的MySQL连接。必需,规定查询字符串。
可选。一个常量。可以是下列值中的任意一个:
resultmode
MYSQLI_USE_RESULT(如果需要检索大量数据,请使用这个)MYSQLI_STORE_RESULT(默认)
实例
以下实例使用了PHP脚本删除数据表runoob_tbl:

删除数据库
$dbhost='localhost:3306';mysqli_error($conn;}echo'连接成功/>';$sql="DROPTABLErunoob_tbl";mysqli_select_db($conn,'RUNOOB';$retval=mysqli_query($conn,$sql;if(!$retval{die('数据表删除失败:'.mysqli_error($conn;}echo"数据表删除成功\n";mysqli_close($conn;>
执行成功后,我们使用以下命令,就看不到runoob_tbl表了:mysql>showtables;Emptysetsec

MySQL插入数据
MySQL表中使用INSERTINTOSQL语句来插入数据。
你可以通过mysql>命令提示窗口中向数据表中插入数据,或者通过PHP脚本来插入数据。
语法
以下为向MySQL数据表插入数据通用的INSERTINTOSQL语法:INSERTINTOtable_name(field1,field2,...fieldNVALUES
(value1,value2,...valueN;
如果数据是字符型,必须使用单引号或者双引号,如:"value"


通过命令提示窗口插入数据
以下我们将使用SQLINSERTINTO语句向MySQL数据表runoob_tbl插入数
实例
以下实例中我们将向runoob_tbl表插入三条数据:root@host#mysql-uroot-ppassword;Enterpassword:*******mysql>useRUNOOB;Databasechanged
mysql>INSERTINTOrunoob_tbl
->(runoob_title,runoob_author,submission_date->VALUES
->("学习PHP","菜鸟教程",NOW(;QueryOK,1rowsaffected,1warningssecmysql>INSERTINTOrunoob_tbl
->(runoob_title,runoob_author,submission_date->VALUES
->("学习MySQL","菜鸟教程",NOW(;QueryOK,1rowsaffected,1warningssecmysql>INSERTINTOrunoob_tbl
->(runoob_title,runoob_author,submission_date->VALUES
->("JAVA教程","",'2016-05-06';QueryOK,1rowsaffectedsec

mysql>
注意:使用箭头标记->不是SQL语句的一部分,它仅仅表示一个新行,如果一条SQL语句太长,我们可以通过回车键来创建一个新行来编写SQL语句,SQL语句的命令结束符为分号;
在以上实例中,我们并没有提供runoob_id的数据,因为该字段我们在创建表的时候已经设置它为AUTO_INCREMENT(自动增加属性。所以,该字段会自动递增而不需要我们去设置。实例中NOW(是一个MySQL函数,该函数返回日期和时间。
接下来我们可以通过以下语句查看数据表数据:
读取数据表:
select*fromrunoob_tbl;
输出结果:


使用PHP脚本插入数据
你可以使用PHPmysqli_query(函数来执行SQLINSERTINTO命令来插入数据。
该函数有两个参数,在执行成功时返回TRUE,否则返回FALSE

语法
mysqli_query(connection,query,resultmode;
参数connectionquery
描述
必需。规定要使用的MySQL连接。必需,规定查询字符串。
可选。一个常量。可以是下列值中的任意一个:
resultmode
MYSQLI_USE_RESULT(如果需要检索大量数据,请使用这个)MYSQLI_STORE_RESULT(默认)
实例
以下实例中程序接收用户输入的三个字段数据,并插入数据表中:
添加数据
$dbhost='localhost:3306';mysqli_error($conn;}echo'/>';"(runoob_title,runoob_author,
submission_date
".
"VALUES
".
"('$runoob_title','$runoob_author','$submission_date'";mysqli_select_db($conn,'RUNOOB';$retval=mysqli_query($conn,$sql;if(!$retval{die('无法插入数据:'.mysqli_error($conn;}echo"数据插入成功\n";mysqli_close($conn;>
对于含有中文的数据插入,需要添加mysqli_query($conn,"setnamesutf8";句。
接下来我们可以通过以下语句查看数据表数据:
读取数据表:

select*fromrunoob_tbl;
输出结果:


MySQL查询数据
MySQL数据库使用SQLSELECT语句来查询数据。
你可以通过mysql>命令提示窗口中在数据库中查询数据,或者通过PHP脚本来查询数据。
语法
以下为在MySQL数据库中查询数据通用的SELECT语法:SELECTcolumn_name,column_nameFROMtable_name[WHEREClause][OFFSETM][LIMITN]
查询语句中你可以使用一个或者多个表,表之间使用逗号(,分割,并使用WHERE
句来设定查询条件。
SELECT命令可以读取一条或者多条记录。

你可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据你可以使用WHERE语句来包含任何条件。
你可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为
0
你可以使用LIMIT属性来设定返回的记录数。

通过命令提示符获取数据
以下实例我们将通过SQLSELECT命令来获取MySQL数据表runoob_tbl的数据:
实例
以下实例将返回数据表runoob_tbl的所有记录:
读取数据表:
select*fromrunoob_tbl;
输出结果:

使用PHP脚本来获取数据

使用PHP函数的mysqli_query(SQLSELECT命令来获取数据。
该函数用于执行SQL命令,然后通过PHP函数mysqli_fetch_array(来使用或输出所有查询的数据。
mysqli_fetch_array(函数从结果集中取得一行作为关联数组,或数字数组,或二者兼有返回根据从结果集取得的行生成的数组,如果没有更多行则返回false以下实例为从数据表runoob_tbl中读取所有记录。
实例
尝试以下实例来显示数据表runoob_tbl的所有记录。
使用mysqli_fetch_arrayMYSQL_ASSOC参数获取数据:
菜鸟教程mysqli_fetch_array测试

';echo'border="1">教程ID标题';while($row=mysqli_fetch_array($retval,MYSQL_ASSOC{echo"{$row['runoob_id']}"."{$row['runoob_title']}"."{$row['runoob_author']}"."{$row['submission_date']}"."";}echo'';mysqli_close($conn;>
输出结果如下所示:


以上实例中,读取的每行记录赋值给变量$row,然后再打印出每个值。注意:记住如果你需要在字符串中使用变量,请将变量置于花括号。
在上面的例子中,PHPmysqli_fetch_array(函数第二个参数为MYSQL_ASSOC设置该参数查询结果返回关联数组,你可以使用字段名称来作为数组的索引。PHP提供了另外一个函数mysqli_fetch_assoc(,该函数从结果集中取得一行作为关联数组。返回根据从结果集取得的行生成的关联数组,如果没有更多行,则返回false
实例
尝试以下实例,该实例使用了mysqli_fetch_assoc(函数来输出数据表runoob_tbl的所有记录:
使用mysqli_fetch_assoc获取数据:
菜鸟教程mysqli_fetch_assoc测试

';echo'border="1">教程ID标题作者提交日期';while($row=mysqli_fetch_assoc($retval{echo"
{$row['runoob_id']}
".
"{$row['runoob_title']}

".
"{$row['runoob_author']}"."{$row['submission_date']}"."";}echo

'';mysqli_close($conn;>
输出结果如下所示:

你也可以使用常量MYSQL_NUM作为PHPmysqli_fetch_array(函数的第二个参数,返回数字数组。
实例
以下实例使用MYSQL_NUM参数显示数据表runoob_tbl的所有记录:
使用mysqli_fetch_arrayMYSQL_NUM参数获取数据:
菜鸟教程mysqli_fetch_array测试

';echo'border="1">教程ID标题';while($row=mysqli_fetch_array($retval,MYSQL_NUM{echo"{$row[0]}"."{$row[1]}"."{$row[2]}"."{$row[3]}"."";}echo'';mysqli_close($conn;>
输出结果如下所示:


以上三个实例输出结果都一样。

内存释放
在我们执行完SELECT语句后,释放游标内存是一个很好的习惯。可以通过PHP函数mysqli_free_result(来实现内存的释放。以下实例演示了该函数的使用方法。
实例
尝试以下实例:
使用mysqli_free_result释放内存:
echo'

菜鸟教程mysqli_fetch_array测试

';echo'
border="1">教程ID标题作者提交日期';while($row=mysqli_fetch_array($retval,MYSQL_NUM{echo"{$row[0]}"."{$row[1]}"."{$row[2]}"."{$row[3]}"."";}echo'';

.fieldNFROM
table_name1,table_name2...
[WHEREcondition1[AND[OR]]condition2.....
查询语句中你可以使用一个或者多个表,表之间使用逗号,分割,并使用WHERE
句来设定查询条件。
你可以在WHERE子句中指定任何条件。
你可以使用AND或者OR指定一个或多个条件。
WHERE子句也可以运用于SQLDELETE或者UPDATE命令。
WHERE子句类似于程序语言中的if条件,根据MySQL表中的字段值来读取指定
的数据。
以下为操作符列表,可用于WHERE子句中。下表中实例假定A10,B20
操作符
描述
等号,检测两个值是否相等,如果相等返
=
true
不等于,检测两个值是否相等,如果不相
<>,!=
等返回true
(A!=B返回true(A=B返回false
实例
>大于号,检测左边的值是否大于右边的(A>B返回false

,如果左边的值大于右边的值返回true
小于号,检测左边的值是否小于右边的
<
,如果左边的值小于右边的值返回(A返回truetrue
大于等于号,检测左边的值是否大于或等
>=
于右边的值,如果左边的值大于或等于(A>=B返回false右边的值返回true
小于等于号,检测左边的值是否小于于或
<=
等于右边的值,如果左边的值小于或等(A<=B返回true于右边的值返回true
如果我们想再MySQL数据表中读取指定的数据,WHERE子句是非常有用的。使用主键来作为WHERE子句的条件查询是非常快速的。
如果给定的条件在表中没有任何匹配的记录,那么查询不会返回任何数据。

从命令提示符中读取数据
我们将在SQLSELECT语句使用WHERE子句来读取MySQL数据表runoob_tbl的数据:实例
以下实例将读取runoob_tbl表中runoob_author字段值为Sanjay的所有记录:

SQLSELECTWHERE子句
SELECT*fromrunoob_tblWHERErunoob_author='菜鸟教程';
输出结果:

MySQLWHERE子句的字符串比较是不区分大小写的。你可以使用BINARY关键字来设定WHERE子句的字符串比较是区分大小写的。如下实例:
BINARY关键字
mysql>SELECT*fromrunoob_tblWHEREBINARYrunoob_author='';Emptysetsecmysql>SELECT
*
from
runoob_tbl
WHERE
BINARY
runoob_author='';
+-----------+---------------+---------------+-----------------+|runoob_id|runoob_title|runoob_author|submission_date|+-----------+---------------+---------------+-----------------+|3|JAVA教程||2016-05-06
|
|
4
|



Python
|

|
2016-03-06
|
+-----------+---------------+---------------+-----------------+2rowsinsetsec
实例中使用了BINARY关键字,是区分大小写的,所以runoob_author=''的查询条件是没有数据的。

使用PHP脚本读取数据

你可以使用PHP函数的mysqli_query(及相同的SQLSELECT带上WHERE句的命令来获取数据。
该函数用于执行SQL命令,然后通过PHP函数mysqli_fetch_array(来输出所有查询的数据。
实例
以下实例将从runoob_tbl表中返回使用runoob_author字段值为的记录:
MySQLWHERE子句测试:
echo'

菜鸟教程MySQLWHERE子句测试

';echo'
border="1">教程ID标题作者提交日期';while($row=mysqli_fetch_array($retval,MYSQL_ASSOC{echo"{$row['runoob_id']}"."{$row['runoob_title']}"."{$row['runoob_author']}"."{$row['submission_date']}"."";}echo'';

语法
以下是UPDATE命令修改MySQL数据表数据的通用SQL语法:UPDATEtable_nameSETfield1=new-value1,field2=new-value2

[WHEREClause]
你可以同时更新一个或多个字段。你可以在WHERE子句中指定任何条件。你可以在一个单独表中同时更新数据。
当你需要更新数据表中指定行的数据时WHERE子句是非常有用的。

通过命令提示符更新数据
以下我们将在SQLUPDATE命令使用WHERE子句来更新runoob_tbl表中指定的数据:
实例
以下实例将更新数据表中runoob_id3runoob_title字段值:
SQLUPDATE语句:
mysql>UPDATErunoob_tblSETrunoob_title='学习C++'WHERErunoob_id=3;QueryOK,1rowsaffected
sec
mysql>
SELECT
*
from
runoob_tbl
WHERE
runoob_id=3;
+-----------+--------------+---------------+-----------------+|runoob_id|runoob_title|runoob_author|submission_date|+-----------+--------------+---------------+-----------------+|3|学习C++||2016-05-06|+-----------+--------------+---------------+-----------------+1rowsinsetsec
从结果上看,runoob_id3runoob_title已被修改。

使用PHP脚本更新数据

PHP中使用函数mysqli_query(来执行SQL语句,你可以在SQLUPDATE语句中使用或者不使用WHERE子句。
注意:不使用WHERE子句将数据表的全部数据进行更新,所以要慎重。该函数与在mysql>命令提示符中执行SQL语句的效果是一样的。
实例
以下实例将更新runoob_id3runoob_title字段的数据。
MySQLUPDATE语句测试:
数据更新成功!';mysqli_close($conn;>MySQLWHERE子句MySQLDELETE语句
笔记列表
1.General
update语句可用来修改表中的数据,简单来说基本的使用形式为:update表名称set列名称=新值where更新条件;以下是在表students中的实例:
id5的手机号改为默认的-:updatestudentssettel=defaultwhereid=5;

将所有人的年龄增加1:updatestudentssetage=age+1;
将手机号为的姓名改为"小明",年龄改为19:updatestudentssetname="小明",age=19wheretel="";

MySQLDELETE语句
你可以使用SQLDELETEFROM命令来删除MySQL数据表中的记录。你可以在mysql>命令提示符或PHP脚本中执行该命令。
语法
以下是SQLDELETE语句从MySQL数据表中删除数据的通用语法:DELETEFROMtable_name[WHEREClause]
如果没有指定WHERE子句,MySQL表中的所有记录将被删除。你可以在WHERE子句中指定任何条件您可以在单个表中一次性删除记录。
当你想删除数据表中指定的记录时WHERE子句是非常有用的。

从命令行中删除数据
这里我们将在SQLDELETE命令中使用WHERE子句来删除MySQL数据表runoob_tbl所选的数据。

实例
以下实例将删除runoob_tbl表中runoob_id3的记录:
SQLUPDATE语句:
mysql>useRUNOOB;Databasechangedmysql>DELETEFROMrunoob_tblWHERErunoob_id=3;QueryOK,1rowaffectedsec

使用PHP脚本删除数据
PHP使用mysqli_query(函数来执行SQL语句,你可以在SQLDELETE命令中使用或不使用WHERE子句。
该函数与mysql>命令符执行SQL命令的效果是一样的。
实例
以下PHP实例将删除runoob_tbl表中runoob_id3的记录:
MySQLDELETE子句测试:
数据删除成功!';mysqli_close($conn;>MySQLUPDATE查询MySQLLIKE子句
笔记列表
1.General


delete语句用于删除表中的数据,基本用法为:deletefrom表名称where删除条件;以下是在表students中的实例:
删除id3的行:deletefromstudentswhereid=3;
删除所有年龄小于21岁的数据:deletefromstudentswhereage<20;删除表中的所有数据:deletefromstudents;

MySQLLIKE子句
我们知道在MySQL中使用SQLSELECT命令来读取数据,同时我们可以在SELECT语句中使用WHERE子句来获取指定的记录。
WHERE子句中可以使用等号=来设定获取数据的条件,如"runoob_author=''"
但是有时候我们需要获取runoob_author字段含有"COM"字符的所有记录,这时我们就需要在WHERE子句中使用SQLLIKE子句。
SQLLIKE子句中使用百分号%字符来表示任意字符,类似于UNIX或正则表达式中的星号*
如果没有使用百分号%,LIKE子句与等号=的效果是一样的。

语法
以下是SQLSELECT语句使用LIKE子句从数据表中读取数据的通用语法:SELECTfield1,field2,...fieldNFROMtable_name
WHEREfield1LIKEcondition1[AND[OR]]filed2='somevalue'
你可以在WHERE子句中指定任何条件。你可以在WHERE子句中使用LIKE子句。你可以使用LIKE子句代替等号=
LIKE通常与%一同使用,类似于一个元字符的搜索。你可以使用AND或者OR指定一个或多个条件。
你可以在DELETEUPDATE命令中使用WHERE...LIKE子句来指定条件。

在命令提示符中使用LIKE子句
以下我们将在SQLSELECT命令中使用WHERE...LIKE子句来从MySQL数据表runoob_tbl中读取数据。
实例
以下是我们将runoob_tbl表中获取runoob_author字段中以COM为结尾的的所有记录:
SQLUPDATE语句:
mysql>useRUNOOB;Databasechangedmysql>SELECT*fromrunoob_tblWHERErunoob_authorLIKE'%COM';+-----------+---------------+---------------+-----------------+|runoob_id|

runoob_title|runoob_author|submission_date|
+-----------+---------------+---------------+-----------------+|3|学习Java||2015-05-01||4|学习Python||2016-03-06|+-----------+---------------+---------------+-----------------+2rowsinsetsec

PHP脚本中使用LIKE子句
你可以使用PHP函数的mysqli_query(及相同的SQLSELECT带上WHERE...LIKE子句的命令来获取数据。
该函数用于执行SQL命令,然后通过PHP函数mysqli_fetch_assoc(来输出所有查询的数据。
但是如果是DELETE或者UPDATE中使用WHERE...LIKE子句的SQL语句,则无需使用mysqli_fetch_array(函数。
实例
以下是我们使用PHP脚本在runoob_tbl表中读取runoob_author字段中以COM为结尾的的所有记录:
MySQLDELETE子句测试:
菜鸟教程mysqli_fetch_array测试

';echo'border="1">教程ID标题';while($row=mysqli_fetch_array($retval,MYSQL_ASSOC{echo"{$row['runoob_id']}"."{$row['runoob_title']}"."{$row['runoob_author']}"."{$row['submission_date']}"."";}echo'';mysqli_close($conn;>

输出结果如下图所示:


MySQLUNION操作符
本教程为大家介绍MySQLUNION操作符的语法和实例。
描述
MySQLUNION操作符用于连接两个以上的SELECT语句的结果组合到一个结果集合中。多个SELECT语句会删除重复的数据。
语法
MySQLUNION操作符语法格式:
SELECTexpression1,expression2,...expression_nFROMtables[WHEREconditions]UNION[ALL|DISTINCT]
SELECTexpression1,expression2,...expression_nFROMtables[WHEREconditions];

参数

expression1,expression2,...expression_n:要检索的列。tables:要检索的数据表。
WHEREconditions:可选,检索条件。
DISTINCT:可选,删除结果集中重复的数据。默认情况下UNION操作符已经删除了重复数据,所以DISTINCT修饰符对结果没啥影响。

ALL:可选,返回所有结果集,包含重复数据。

演示数据库
在本教程中,我们将使用RUNOOB样本数据库。下面是选自"Websites"表的数据:mysql>SELECT*FROMWebsites;
+----+--------------+---------------------------+-------+---------+
|id|name|url|alexa|country|+----+--------------+---------------------------+-------+---------+|1|Google||1|USA||2|淘宝||13|CN||3|菜鸟教程||4689|CN||4|微博||20|CN||5|Facebook||3|USA||7|stackoverflow||0|IND|+----+---------------+---------------------------+-------+---------+下面是"apps"APP的数据:

mysql>SELECT*FROMapps;
+----+------------+-------------------------+---------+
|id|app_name|url|country|+----+------------+-------------------------+---------+|1|QQAPP||CN||2|微博APP||CN||3|淘宝APP||CN|+----+------------+-------------------------+---------+3rowsinsetsec


SQLUNION实例
下面的SQL语句从"Websites""apps"表中选取所有不同的country(只有不同的值):
实例
SELECTcountryFROMWebsitesUNION
SELECTcountryFROMappsORDERBYcountry;
执行以上SQL输出结果如下:


注释:UNION不能用于列出两个表中所有的country如果一些网站和APP来自同一个国家,每个国家只会列出一次。UNION只会选取不同的值。请使用UNIONALL来选取重复的值!

SQLUNIONALL实例
下面的SQL语句使用UNIONALL"Websites""apps"表中选取所有的country(也有重复的值):
实例
SELECTcountryFROMWebsitesUNIONALL
SELECTcountryFROMappsORDERBYcountry;
执行以上SQL输出结果如下:




带有WHERESQLUNIONALL
下面的SQL语句使用UNIONALL"Websites""apps"表中选取所有的(CN的数据(也有重复的值):
实例
SELECTcountry,nameFROMWebsitesWHEREcountry='CN'UNIONALL
SELECTcountry,app_nameFROMappsWHEREcountry='CN'ORDERBYcountry;
执行以上SQL输出结果如下:


MySQL排序
我们知道从MySQL表中使用SQLSELECT语句来读取数据。
如果我们需要对读取的数据进行排序,我们就可以使用MySQLORDERBY子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果。
语法
以下是SQLSELECT语句使用ORDERBY子句将查询数据排序后再返回数据:SELECTfield1,field2,...fieldNtable_name1,table_name2...

ORDERBYfield1,[field2...][ASC[DESC]]
你可以使用任何字段来作为排序的条件,从而返回排序后的查询结果。你可以设定多个字段来排序。
你可以使用ASCDESC关键字来设置查询结果是按升序或降序排列。默认情况
下,它是按升序排列。
你可以添加WHERE...LIKE子句来设置条件。

在命令提示符中使用ORDERBY子句
以下将在SQLSELECT语句中使用ORDERBY子句来读取MySQL数据表runoob_tbl中的数据:
实例
尝试以下实例,结果将按升序及降序排列。
SQL排序
mysql>useRUNOOB;Databasechangedmysql>SELECT*fromrunoob_tblORDERBYsubmission_dateASC;+-----------+---------------+---------------+-----------------+|runoob_id|runoob_title
|
runoob_author
|
submission_date
|
+-----------+---------------+---------------+-----------------+|3|学习Java||2015-05-01||4|学习Python||2016-03-06||1|学习PHP|菜鸟教程|2017-04-12||2|学习MySQL|鸟教程|2017-04-12|+-----------+---------------+---------------+-----------------+4rowsinsetsecmysql>
SELECT
*
from
runoob_tbl
ORDER
BY
submission_date
DESC;
+-----------+---------------+---------------+-----------------+|runoob_id|runoob_title|runoob_author|submission_date|+-----------+---------------+---------------+-----------------+|1|学习PHP|菜鸟教

|2017-04-12||2|学习MySQL|菜鸟教程|2017-04-12||4|学习Python||2016-03-06
|
|
3
|



Java
|

|
2015-05-01
|
+-----------+---------------+---------------+-----------------+4rowsinsetsec
读取runoob_tbl表中所有数据并按submission_date字段的升序排列。

PHP脚本中使用ORDERBY子句
你可以使用PHP函数的mysqli_query(及相同的SQLSELECT带上ORDERBY子句的命令来获取数据。
该函数用于执行SQL命令,然后通过PHP函数mysqli_fetch_array(来输出所有查询的数据。
实例
尝试以下实例,查询后的数据按submission_date字段的降序排列后返回。
MySQLORDERBY测试:
菜鸟教程MySQLORDERBY测试

';echo'border="1">教程ID标题';while($row=mysqli_fetch_array($retval,MYSQL_ASSOC{echo"{$row['runoob_id']}"."{$row['runoob_title']}"."{$row['runoob_author']}"."{$row['submission_date']}"."";}echo'';mysqli_close($conn;>
输出结果如下图所示:



MySQLGROUPBY语句
GROUPBY语句根据一个或多个列对结果集进行分组。在分组的列上我们可以使用COUNT,SUM,AVG,等函数。
GROUPBY语法
SELECTcolumn_name,function(column_nameFROMtable_name
WHEREcolumn_nameoperatorvalueGROUPBYcolumn_name;

实例演示
本章节实例使用到了以下表结构及数据,使用前我们可以先将以下数据导入数据库中。SETNAMESutf8;
SETFOREIGN_KEY_CHECKS=0;


------------------------------
--Tablestructurefor`employee_tbl`------------------------------
DROPTABLEIFEXISTS`employee_tbl`;CREATETABLE`employee_tbl`(`id`int(11NOTNULL,
`name`char(10NOTNULLDEFAULT'',`date`datetimeNOTNULL,
`singin`tinyint(4NOTNULLDEFAULT'0'COMMENT'登录次数',PRIMARYKEY(`id`
ENGINE=InnoDBDEFAULTCHARSET=utf8;
--------------------------------Recordsof`employee_tbl`------------------------------BEGIN;
INSERTINTO`employee_tbl`VALUES('1','小明','2016-04-2215:25:33','1',('2','','2016-04-2015:25:47','3',('3','小丽','2016-04-1915:26:02','2',('4','小王','2016-04-0715:26:14','4',('5','小明','2016-04-1115:26:40','4',('6','小明','2016-04-0415:26:54','2';COMMIT;
SETFOREIGN_KEY_CHECKS=1;导入成功后,执行以下SQL语句:mysql>setnamesutf8;
mysql>SELECT*FROMemployee_tbl;

+----+--------+---------------------+--------+
|id|name|date|singin|+----+--------+---------------------+--------+
|1|小明|2016-04-2215:25:33|1||2|小王|2016-04-2015:25:47|3||3|小丽|2016-04-1915:26:02|2||4|小王|2016-04-0715:26:14|4||5|小明|2016-04-1115:26:40|4||6|小明|2016-04-0415:26:54|2|+----+--------+---------------------+--------+6rowsinsetsec
接下来我们使用GROUPBY语句将数据表按名字进行分组,并统计每个人有多少条记录:
mysql>SELECTname,COUNT(*FROMemployee_tblGROUPBYname;+--------+----------+|name|COUNT(*|+--------+----------+|小丽|1||小明|3||小王|2|+--------+----------+3rowsinsetsec

使用WITHROLLUP
WITHROLLUP可以实现在分组统计数据基础上再进行相同的统计SUM,AVG,COUNT…)。
例如我们将以上的数据表按名字进行分组,再统计每个人登录的次数:mysql>SELECTname,SUM(singinassingin_countFROMemployee_tblGROUPBYnameWITHROLLUP;+--------+--------------+|name|singin_count|+--------+--------------+|小丽|2||小明|7||小王|7||NULL|16|+--------+--------------+4rowsinsetsec
其中记录NULL表示所有人的登录次数。
我们可以使用coalesce来设置一个可以取代NUll的名称,coalesce语法:selectcoalesce(a,b,c;
参数说明:如果a==null,则选择b如果b==null,则选择c如果a!=null,则选择a如果abc都为null,则返回为null(没意义)。以下实例中如果名字为空我们使用总数代替:

mysql>SELECTcoalesce(name,'总数',SUM(singinassingin_countFROMemployee_tblGROUPBYnameWITHROLLUP;+--------------------------+--------------+|coalesce(name,'总数'|singin_count|+--------------------------+--------------+
|小丽|2||小明|7||小王|7||总数|16|+--------------------------+--------------+4rowsinsetsec

Mysql连接的使用
在前几章节中,我们已经学会了如果在一张表中读取数据,这是相对简单的,是在真正的应用中经常需要从多个数据表中读取数据。
本章节我们将向大家介绍如何使用MySQLJOIN在两个或多个表中查询数据。
你可以在SELECT,UPDATEDELETE语句中使用MysqlJOIN来联合多表查询。
JOIN按照功能大致分为如下三类:
INNERJOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。LEFTJOIN(左连接)获取左表所有记录,即使右表没有对应匹配的记录。

RIGHTJOIN(右连接)LEFTJOIN相反,用于获取右表所有记录,即使左表没
有对应匹配的记录。
本章节使用的数据库结构及数据下载:。

在命令提示符中使用INNERJOIN
我们在RUNOOB数据库中有两张表tcount_tblrunoob_tbl。两张数据表数据如下:
实例
尝试以下实例:
测试实例数据
mysql>useRUNOOB;Databasechangedmysql>SELECT*FROMtcount_tbl;+---------------+--------------+|runoob_author|runoob_count|+---------------+--------------+|菜鸟教程|10|||20||Google|22|+---------------+--------------+3rowsinsetsecmysql>SELECT*fromrunoob_tbl;+-----------+---------------+---------------+-----------------+|runoob_id|runoob_title
|
runoob_author
|
submission_date
|
+-----------+---------------+---------------+-----------------+|1|学习PHP|菜鸟教程|2017-04-12||2|学习MySQL|菜鸟教程|2017-04-12||3|学习Java||2015-05-01||4|学习Python||2016-03-06||5|C|FK|2017-04-05|+-----------+---------------+---------------+-----------------+5rowsinsetsec

接下来我们就使用MySQLINNERJOIN(也可以省略INNER使用JOIN效果一来连接以上两张表来读取runoob_tbl表中所有runoob_author字段在tcount_tbl表对应的runoob_count字段值:
INNERJOIN
mysql>SELECT,,FROMrunoob_tblaINNERJOINtcount_tblbON=;+-------------+-----------------+----------------+||||+-------------+-----------------+----------------+|1||10||2||10||3||20||4||20|+-------------+-----------------+----------------+4rowsinsetsec
以上SQL语句等价于:
WHERE子句
mysql>
SELECT
,
,
FROM
runoob_tbl
a,
tcount_tbl
b
WHERE
=
;
+-------------+-----------------+----------------+||||+-------------+-----------------+----------------+|1||10||2||10||3||20||4||20|+-------------+-----------------+----------------+4rowsinsetsec


MySQLLEFTJOIN

MySQLleftjoinjoin有所不同。MySQLLEFTJOIN会读取左边数据表的全部数据,即便右边表无对应数据。
实例
尝试以下实例,以runoob_tbl为左表,tcount_tbl为右表,理解MySQLLEFTJOIN的应用:
LEFTJOIN
mysql>SELECT,,FROMrunoob_tblaLEFTJOINtcount_tblbON=;+-------------+-----------------+----------------+||||+-------------+-----------------+----------------+|1|菜鸟教程|10||2|菜鸟教程|10||3||20||4||20||5|FK|NULL|+-------------+-----------------+----------------+5rowsinsetsec
以上实例中使用了LEFTJOIN该语句会读取左边的数据表runoob_tbl的所有选取的字段数据,即便在右侧表tcount_tbl没有对应的runoob_author字段值。


MySQLRIGHTJOIN
MySQLRIGHTJOIN会读取右边数据表的全部数据,即便左边边表无对应数据。

实例
尝试以下实例,以runoob_tbl为左表,tcount_tbl为右表,理解MySQLRIGHTJOIN的应用:
RIGHTJOIN
mysql>SELECT,,FROMrunoob_tblaRIGHTJOINtcount_tblbON=;+-------------+-----------------+----------------+||||+-------------+-----------------+----------------+|1|菜鸟教程|10||2|菜鸟教程|10||3||20||4||20||NULL|NULL|22|+-------------+-----------------+----------------+5rowsinsetsec
以上实例中使用了RIGHTJOIN,该语句会读取右边的数据表tcount_tbl的所有选取的字段数据,即便在左侧表runoob_tbl中没有对应的runoob_author字段值。


PHP脚本中使用JOIN
PHP中使用mysqli_query(函数来执行SQL语句,你可以使用以上的相同的SQL语句作为mysqli_query(函数的参数。尝试如下实例:
MySQLORDERBY测试:

菜鸟MySQLJOIN

';echo'border="1">ID登陆次数';while($row=mysqli_fetch_array($retval,MYSQL_ASSOC{echo"
{$row['runoob_id']}
".
"{$row['runoob_author']}

".
"{$row['runoob_count']}"."";}echo'';mysqli_close($conn;>
输出结果如下图所示:


MySQLNULL值处理
我们已经知道MySQL使用SQLSELECT命令及WHERE子句来读取数据表中的数据,但是当提供的查询条件字段为NULL时,该命令可能就无法正常工作。为了处理这种情况,MySQL提供了三大运算符:
ISNULL:当列的值是NULL,此运算符返回trueISNOTNULL:当列的值不为NULL,运算符返回true
<=>:比较操作符(不同于=运算符),当比较的的两个值为NULL时返回true
关于NULL的条件比较运算是比较特殊的。你不能使用=NULL!=NULL列中查找NULL

MySQL中,NULL值与任何其它值的比较(即使是NULL)永远返回falseNULL=NULL返回false
MySQL中处理NULL使用ISNULLISNOTNULL运算符。

在命令提示符中使用NULL
以下实例中假设数据库RUNOOB中的表runoob_test_tbl含有两列runoob_authorrunoob_count,runoob_count中设置插入NULL值。
实例
尝试以下实例:
创建数据表runoob_test_tbl
root@host#mysql-uroot-ppassword;Enterpassword:*******mysql>useRUNOOB;Databasechangedmysql>createtablerunoob_test_tbl->(->runoob_authorvarchar(40NOTNULL,->runoob_countINT->;QueryOK,0rowsaffectedsecmysql>INSERTINTOrunoob_test_tbl(runoob_author,runoob_countvalues('RUNOOB',20;mysql>INSERTINTOrunoob_test_tbl(runoob_author,runoob_countvalues('菜鸟教程',NULL;mysql>INSERTINTOrunoob_test_tbl(runoob_author,runoob_countvalues('Google',NULL;mysql>INSERTINTOrunoob_test_tbl(runoob_author,runoob_countvalues('FK',20;mysql>SELECT*fromrunoob_test_tbl;+---------------+--------------+|runoob_author|runoob_count|+---------------+--------------+|RUNOOB|20||菜鸟教程|NULL||Google|NULL||FK|20|+---------------+--------------+4rowsinsetsec
以下实例中你可以看到=!=运算符是不起作用的:

mysql>SELECT*FROMrunoob_test_tblWHERErunoob_count=NULL;Emptysetsecmysql>SELECT*FROMrunoob_test_tblWHERErunoob_count!=NULL;Emptysetsec
查找数据表中runoob_test_tbl列是否为NULL,必须使用ISNULLISNOTNULL,如下实例:
mysql>
SELECT
*
FROM
runoob_test_tbl
WHERE
runoob_count
IS
NULL;
+---------------+--------------+|runoob_author|runoob_count|+---------------+--------------+|菜鸟教程|NULL||Google|NULL|+---------------+--------------+2rowsinsetsecmysql>SELECT*fromrunoob_test_tblWHERErunoob_countISNOTNULL;+---------------+--------------+|runoob_author|runoob_count|+---------------+--------------+|RUNOOB|20||FK|20|+---------------+--------------+2rowsinsetsec

使用PHP脚本处理NULL
PHP脚本中你可以在if...else语句来处理变量是否为空,并生成相应的条件语句。
以下实例中PHP设置了$runoob_count变量,然后使用该变量与数据表中的runoob_count字段进行比较:
MySQLORDERBY测试:
菜鸟教程ISNULL测试

';echo'作者登陆次数';while($row
=
mysqli_fetch_array($retval,
MYSQL_ASSOC
{
echo
"".
"{$row['runoob_author']}"."{$row['runoob_count']}"."";}echo'';mysqli_close($conn;>

输出结果如下图所示:


MySQL正则表达式
在前面的章节我们已经了解到MySQL可以通过LIKE...%来进行模糊匹配。MySQL同样也支持其他正则表达式的匹配,MySQL中使用REGEXP操作符来进行正则表达式匹配。
如果您了解PHPPerl,那么操作起来就非常简单,因为MySQL的正则表达式匹配与这些脚本的类似。
下表中的正则模式可应用于REGEXP操作符中。
模式
描述
匹配输入字符串的开始位置。如果设置了RegExp对象的
^
Multiline属性,^也匹配'\n''\r'之后的位置。配输入字符串的结束位置。如果设置了RegExp象的
$
Multiline属性,$也匹配'\n''\r'之前的位置。匹配除"\n"之外的任何单个字符。要匹配包括'\n'在内的任
.
何字符,请使用象'[.\n]'的模式。
字符集合。匹配所包含的任意一个字符。例如,'[abc]'可以匹
[...]

"plain"中的'a'
负值字符集合。匹配未包含的任意字符。例如,'[^abc]'可以匹
[^...]
"plain"中的'p'
匹配p1p2p3。例如,'z|food'能匹配"z""food"
p1|p2|p3
'(z|food'则匹配"zood""food"
匹配前面的子表达式零次或多次。例如,zo*能匹配"z"以及
*
"zoo"*等价于{0,}
匹配前面的子表达式一次或多次。例如,'zo+'能匹配"zo"
+
"zoo",但不能匹配"z"+等价于{1,}
n是一个非负整数。匹配确定的n次。例如,'o{2}'不能匹配
{n}
"Bob"中的'o',但是能匹配"food"中的两个o
mn均为非负整数,其中n<=m。最少匹配n次且最多匹m次。
{n,m}
实例
了解以上的正则需求后,我们就可以更加自己的需求来编写带有正则表达式的SQL语句。以下我们将列出几个小实例(表名:person_tbl来加深我们的理解:查找name字段中以'st'为开头的所有数据:
mysql>SELECTnameFROMperson_tblWHEREnameREGEXP'^st';查找name字段中以'ok'为结尾的所有数据:
mysql>SELECTnameFROMperson_tblWHEREnameREGEXP'ok$';查找name字段中包含'mar'字符串的所有数据:

mysql>SELECTnameFROMperson_tblWHEREnameREGEXP'mar';查找name字段中以元音字符开头或以'ok'字符串结尾的所有数据:mysql>SELECTnameFROMperson_tblWHEREnameREGEXP'^[aeiou]|ok$';

MySQL事务
MySQL事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务。
事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么
全部不执行。
事务用来管理insert,update,delete语句
一般来说,事务是必须满足4个条件ACIDAtomicity(原子性)Consistency(稳定性)、Isolation(隔离性)、Durability(可靠性)
1事务的原子性:一组事务,要么成功;要么撤回。2稳定性有非法数据(外键约束之类),事务撤回。
3隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事
务会撤回。事务的100%隔离,需要牺牲速度。
4可靠性:软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。可靠
性和高速度不可兼得,innodb_flush_log_at_trx_commit选项决定什么时候吧事务保存到日志里。

MySQL命令行的默认设置下,事务都是自动提交的,即执行SQL语句后就会马上执行COMMIT操作。因此要显式地开启一个事务务须使用命令BEGINSTARTTRANSACTION,或者执行命令SETAUTOCOMMIT=0,用来禁止使用当前会话的自动提交。
事物控制语句:

BEGINSTARTTRANSACTION;显式地开启一个事务;
COMMIT;也可以使用COMMITWORK,不过二者是等价的。COMMIT提交事务,并使已对数据库进行的所有修改称为永久性的;

ROLLBACK;有可以使用ROLLBACKWORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;

SAVEPOINTidentifierSAVEPOINT允许在事务中创建一个保存点,一个事务中可以有多个SAVEPOINT

RELEASESAVEPOINTidentifier;删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;

ROLLBACKTOidentifier;把事务回滚到标记点;
SETTRANSACTION;用来设置事务的隔离级别。InnoDB存储引擎提供事务的隔离级别有READUNCOMMITTEDREADCOMMITTEDREPEATABLEREADSERIALIZABLE
MYSQL事务处理主要有两种方法:
1、用BEGIN,ROLLBACK,COMMIT来实现
BEGIN开始一个事务ROLLBACK事务回滚COMMIT事务确认

2、直接用SET来改变MySQL的自动提交模式:
SETAUTOCOMMIT=0禁止自动提交SETAUTOCOMMIT=1开启自动提交
事务测试
mysql>useRUNOOB;Databasechangedmysql>CREATETABLErunoob_transaction_test(idint(5engine=innodb;#创建数据表QueryOK,0rowsaffectedsecmysql>select*fromrunoob_transaction_test;Emptysetsecmysql>begin;#开始事务QueryOK,0rowsaffectedsecmysql>insertintorunoob_transaction_testvalue(5;QueryOK,1rowsaffectedsecmysql>insertintorunoob_transaction_testvalue(6;QueryOK,1rowsaffectedsecmysql>commit;#QueryOK,0rowsaffectedsecmysql>select*fromrunoob_transaction_test;+------+|id|+------+|5||6|+------+2rowsinsetsecmysql>begin;#开始事务QueryOK,0rowsaffectedsecmysql>insertintorunoob_transaction_testvalues(7;QueryOK,1rowsaffectedsecmysql>rollback;#回滚QueryOK,0rowsaffectedsecmysql>select*fromrunoob_transaction_test;#因为回滚所以数据没有插入+------+|id|+------+|5||6|+------+2rowsinsetsecmysql>
PHP中使用事务实例
MySQLORDERBY测试:

row****************

Name:testalter_tblType:MyISAMRow_format:FixedRows:0Avg_row_length:0Data_length:0Max_data_length:775Index_length:1024Data_free:0Auto_increment:NULL
Create_time:2007-06-0308:04:36Update_time:2007-06-0308:04:36Check_time:NULLCreate_options:Comment:1rowinsetsec

修改表名
如果需要修改数据表的名称,可以在ALTERTABLE语句中使用RENAME子句来实现。
尝试以下实例将数据表testalter_tbl重命名为alter_tblmysql>ALTERTABLEtestalter_tblRENAMETOalter_tbl;
ALTER命令还可以用来创建及删除MySQL数据表的索引,该功能我们会在接下来的章节中介绍。

笔记列表
1.Vladimir
alter其他用途:
修改存储引擎:修改为myisamaltertabletableNameengine=myisam;删除外键约束:keyName是外键别名
altertabletableNamedropforeignkeykeyName;
修改字段的相对位置:这里name1为想要修改的字段,type1为该字段原来类型,firstafter二选一,这应该显而易见,first放在第一位,after放在name2字段后面
altertabletableNamemodifyname1type1first|aftername2;

MySQL索引
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。
打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。

索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。创建索引时,你需要确保该索引是应用在SQL查询语句的条件(一般作为WHERE子句的条件
实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERTUPDATEDELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
建立索引会占用磁盘空间的索引文件。

普通索引
创建索引
这是最基本的索引,它没有任何限制。它有以下几种创建方式:CREATEINDEXindexNameONmytable(username(length;
如果是CHARVARCHAR类型,length可以小于字段实际长度;如果是BLOBTEXT类型,必须指定length
修改表结构(添加索引
ALTERmytableADDINDEX[indexName]ON(username(length

创建表的时候直接指定
CREATETABLEmytable(
IDINTNOTNULL,
usernameVARCHAR(16NOTNULL,
INDEX[indexName](username(length;
删除索引的语法
DROPINDEX[indexName]ONmytable;

唯一索引
它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:
创建索引
CREATEUNIQUEINDEXindexNameONmytable(username(length
修改表结构
ALTERtablemytableADDUNIQUE[indexName](username(length
创建表的时候直接指定
CREATETABLEmytable(


IDINTNOTNULL,
usernameVARCHAR(16NOTNULL,
UNIQUE[indexName](username(length;

使用ALTER命令添加和删除索引
有四种方式来添加数据表的索引:
ALTERTABLEtbl_nameADDPRIMARYKEY(column_list:该语句添加一个主键,这意
味着索引值必须是唯一的,且不能为NULL
ALTERTABLEtbl_nameADDUNIQUEindex_name(column_list:这条语句创建索引的
值必须是唯一的(除了NULL外,NULL可能会出现多次)
ALTERTABLEtbl_nameADDINDEXindex_name(column_list:添加普通索引,索引值
可出现多次。
ALTERTABLEtbl_nameADDFULLTEXTindex_name(column_list:该语句指定了索引为
FULLTEXT,用于全文索引。
以下实例为在表中添加索引。
mysql>ALTERTABLEtestalter_tblADDINDEX(c;
你还可以在ALTER命令中使用DROP子句来删除索引。尝试以下实例删除索:
mysql>ALTERTABLEtestalter_tblDROPINDEXc;


使用ALTER命令添加和删除主键
主键只能作用于一个列上,添加主键索引时,你需要确保该主键默认不为空NOTNULL)。实例如下:
mysql>ALTERTABLEtestalter_tblMODIFYiINTNOTNULL;mysql>ALTERTABLEtestalter_tblADDPRIMARYKEY(i;你也可以使用ALTER命令删除主键:
mysql>ALTERTABLEtestalter_tblDROPPRIMARYKEY;
删除主键时只需指定PRIMARYKEY,但在删除索引时,你必须知道索引名。

显示索引信息
你可以使用SHOWINDEX命令来列出表中的相关的索引信息。可以通过添加\G来格式化输出信息。尝试以下实例:
mysql>SHOWINDEXFROMtable_name;\G........

MySQL临时表
MySQL临时表在我们需要保存一些临时数据时是非常有用的。临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间。

临时表在MySQL版本中添加,如果你的MySQL版本低于版本就无法使用MySQL的临时表。不过现在一般很少有再使用这么低版本的MySQL数据库服务了。
MySQL临时表只在当前连接可见,如果你使用PHP脚本来创建MySQL临时表,那没当PHP脚本执行完成后,该临时表也会自动销毁。
如果你使用了其他MySQL客户端程序连接MySQL数据库服务器来创建临时表,那么只有在关闭客户端程序时才会销毁临时表,当然你也可以手动销毁。
实例
以下展示了使用MySQL临时表的简单实例,以下的SQL代码可以适用于PHP本的mysql_query(函数。
mysql>CREATETEMPORARYTABLESalesSummary(->product_nameVARCHAR(50NOTNULL->,total_salesDECIMAL(12,2NOTNULLDEFAULT->,avg_unit_priceDECIMAL(7,2NOTNULLDEFAULT->,total_units_soldINTUNSIGNEDNOTNULLDEFAULT0;
QueryOK,0rowsaffectedsec
mysql>INSERTINTOSalesSummary
->(product_name,total_sales,avg_unit_price,total_units_sold->VALUES
->('cucumber',,90,2;
mysql>SELECT*FROMSalesSummary;

+--------------+-------------+----------------+------------------+
|product_name|total_sales|avg_unit_price|total_units_sold|+--------------+-------------+----------------+------------------+
|cucumber|||2|+--------------+-------------+----------------+------------------+1rowinsetsec
当你使用SHOWTABLES命令显示数据表列表时,你将无法看到SalesSummary表。
如果你退出当前MySQL会话,再使用SELECT命令来读取原先创建的临时表数据,那你会发现数据库中没有该表的存在,因为在你退出时该临时表已经被销毁了。

删除MySQL临时表
默认情况下,当你断开与数据库的连接后,临时表就会自动被销毁。当然你也可以在当前MySQL会话使用DROPTABLE命令来手动删除临时表。以下是手动删除临时表的实例:
mysql>CREATETEMPORARYTABLESalesSummary(->product_nameVARCHAR(50NOTNULL->,total_salesDECIMAL(12,2NOTNULLDEFAULT->,avg_unit_priceDECIMAL(7,2NOTNULLDEFAULT->,total_units_soldINTUNSIGNEDNOTNULLDEFAULT0;
QueryOK,0rowsaffectedsec


mysql>INSERTINTOSalesSummary
->(product_name,total_sales,avg_unit_price,total_units_sold->VALUES
->('cucumber',,90,2;
mysql>SELECT*FROMSalesSummary;
+--------------+-------------+----------------+------------------+
|product_name|total_sales|avg_unit_price|total_units_sold|+--------------+-------------+----------------+------------------+
|cucumber|||2|+--------------+-------------+----------------+------------------+1rowinsetsec
mysql>DROPTABLESalesSummary;mysql>SELECT*FROMSalesSummary;ERROR1146:Table''doesn'texist

MySQL复制表
如果我们需要完全的复制MySQL的数据表,包括表的结构,索引,默认值等。果仅仅使用CREATETABLE...SELECT命令,是无法实现的。本章节将为大家介绍如何完整的复制MySQL数据表,步骤如下:
使用SHOWCREATETABLE命令获取创建数据表(CREATETABLE语句,该语句包含
了原数据表的结构,索引等。


复制以下命令显示的SQL语句,修改数据表名,并执行SQL语句,通过以上命令
完全的复制数据表结构。
如果你想复制表的内容,你就可以使用INSERTINTO...SELECT语句来实现。
实例
尝试以下实例来复制表runoob_tbl步骤一:
获取数据表的完整结构。
mysql>SHOWCREATETABLErunoob_tbl\G;
***************************1.row***************************Table:runoob_tbl
CreateTable:CREATETABLE`runoob_tbl`(`runoob_id`int(11NOTNULLauto_increment,`runoob_title`varchar(100NOTNULLdefault'',`runoob_author`varchar(40NOTNULLdefault'',`submission_date`datedefaultNULL,PRIMARYKEY(`runoob_id`,
UNIQUEKEY`AUTHOR_INDEX`(`runoob_author`ENGINE=InnoDB1rowinsetsecERROR:
Noqueryspecified步骤二:

修改SQL语句的数据表名,并执行SQL语句。mysql>CREATETABLE`clone_tbl`(
->`runoob_id`int(11NOTNULLauto_increment,->`runoob_title`varchar(100NOTNULLdefault'',->`runoob_author`varchar(40NOTNULLdefault'',->`submission_date`datedefaultNULL,->PRIMARYKEY(`runoob_id`,
->UNIQUEKEY`AUTHOR_INDEX`(`runoob_author`->ENGINE=InnoDB;
QueryOK,0rowsaffectedsec步骤三:
执行完第二步骤后,你将在数据库中创建新的克隆表clone_tbl数据表的数据你可以使用INSERTINTO...SELECT语句来实现。mysql>INSERTINTOclone_tbl(runoob_id,->runoob_title,->runoob_author,->submission_date->SELECTrunoob_id,runoob_title,
->runoob_author,submission_date->FROMrunoob_tbl;QueryOK,3rowsaffectedsecRecords:3Duplicates:0Warnings:0
执行以上步骤后,你将完整的复制表,包括表结构及表数据。

如果你想拷贝

MySQL元数据
你可能想知道MySQL以下三种信息:
查询结果信息:SELECT,UPDATEDELETE语句影响的记录数。数据库和数据表的信息:包含了数据库及数据表的结构信息。MySQL服务器信息:包含了数据库服务器的当前状态,版本号等。
MySQL的命令提示符中,我们可以很容易的获取以上服务器信息。但如果使PerlPHP等脚本语言,你就需要调用特定的接口函数来获取。接下来我们会详细介绍。

获取查询语句影响的记录数
PERL实例
DBI脚本中,语句影响的记录数通过函数do(execute(返回:#方法1
#使用do(执行$querymy$count=$dbh->do($query;#如果发生错误会输出0
printf"%d条数据被影响\n",(defined($count$count:0;
#方法2
#使用prepare(execute(执行$querymy$sth=$dbh->prepare($query;

my$count=$sth->execute(;
printf"%d条数据被影响\n",(defined($count$count:0;
PHP实例
PHP中,你可以使用mysqli_affected_rows(函数来获取查询语句影响的记录数。
$result_id=mysqli_query($conn_id,$query;#如果查询失败返回
$count=($result_idmysqli_affected_rows($conn_id:0;print("$count条数据被影响\n";

数据库和数据表列表
你可以很容易的在MySQL服务器中获取数据库和数据表列表。如果你没有足够的权限,结果将返回null
你也可以使用SHOWTABLESSHOWDATABASES语句来获取数据库和数据表列表。
PERL实例
#获取当前数据库中所有可用的表。my@tables=$dbh->tables(;foreach$table(@tables{print"表名$table\n";}

PHP实例
以下实例输出MySQL服务器上的所有数据库:
查看所有数据库
";}mysqli_close($conn;>

获取服务器元数据
以下命令语句可以在MySQL的命令提示符使用,也可以在脚本中使用,PHP脚本。
命令
描述
SELECTVERSION(服务器版本信息
SELECTDATABASE(当前数据库名(或者返回空SELECTUSER(SHOWSTATUS
当前用户名服务器状态
SHOWVARIABLES服务器配置变量
MySQL序列使用
MySQL序列是一组整数:1,2,3,...,由于一张数据表只能有一个字段自增主键,如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现。本章我们将介绍如何使用MySQL的序列。


使用AUTO_INCREMENT
MySQL中最简单使用序列的方法就是使用MySQLAUTO_INCREMENT来定义列。
实例
以下实例中创建了数据表insectinsectid无需指定值可实现自动增长。mysql>CREATETABLEinsect->(
->idINTUNSIGNEDNOTNULLAUTO_INCREMENT,->PRIMARYKEY(id,
->nameVARCHAR(30NOTNULL,#typeofinsect->dateDATENOTNULL,#datecollected
->originVARCHAR(30NOTNULL#wherecollected;
QueryOK,0rowsaffectedsec
mysql>INSERTINTOinsect(id,name,date,originVALUES->(NULL,'housefly','2001-09-10','kitchen',->(NULL,'millipede','2001-09-10','driveway',->(NULL,'grasshopper','2001-09-10','frontyard';QueryOK,3rowsaffectedsecRecords:3Duplicates:0Warnings:0mysql>SELECT*FROMinsectORDERBYid;+----+-------------+------------+------------+
|id|name|date|origin|+----+-------------+------------+------------+
|1|housefly|2001-09-10|kitchen|

|2|millipede|2001-09-10|driveway||3|grasshopper|2001-09-10|frontyard|+----+-------------+------------+------------+3rowsinsetsec

获取AUTO_INCREMENT
MySQL的客户端中你可以使用SQL中的LAST_INSERT_ID(函数来获取最后的插入表中的自增列的值。
PHPPERL脚本中也提供了相应的函数来获取最后的插入表中的自增列的值。
PERL实例
使用mysql_insertid属性来获取AUTO_INCREMENT的值。实例如下:$dbh->do("INSERTINTOinsect(name,date,originVALUES('moth','2001-09-14','windowsill'";my$seq=$dbh->{mysql_insertid};
PHP实例
PHP通过mysql_insert_id(函数来获取执行的插入SQL语句中AUTO_INCREMENT列的值。
mysql_query("INSERTINTOinsect(name,date,originVALUES('moth','2001-09-14','windowsill'",$conn_id;$seq=mysql_insert_id($conn_id;


重置序列
如果你删除了数据表中的多条记录,并希望对剩下数据的AUTO_INCREMENT进行重新排列,那么你可以通过删除自增的列,然后重新添加来实现。不过该操作要非常小心,如果在删除的同时又有新记录添加,有可能会出现数据混乱。操作如下所示:
mysql>ALTERTABLEinsectDROPid;mysql>ALTERTABLEinsect
->ADDidINTUNSIGNEDNOTNULLAUTO_INCREMENTFIRST,->ADDPRIMARYKEY(id;

设置序列的开始值
一般情况下序列的开始值为1,但如果你需要指定一个开始值100,那我们可以通过以下语句来实现:mysql>CREATETABLEinsect->(
->idINTUNSIGNEDNOTNULLAUTO_INCREMENT,->PRIMARYKEY(id,
->nameVARCHAR(30NOTNULL,->dateDATENOTNULL,->originVARCHAR(30NOTNULL
engine=innodbauto_increment=100charset=utf8;或者你也可以在表创建成功后,通过以下语句来实现:mysql>ALTERTABLEtAUTO_INCREMENT=100;


MySQL处理重复数据
有些MySQL数据表中可能存在重复的记录,有些情况我们允许重复数据的存在,但有时候我们也需要删除这些重复的数据。
本章节我们将为大家介绍如何防止数据表出现重复数据及如何删除数据表中的重复数据。

防止表中出现重复数据
你可以在MySQL数据表中设置指定的字段为PRIMARYKEY(主键)或者UNIQUE(唯一)索引来保证数据的唯一性。
让我们尝试一个实例:下表中无索引及主键,所以该表允许出现多条重复记录。CREATETABLEperson_tbl(
first_nameCHAR(20,last_nameCHAR(20,sexCHAR(10;
如果你想设置表中字段first_namelast_name数据不能重复,你可以设置双主键模式来设置数据的唯一性,如果你设置了双主键,那么那个键的默认值不能NULL,可设置为NOTNULL。如下所示:CREATETABLEperson_tbl

(
first_nameCHAR(20NOTNULL,last_nameCHAR(20NOTNULL,sexCHAR(10,
PRIMARYKEY(last_name,first_name;
如果我们设置了唯一索引,那么在插入重复数据时,SQL语句将无法执行成功,并抛出错。
INSERTIGNOREINTOINSERTINTO的区别就是INSERTIGNORE会忽略数据库中已经存在的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。这样就可以保留数据库中已经存在数据,达到在间隙中插入数据的目的。
以下实例使用了INSERTIGNOREINTO执行后不会出错,也不会向数据表中插入重复数据:
mysql>INSERTIGNOREINTOperson_tbl(last_name,first_name->VALUES('Jay','Thomas';QueryOK,1rowaffectedsec
mysql>INSERTIGNOREINTOperson_tbl(last_name,first_name->VALUES('Jay','Thomas';QueryOK,0rowsaffectedsec
INSERTIGNOREINTO当插入数据时,在设置了记录的唯一性后,如果插入重复数据,将不返回错误,只以警告形式返回。REPLACEINTOinto如果存在primaryunique相同的记录,则先删除掉。再插入新记录。

另一种设置数据的唯一性方法是添加一个UNIQUE索引,如下所示:CREATETABLEperson_tbl(
first_nameCHAR(20NOTNULL,last_nameCHAR(20NOTNULL,sexCHAR(10
UNIQUE(last_name,first_name;

统计重复数据
以下我们将统计表中first_namelast_name的重复记录数:mysql>SELECTCOUNT(*asrepetitions,last_name,first_name->FROMperson_tbl
->GROUPBYlast_name,first_name->HAVINGrepetitions>1;
以上查询语句将返回person_tbl表中重复的记录数。一般情况下,查询重复的值,请执行以下操作:

确定哪一列包含的值可能会重复。
在列选择列表使用COUNT(*列出的那些列。GROUPBY子句中列出的列。HAVING子句设置重复数大于1

过滤重复数据

如果你需要读取不重复的数据可以在SELECT语句中使用DISTINCT关键字来过滤重复数据。
mysql>SELECTDISTINCTlast_name,first_name->FROMperson_tbl;
你也可以使用GROUPBY来读取数据表中不重复的数据:mysql>SELECTlast_name,first_name->FROMperson_tbl
->GROUPBY(last_name,first_name;

删除重复数据
如果你想删除数据表中的重复数据,你可以使用以下的SQL语句:mysql>CREATETABLEtmpSELECTlast_name,first_name,sex->FROMperson_tbl;
->GROUPBY(last_name,first_name,sex;mysql>DROPTABLEperson_tbl;
mysql>ALTERTABLEtmpRENAMETOperson_tbl;
当然你也可以在数据表中添加INDEX(索引)PRIMAYKEY(主键)这种简单的方法来删除表中的重复记录。方法如下:mysql>ALTERIGNORETABLEperson_tbl
->ADDPRIMARYKEY(last_name,first_name;


MySQLSQL注入
如果您通过网页获取用户输入的数据并将其插入一个MySQL数据库,那么就有可能发生SQL注入安全的问题。
本章节将为大家介绍如何防止SQL注入,并通过脚本来过滤SQL中注入的字符。所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
我们永远不要信任用户的输入,我们必须认定用户输入的数据都是不安全的,们都需要对用户输入的数据进行过滤处理。
以下实例中,输入的用户名必须为字母、数字及下划线的组合,且用户名长度为820个字符之间:
if(preg_match("/^\w{8,20}$/",$_GET['username'],$matches{
$result=mysqli_query($conn,"SELECT*FROMusersWHEREusername=$matches[0]";}else{
echo"username输入异常";}
让我们看下在没有过滤特殊字符时,出现的SQL情况:

远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和"-"进行转换等。


2.永远不要使用动态拼装sql可以使用参数化的sql或者直接使用存储过程进行数据查询存取。

3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。

4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装

注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky网站平台就有亿思网站安全平台检测工具。MDCSOFTSCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。

防止SQL注入
在脚本语言,如PerlPHP你可以对用户输入的数据进行转义从而来防止SQL注入。
PHPMySQL扩展提供了mysqli_real_escape_string(函数来转义特殊的输入字符。
if(get_magic_quotes_gpc({
$name=stripslashes($name;}
$name=mysqli_real_escape_string($conn,$name;
mysqli_query($conn,"SELECT*FROMusersWHEREname='{$name}'";

Like语句中的注入

本文来源:https://www.2haoxitong.net/k/doc/da00fab6571810a6f524ccbff121dd36a32dc43a.html

《MySQL菜鸟教程.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式