共计 20683 个字符,预计需要花费 52 分钟才能阅读完成。
这篇文章给大家分享的是有关 MySQL 基础的示例分析的内容。丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,一起跟随丸趣 TV 小编过来看看吧。
MySQL 入门
mySQL(关系型数据库管理系统)
MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL 是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。
MySQL 是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL 所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。
由于其社区版的性能卓越,搭配 PHP 和 Apache 可组成良好的开发环境。
1. 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制所保存的数据。
2. 使用关系型数据库管理系统(RDBMS)来存储和管理的大数据量。关系型数据库是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
3. RDBMS 特点:
1. 数据以表格的形式出现
2. 每行为各种记录名称
3. 每列为记录名称所对应的数据域
4. 许多的行和列组成一张表单
5. 若干的表单组成 database
4. RDBMS 术语
冗余:存储两倍数据,冗余可以使系统速度更快。
主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
外键:外键用于关联两个表。
复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性
5. MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL 管理 6. 启动及关闭 MySQL 服务器:
(1)检查 MySQL 服务器是否启动:
ps -ef | grepmysqld
(2)启动 MySQL 服务器:
root@host# cd/usr/bin
./safe_mysqld
(3)关闭目前运行的 MySQL 服务器:
root@host# cd/usr/bin
./mysqladmin-u root -p shutdown
Enterpassword: ******
7. MySQL 用户设置
在 MySQL 数据库中的 user 表添加新用户:
root@host# mysql -u root –p // 选择数据库
Enter password:*******
mysql use mysql;
Database changed
mysql INSERT INTO user
(host, user, password,
select_priv, insert_priv,update_priv) // 设置权限 Y
VALUES ( localhost , guest ,
PASSWORD(guest123), Y , Y , Y
Query OK, 1 row affected (0.20 sec)
mysql FLUSH PRIVILEGES;
注意需要执行 FLUSH PRIVILEGES 语句。这个命令执行后会重新载入授权表。
另外一种添加用户的方法为通过 SQL 的 GRANT 命令
mysql GRANTSELECT,INSERT,UPDATE,DELETE,CREATE,DROP
- ON TUTORIALS.*
- TO zara @ localhost
- IDENTIFIED BY zara123
8. 管理 MySQL 的命令
USE 数据库名 : 选择要操作的 MySQL 数据库:
mysql use W3CSCHOOL;
Database changed
SHOW DATABASES: 列出 MySQL 数据库管理系统的数据库列表:
mysql SHOWDATABASES;
SHOW TABLES: 显示指定数据库所有表,用该命令前需用 use 命令选择操作的数据库。
mysql useW3CSCHOOL;
Database changed
mysql SHOW TABLES;
SHOW COLUMNS FROM 数据表: 显示数据表的属性,属性类型,主键信息,是否 NULL,默认值等其他信息。
mysql SHOW COLUMNSFROM W3Cschool_tbl;
+—————–+————–+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+—————–+————–+——+—–+———+——-+
SHOW INDEX FROM 数据表: 显示数据表的详细索引信息,包括 PRIMARY KEY(主键)。
SHOW TABLE STATUS LIKE 数据表 \G: 该命令将输出 MySQL 数据库管理系统的性能及统计信息。
mysql SHOW TABLESTATUS FROM W3CSCHOOL; # 显示数据库 W3CSCHOOL 中所有表的信息
mysql SHOW TABLESTATUS from W3CSCHOOL LIKE W3Cschool% #表名以 W3Cschool 开头的表的信息
mysql SHOW TABLESTATUS from W3CSCHOOL LIKE W3Cschool% #加上 \G,查询结果按列打印
9. PHP MySQL 函数格式:mysql_function(value,value,…);
MySQL 连接 10.使用 MySQL 二进制方式连接 [root@host]# mysql -uroot -p
Enter password:******
登录成功后会出现 mysql 命令提示窗口,你可以在上面执行任何 SQL 语句。
退出 mysql 命令提示窗口可以使用 exit 命令:mysql exit
11.使用 PHP 脚本连接 MySQL
PHP 提供了 mysql_connect() 函数来连接数据库。
connectionmysql_connect(server,user,passwd,new_link,client_flag);5 各参数均可选
使用 PHP 的 mysql_close() 函数来断开与 MySQL 数据库的链接。
bool mysql_close (resource $link_identifier);
通常不要用 mysql_close(),因为已打开的非持久连接会在脚本执行完毕后自动关闭。
mysql_close() 不会关闭由 mysql_pconnect() 建立的持久连接
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn )
die(Could not connect: .mysql_error());
echo Connected successfully
mysql_close($conn);
MySQL 创建 / 删除数据库 12.使用 mysqladmin 创建数据库
用 root 用户登录,root 用户拥有最高权限,可以使用 mysql mysqladmin 命令来创建数据库。
[root@host]#mysqladmin -u root -pcreate/drop W3CSCHOOL
Enter password:*****
13.使用 PHP 脚本创建数据库
PHP 使用 mysql_query 函数来创建或者删除 MySQL 数据库。
bool mysql_query( sql, connection);
$conn = mysql_connect($dbhost,$dbuser, $dbpass);
if(! $conn )
die(连接错误: . mysql_error());
echo 连接成功 br /
$sql= CREATE/DROP DATABASE W3CSCHOOL
$retval= mysql_query( $sql, $conn );
if(! $retval )
die(创建数据库失败: . mysql_error());
echo 数据库 W3CSCHOOL 创建成功 \n
mysql_close($conn);
MySQL 选择数据库 14.使用 PHP 脚本选择 MySQL 数据库
PHP 提供了函数 mysql_select_db 来选取一个数据库。
bool mysql_select_db( db_name,connection );
$conn = mysql_connect($dbhost,$dbuser, $dbpass);
if(! $conn )
die(连接失败: . mysql_error());
echo 连接成功
mysql_select_db(W3CSCHOOL );
mysql_close($conn);
MySQL 创建 / 删除数据表 15.MySQL 创建数据表
创建 MySQL 数据表需要以下信息:
表名
表字段名
定义每个表字段
创建语法:CREATE TABLE table_name (column_name column_type);
删除语法:DROP TABLE table_name ;
以下例子中我们将在 W3CSCHOOL 数据库中创建数据表 w3cschool_tbl:
tutorials_tbl(
tutorial_id INT NOT NULL AUTO_INCREMENT,
tutorial_title VARCHAR(100) NOT NULL,
tutorial_author VARCHAR(40) NOT NULL,
submission_date DATE,
PRIMARY KEY ( w3cschool_id )
);
16.通过命令提示符创建表
使用 SQL 语句 CREATE TABLE 来创建数据表。
mysql CREATE TABLE w3cschool_tbl(
- w3cschool_id INT NOTNULL AUTO_INCREMENT,
- w3cschool_titleVARCHAR(100) NOT NULL,
- w3cschool_authorVARCHAR(40) NOT NULL,
- submission_date DATE,
- PRIMARY KEY (w3cschool_id )
- );
MySQL 命令终止符为分号 (;)。
17.使用 PHP 脚本创建 / 删除数据表或插入数据
语法:bool mysql_query(sql, connection);
$sql = CREATE TABLEtutorials_tbl( 创建
tutorial_id INT NOTNULL AUTO_INCREMENT, .
tutorial_titleVARCHAR(100) NOT NULL, .
tutorial_authorVARCHAR(40) NOT NULL, .
submission_dateDATE, .
PRIMARY KEY (tutorial_id ));
$sql = DROP TABLEw3cschool_tbl 删除
mysql_select_db( TUTORIALS );
$retval = mysql_query( $sql, $conn); // 判断是否成功而设置的参数;if(! $retval )
die(数据表创建失败: . mysql_error());
echo 数据表创建成功 \n
mysql_close($conn);
MySQL 插入数据
18.向 MySQL 数据表插入数据通用的 INSERT INTO SQL 语法:
INSERT INTO table_name (field1, field2,…fieldN)
VALUES
(value1,value2,…valueN);
如果数据是字符型,必须使用单引号或者双引号,如:value。
w3cschool_tbl 表插入一条数据:
mysql INSERT INTOw3cschool_tbl
– (w3cschool_title, w3cschool_author,submission_date)
– VALUES
– (Learn PHP , JohnPoul , NOW());
(-)不是 SQL 语句的一部分,它仅表示一个新行,如 SQL 语句太长,可通过回车键创建一个新行编写 SQL 语句,SQL 语句的命令结束符为分号(;)。
19.使用 PHP 脚本插入数据
$sql = INSERT INTO w3cschool_tbl .
(w3cschool_title,w3cschool_author,submission_date) .
VALUES .
($w3cschool_title , $w3cschool_author , $submission_date)
MySQL 查询数据
20.为在 MySQL 数据库中查询数据通用的 SELECT 语法:
SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[OFFSET M][LIMIT N]
可以通过 SELECT 命令读取一条或者多条记录。
可以通过 OFFSET 指定 SELECT 语句开始查询的数据偏移量默认情况下偏移量为 0。
可以使用 LIMIT 属性来设定返回的记录数。
你可以使用星号(*)来代替其他字段,SELECT 语句会返回表的所有字段数据
mysql SELECT * from w3cschool_tbl
21.使用 PHP 脚本来获取数据
使用 PHP 函数的 mysql_query()及 SQL SELECT 命令来获取数据。
该函数用于执行 SQL 命令,然后通过 PHP 函数 mysql_fetch_array() 来使用或输出所有查询的数据。
尝试以下实例来显示数据表 w3cschool_tbl 的所有记录
$sql = SELECT w3cschool_id,w3cschool_title,
w3cschool_author,submission_date
FROM w3cschool_tbl
mysql_select_db(W3CSCHOOL
$retval = mysql_query($sql, $conn);
if(! $retval)
{
die(Could not get data: .mysql_error());
}
while($row =mysql_fetch_array($retval, MYSQL_ASSOC))
while($row =mysql_fetch_assoc($retval))
用 MYSQL_NUM 参数显示数据表
while($row =mysql_fetch_array($retval, MYSQL_NUM))
用 MYSQL_NUM 参数显示数据表
{
echo Tutorial ID:{$row[ w3cschool_id]} br .
Title:{$row[ w3cschool_title]} br .
Author:{$row[ w3cschool_author]} br .
Submission Date : {$row[ submission_date]} br .
——————————– br
}
mysql_free_result($retval); 释放游标内存
echo Fetched data successfully\n
mysql_close($conn);
MYSQL_ASSOC,设置该参数查询结果返回关联数组,你可以使用字段名称来作为数组的索引。
MySQL 选择数据
22.从 MySQL 表中使用 SQL SELECT 语句来读取数据。
如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句中
以下是 SQL SELECT 语句使用 WHERE 子句从数据表中读取数据的通用语法:
SELECT field1,field2,…fieldN FROM table_name1, table_name2…
[WHERE condition1 [AND[OR]] condition2…..
WHERE 子句也可以运用于 SQL 的 DELETE 或者 UPDATE 命令。
使用 LIKE 来比较字符串,否则 MySQL 的 WHERE 子句的字符串比较是不区分大小写的。你可以使用 BINARY 关键字来设定 WHERE 子句的字符串比较是区分大小写的。
23.使用 PHP 脚本读取数据
使用 PHP 函数的 mysql_query()及相同的 SQL SELECT 带上 WHERE 子句的命令来获取数据。该函数用于执行 SQL 命令,然后通过 mysql_fetch_array() 来输出所有查询的数据。
$sql = SELECT w3cschool_id,w3cschool_title,
w3cschool_author, submission_date
FROM w3cschool_tbl
WHEREw3cschool_author= Sanjay
MySQL UPDATE
24.修改或更新 MySQL 中的数据,我们可以使用 SQL UPDATE 命令来操作。
通用 SQL 语法:
UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]
更新数据表中 w3cschool_id 为 3 的 w3cschool_title 字段值:
mysql UPDATE w3cschool_tbl
– SET w3cschool_title= Learning JAVA
– WHERE w3cschool_id=3;
使用 PHP 脚本更新数据
$sql = UPDATE w3cschool_tbl
SETw3cschool_title= Learning JAVA
WHERE w3cschool_id=3
MySQL DELETE
25.DELETE FROM table_name[WHERE Clause
如果没有指定 WHERE 子句,MySQL 表中的所有记录将被删除。
可以在 WHERE 子句中指定任何条件
删除 w3cschool_tbl 表中 w3cschool_id 为 3 的记录
mysql DELETE FROMw3cschool_tbl WHERE w3cschool_id=3;
用 PHP 脚本删除数据
$sql = DELETE FROMw3cschool_tbl
WHERE w3cschool_id=3
MySQL LIKE 子句
QL LIKE 子句中使用百分号 (%) 字符来表示任意字符
没有使用百分号(%),LIKE 子句与等号(=)的效果是一样的。
26.QL SELECT 语句使用 LIKE 子句从数据表中读取数据的通用语法:
SELECT field1,field2,…fieldN table_name1, table_name2…
WHERE field1 LIKEcondition1 [AND [OR]] filed2 = somevalue
LIKE 通常与 % 一同使用,类似于一个元字符的搜索
在 PHP 脚本中使用 LIKE 子句
$sql = SELECTw3cschool_id, w3cschool_title,
w3cschool_author,submission_date
FROM w3cschool_tbl
WHERE w3cschool_author LIKE %jay%
MySQL 排序
SELECT field1,field2,…fieldN table_name1, table_name2…
ORDER BY field1,[field2…] [ASC [DESC]]
ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。默认情况下,它是按升排列。
MySQL 分组
SELECT column_name,function(column_name)
FROM table_name
WHERE column_nameoperator value
GROUP BY column_name;
WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)。
coalesce 来设置一个可以取代 NUll 的名称,coalesce 语法:
select coalesce(a,b,c);
参数说明:如果 a ==null, 则选择 b;如果 b ==null, 则选择 c;如果 a!=null, 则选择 a;如果 a b c 都为 null,则返回为 null(没意义)。
mysql SELECTcoalesce(name, 总数), SUM(singin) as singin_countFROM employee_tbl GROUP BY name WITHROLLUP;
+————————–+————–+
| coalesce(name, 总数) | singin_count |
+————————–+————–+
| 小丽 | 2 |
| 小明 | 7 |
| 小王 | 7 |
| 总数 | 16 |
+————————–+————–+
MySQL 多表查询
27.在 SELECT, UPDATE 和 DELETE 语句中使用 Mysql 的 JOIN 来联合多表查询。
JOIN 按照功能大致分为如下三类:
INNER JOIN(内连接, 或等值连接):获取两个表中字段匹配关系的记录。
LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
RIGHT JOIN(右连接):与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
| w3cschool_author |w3cschool_count |
+—————–+—————-+
| mahran | 20 |
| mahnaz | NULL |
| Jen | NULL |
| Gill | 20 |
| John Poul | 1 |
| Sanjay | 1 |
+—————–+—————-+
mysql SELECT * fromw3cschool_tbl;
+————-+—————-+—————–+—————–+
| w3cschool_id | w3cschool_title | w3cschool_author |submission_date |
+————-+—————-+—————–+—————–+
| 1 | Learn PHP | John Poul |2007-05-24 |
| 2 | LearnMySQL | Abdul S | 2007-05-24 |
| 3 | JAVATutorial | Sanjay | 2007-05-06 |
连接以上两张表来读取 w3cschool_tbl 表中所有 w3cschool_author 字段在 tcount_tbl 表对应的 w3cschool_count 字段值:
mysql SELECTa.w3cschool_id, a.w3cschool_author, b.w3cschool_count FROM w3cschool_tbl aINNER JOIN tcount_tbl b ON a.w3cschool_author = b.w3cschool_author;
+———–+—————+————–+
| w3cschool_id | w3cschool_author | w3cschool_count |
+———–+—————+————–+
| 1 | John Poul | 1 |
| 3 | Sanjay | 1 |
w3cschool_tbl 为左表,tcount_tbl 为右表,
mysql SELECTa.w3cschool_id, a.w3cschool_author, b.w3cschool_count FROM w3cschool_tbl a LEFTJOIN tcount_tbl b ON a.w3cschool_author = b.w3cschool_author;
+————-+—————–+—————-+
| w3cschool_id | w3cschool_author | w3cschool_count |
+————-+—————–+—————-+
| 1 | John Poul | 1 |
| 2 | Abdul S | NULL |
| 3 | Sanjay | 1 |
左边的数据表 w3cschool_tbl 的所有选取的字段数据,即便在右侧表 tcount_tbl 中没有对应的 w3cschool_author 字段值 Abdul S。
MySQL NULL
IS NULL: 当列的值是 NULL, 此运算符返回 true。
IS NOT NULL: 当列的值不为 NULL, 运算符返回 true。
NULL 值与任何其它值的比较(即使是 NULL)永远返回 false,
使用 PHP 脚本处理 NULL 值:
PHP 脚本中你可以在 if…else 语句来处理变量是否为空,并生成相应的条件语句。
MySQL 正则表达式
28.MySQL 中使用 REGEXP 操作符来进行正则表达式匹配。
^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 \n 或 \r 之后的位置。
$ 匹配输入字符串的结束位置。如果设置了 RegExp 对象的 Multiline 属性,$ 也匹配 \n 或 \r 之前的位置。
. 匹配除 \n 之外的任何单个字符。要匹配包括 \n 在内的任何字符,请使用象 [.\n] 的模式。
实例 (表名:person_tbl) 来加深我们的理解:
查找 name 字段中以 st 为开头的所有数据:
mysql SELECT name FROM person_tbl WHERE name REGEXP ^st
查找 name 字段中以 ok 为结尾的所有数据:
mysql SELECT name FROM person_tbl WHERE name REGEXP ok$
查找 name 字段中包含 mar 字符串的所有数据:
mysql SELECT name FROM person_tbl WHERE name REGEXP mar
查找 name 字段中以元音字符开头或以 ok 字符串结尾的所有数据:
mysql SELECT name FROM person_tbl WHERE name REGEXP ^[aeiou]|ok$
MySQL 事务
29.MySQL 事务主要用于处理操作量大,复杂度高的数据。
在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务
事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行
事务用来管理 insert,update,delete 语句
事务必须满足 4 个条件(ACID):Atomicity(原子性)、Consistency(稳定性)、Isolation(隔离性)、Durability(可靠性)
1、事务的原子性:一组事务,要么成功;要么撤回。
2、稳定性:有非法数据(外键约束之类),事务撤回。
3、隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的 100% 隔离,需要牺牲速度。
4、可靠性:软、硬件崩溃后,InnoDB 数据表驱动会利用日志文件重构修改。可靠性和高速度不可兼得,innodb_flush_log_at_trx_commit 选项 决定什么时候吧事务保存到日志里。
在 MySQL 控制台使用事务来操作:
1,开始一个事务
start transaction
2, 做保存点
savepoint 保存点名称
3, 操作
4,可以回滚,可以提交,没有问题,就提交,有问题就回滚。
PHP 中使用事务实例
mysql_query(SETAUTOCOMMIT=0 // 设置为不自动提交,因为 MYSQL 默认立即执行 mysql_query( BEGIN // 开始事务定义
if(!mysql_query( insertinto trans (id) values(2) ))
mysql_query( ROOLBACK // 判断当执行失败时回滚
mysql_query( COMMIT // 执行事务
mysql_close($handler);
MySQL ALTER
30.修改数据表名或者修改数据表字段时,就需要使用到 MySQL ALTER 命令。
使用了 ALTER 命令及 DROP 子句来删除以上创建表的 i 字段:
mysql ALTER TABLEtestalter_tbl DROP i;
数据表中只剩余一个字段则无法使用 DROP 来删除字段。
ADD 子句来想数据表中添加列,在表 testalter_tbl 中添加 i 字段,并定义数据类型:
mysql ALTER TABLEtestalter_tbl ADD i INT;
以下 ALTERTABLE 语句, 在执行成功后,使用 SHOW COLUMNS 查看表结构的变化:
ALTER TABLEtestalter_tbl DROP i;
ALTER TABLEtestalter_tbl ADD i INT FIRST;
ALTER TABLEtestalter_tbl DROP i;
ALTER TABLEtestalter_tbl ADD i INT AFTER c;
FIRST 和 AFTER 关键字只占用于 ADD 子句,所以如果你想重置数据表字段的位置就需要先使用 DROP 删除字段然后使用 ADD 来添加字段并设置位置。
修改字段类型及名称:
31.在 ALTER 命令中使用 MODIFY 或 CHANGE 子句。
把字段 c 的类型从 CHAR(1) 改为 CHAR(10),可以执行以下命令:
mysql ALTER TABLEtestalter_tbl MODIFY c CHAR(10);
使用 CHANGE 子句, 语法有很大的不同。在 CHANGE 关键字之后,紧跟着的是你要修改的字段名,然后指定新字段的类型及名称。尝试如下实例:
mysql ALTER TABLEtestalter_tbl CHANGE i j BIGINT;
p 如果你现在想把字段 j 从 BIGINT 修改为 INT,SQL 语句如下:
mysql ALTER TABLEtestalter_tbl CHANGE j j INT;
ALTER 修改字段的默认值,mysql ALTER TABLEtestalter_tbl ALTER i SET DEFAULT 1000;
ALTER 及 DROP 删除字段的默认值, ALTER TABLEtestalter_tbl ALTER i DROP DEFAULT;
ALTER 及 TYPE 修改数据表类型,mysql ALTER TABLEtestalter_tbl TYPE = MYISAM;
ALTER TABLE 使用 RENAME 修改数据表的名称,mysql ALTER TABLEtestalter_tbl RENAME TO alter_tbl;
MySQL 索引
索引可以大大提高 MySQL 的检索速度
索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索包含多个列。
创建索引,确保该索引是应用在 SQL 查询语句的条件 (一般作为 WHERE 子句的条件)。
索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行 INSERT、UPDATE 和 DELETE。因为更新表时,MySQL 不仅要保存数据,还要保存一下索引文件。
3 方式创建普通索引
CREATE INDEX indexName ONmytable(username(length));
如果是 CHAR,VARCHAR 类型,length 可以小于字段实际长度;如果是 BLOB 和 TEXT 类型,必须指定 length。
修改表结构
ALTER mytable ADD INDEX[indexName] ON (username(length))
创建表的时候直接指定
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOTNULL,
INDEX [indexName](username(length))
);
删除索引的语法
DROP INDEX [indexName] ONmytable;
唯一索引:前面加 UNIQUE
使用 ALTER 命令添加和删除索引
有四种方式来添加数据表的索引:
ALTER TABLE tbl_name ADD PRIMARYKEY (column_list): 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为 NULL。
ALTER TABLE tbl_name ADD UNIQUEindex_name (column_list): 这条语句创建索引的值必须是唯一的(除了 NULL 外,NULL 可能会出现多次)。
ALTER TABLE tbl_name ADD INDEXindex_name (column_list): 添加普通索引,索引值可出现多次。
ALTER TABLE tbl_name ADD FULLTEXTindex_name (column_list): 该语句指定了索引为 FULLTEXT,用于全文索引。
使用 ALTER 命令添加和删除主键
主键只能作用于一个列上,添加主键索引时,你需要确保该主键默认不为空(NOT NULL)。实例如下:
mysql ALTER TABLEtestalter_tbl MODIFY i INT NOT NULL;
mysql ALTER TABLEtestalter_tbl ADD PRIMARY KEY (i);
你也可以使用 ALTER 命令删除主键:
mysql ALTER TABLEtestalter_tbl DROP PRIMARY KEY;
SHOW INDEX 命令列出表中的相关的索引信息。可以通过添加 \G 来格式化输出信息。
mysql SHOW INDEX FROMtable_name\G
MySQL 临时表
临时表只在当前连接可见,当关闭连接时,MySQL 会自动删除表并释放所有空间。
mysql CREATE TEMPORARY TABLE SalesSummary
mysql DROP TABLE SalesSummary;
MySQL 复制表
创建新的克隆表 clone_tbl。如果你想拷贝数据表的数据你可以使用 INSERT INTO… SELECT 语句来实现。
mysql INSERT INTOclone_tbl (w3cschool_id,
– w3cschool_title,
– w3cschool_author,
– submission_date)
– SELECT w3cschool_id,w3cschool_title,
– w3cschool_author,submission_date
– FROM w3cschool_tbl;
MySQL 元数据
想知道 MySQL 以下三种信息:
查询结果信息:SELECT,UPDATE 或 DELETE 语句影响的记录数。
数据库和数据表的信息:包含了数据库及数据表的结构信息。
MySQL 服务器信息:包含了数据库服务器的当前状态,版本号等。
(1)使用 do() 执行 $query
my $count = $dbh- do($query);
(2)使用 prepare()及 execute() 执行 $query
my $sth =$dbh- prepare ($query);
my $count =$sth- execute ();
在 PHP 中,使用 mysql_affected_rows() 函数获取查询语句影响的记录数。
$result_id =mysql_query ($query, $conn_id);
# 如果查询失败返回
$count = ($result_id ?mysql_affected_rows ($conn_id) : 0);
print ($countrows were affected\n
数据库和数据表列表
PERL 实例
# 获取当前数据库中所有可用的表。
my @tables =$dbh- tables ( );
foreach $table (@tables){ print Table Name $table\n}
PHP 实例:
$db_list =mysql_list_dbs($con);
while ($db = mysql_fetch_object($db_list))
echo $db- Database . br/
}
MySQL 序列
MySQL 序列是一组整数:1, 2, 3, …,
用 MySQLAUTO_INCREMENT 来定义列。
mysql CREATE TABLEinsect
– (
– id INT UNSIGNED NOT NULLAUTO_INCREMENT,
用 SQL 中的 LAST_INSERT_ID() 函数来获取最后的插入表中的自增列的值。
PERL 实例
使用 mysql_insertid 属性来获取 AUTO_INCREMENT 的值。实例如下:
$dbh- do(INSERT INTO insect (name,date,origin)
VALUES(moth , 2001-09-14 , windowsill)
my $seq =$dbh- {mysql_insertid};
PHP 实例
PHP 通过 mysql_insert_id ()函数来获取执行的插入 SQL 语句中 AUTO_INCREMENT 列的值。
mysql_query(INSERT INTO insect (name,date,origin)
VALUES(moth , 2001-09-14 , windowsill) ,$conn_id);
$seq = mysql_insert_id($conn_id);
重置序列
删除了数据表中的多条记录,并对剩下数据的 AUTO_INCREMENT 列进行重新排列,那么你可以通过删除自增的列,然后重新添加来实现。
mysql ALTER TABLEinsect DROP id;
mysql ALTER TABLEinsect
– ADD id INT UNSIGNED NOT NULLAUTO_INCREMENT FIRST,
– ADD PRIMARY KEY (id);
一般情况下序列的开始值为 1,但如果你需要指定一个开始值 100:
– id INT UNSIGNEDNOT NULL AUTO_INCREMENT = 100,
或在表创建成功后,通过以下语句来实现:
mysql ALTER TABLE tAUTO_INCREMENT = 100;
MySQL 处理重复数据
防止表中出现重复数据
在 MySQL 数据表中设置指定的字段为 PRIMARY KEY(主键)或者 UNIQUE(唯一)索引保证数据的唯一性。
设置表中字段 first_name,last_name 数据不能重复,你可以设置双主键模式来设置数据的唯一性,如果你设置了双主键,那么那个键的默认值不能为 NULL,可设置为 NOT NULL。如下所示:
CREATE TABLE person_tbl
first_name CHAR(20) NOT NULL,
last_name CHAR(20) NOT NULL,
sexCHAR(10),
PRIMARY KEY (last_name, first_name)
);
INSERT IGNOREINTO 与 INSERT INTO 的区别就是 INSERT IGNORE 会忽略数据库中已经存在的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。这样可以保留数据库中已经存在数据,达到在间隙中插入数据的目的。
用了 INSERT IGNORE INTO,执行后不会出错,也不会向数据表中插入重复数据:
mysql INSERT IGNORE INTO person_tbl(last_name, first_name)
– VALUES(Jay , Thomas
Query OK, 1 row affected (0.00 sec)
REPLACE INTO into 如果存在 primary 或 unique 相同的记录,则先删除掉。再插入新记录。
UNIQUE(last_name, first_name)
查询重复记录
select user_name,count(*) as count fromuser_table group by user_name having count
select * from people
where peopleId in (select peopleId from peoplegroup by peopleId having count(peopleId) 1)
统计重复数据
统计表中 first_name 和 last_name 的重复记录数:
mysql SELECT COUNT(*) as repetitions,last_name, first_name
- FROM person_tbl
- GROUP BY last_name, first_name
- HAVING repetitions 1;
过滤重复数据
读取不重复的数据可以在 SELECT 语句中使用 DISTINCT 关键字来过滤重复数据。
mysql SELECT DISTINCT last_name, first_name
– FROM person_tbl
– ORDER BY last_name;
也可以使用 GROUP BY 来读取数据表中不重复的数据:
mysql SELECT last_name, first_name
- FROM person_tbl
- GROUP BY (last_name, first_name);
删除重复数据
删除数据表中的重复数据,你可以使用以下的 SQL 语句:
mysql CREATE TABLE tmp SELECT last_name,first_name, sex
- FROMperson_tbl;
- GROUP BY(last_name, first_name);
mysql DROP TABLE person_tbl;
mysql ALTER TABLE tmp RENAME TO person_tbl;
也可以在数据表中添加 INDEX(索引)和 PRIMAY KEY(主键)这种简单的方法来删除表中的重复记录。方法如下:
mysql ALTER IGNORE TABLE person_tbl
- ADD PRIMARY KEY (last_name, first_name);
MySQL 及 SQL 注入
没有过滤特殊字符时,出现的 SQL 情况:
// 设定 $name 中插入了我们不需要的 SQL 语句
$name = Qadir DELETE FROM users;
mysql_query(SELECT* FROM users WHERE name= {$name}
以上的注入语句中,我们没有对 $name 的变量进行过滤,$name 中插入了我们不需要的 SQL 语句,将删除 users 表中的所有数据。
防止 SQL 注入,注意以下几个要点:
1. 永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双 – 进行转换等。
2. 永远不要使用动态拼装 sql,可以使用参数化的 sql 或者直接使用存储过程进行数据查询存取。
3. 永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
4. 不要把机密信息直接存放,加密或者 hash 掉密码和敏感的信息。
5. 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
6.sql 注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用 sql 注入检测工具 jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN 等。采用 MDCSOFT-IPS 可以有效的防御 SQL 注入,XSS 攻击等。
在脚本语言,如 Perl 和 PHP 可以对用户输入的数据进行转义从而来防止 SQL 注入。
PHP 的 MySQL 扩展提供了 mysql_real_escape_string()函数来转义特殊的输入字符。
if (get_magic_quotes_gpc())
$name = stripslashes($name);
$name =mysql_real_escape_string($name);
mysql_query(SELECT * FROMusers WHERE name= {$name}
Like 语句中的注入
like 查询时,如用户输入的值有 _ 和 %,则会出现这种情况:用户本只想查询 abcd_,查询结果中却有 abcd_、abcde、abcdf 等等;用户要查询 30%(注:百分之三十)时也会出现问题。
在 PHP 脚本中我们可以使用 addcslashes()函数来处理以上情况,如下实例:
$sub =addcslashes(mysql_real_escape_string( %something_), %_
// $sub == \%something\_
mysql_query(SELECT * FROMmessages WHERE subject LIKE {$sub}%
addcslashes() 函数在指定的字符前添加反斜杠。
语法格式:
addcslashes(string,characters)
MySQL 导出数据
使用 SELECT …INTO OUTFILE 语句导出数据
将数据表 w3cschool_tbl 数据导出到 /tmp/tutorials.txt 文件中:
mysql SELECT * FROMtutorials_tbl
– INTO OUTFILE /tmp/tutorials.txt
生成一个文件,各值用逗号隔开。这种格式可以被许多程序使用。
SELECT a,b,a+b INTOOUTFILE /tmp/result.text
FIELDS TERMINATED BY , OPTIONALLY ENCLOSED BY
LINES TERMINATED BY \n
FROM test_table;
SELECT … INTO OUTFILE 语句有以下属性:
LOAD DATA INFILE 是 SELECT … INTO OUTFILE 的逆操作,SELECT 句法。为了将一个数据库的数据写入一个文件,使用 SELECT … INTO OUTFILE,为了将文件读回数据库,使用 LOAD DATA INFILE。
SELECT…INTO OUTFILE file_name 形式的 SELECT 可以把被选择的行写入一个文件中。该文件被创建到服务器主机上,因此您必须拥有 FILE 权限,才能使用此语法。
输出不能是一个已存在的文件。防止文件数据被篡改。
你需要有一个登陆服务器的账号来检索文件。否则 SELECT … INTO OUTFILE 不会起任何作用。
在 UNIX 中,该文件被创建后是可读的,权限由 MySQL 服务器所拥有。这意味着,虽然你就可以读取该文件,但可能无法将其删除
导出表作为原始数据
mysqldump 是 MySQL 用于转存储数据库的实用程序。
将数据表 tutorials_tbl 导出到 /tmp 目录中:
$ mysqldump -u root -p–no-create-info \
–tab=/tmp W3CSCHOOL w3cschool_tbl
password ******
导出整个数据库的数据,可以使用以下命令:
$ mysqldump -u root -pW3CSCHOOL database_dump.txt
password ******
备份所有数据库,可以使用以下命令:
$ mysqldump -u root -p–all-databases database_dump.txt
password ******
在 mysqldump 命令中指定数据库名及数据表。
在源主机上执行以下命令,将数据备份至 dump.txt 文件中:
$ mysqldump -u root -pdatabase_name table_name dump.txt
password *****
将备份的数据库导入到 MySQL 服务器中,可以使用以下命令,使用以下命令你需要确认数据库已经创建:
$ mysql -u root -pdatabase_name dump.txt password *****
以下命令将导出的数据直接导入到远程的服务器上,但请确保两台服务器是相通的,是可以相互访问的:/p
$ mysqldump -u root -pdatabase_name \
| mysql -h other-host.com database_name
MySQL 导入数据
从当前目录中读取文件 dump.txt,将该文件中的数据插入到当前数据库的 mytbl 表中。
mysql LOAD DATALOCAL INFILE dump.txt INTO TABLE mytbl;
如果用户指定一个 FIELDS 子句,它的子句(TERMINATED BY、[OPTIONALLY] ENCLOSED BY 和 ESCAPED BY) 也是可选的,不过,用户必须至少指定它们中的一个。
mysql LOAD DATALOCAL INFILE dump.txt INTO TABLE mytbl
– FIELDS TERMINATED BY :
– LINES TERMINATED BY \r\n
指定列的顺序。
如,在数据文件中的列顺序是 a,b,c,但在插入表的列顺序为 b,c,a,则数据导入语法如下:
mysql LOAD DATALOCAL INFILE dump.txt
– INTO TABLE mytbl (b, c, a);
使用 mysqlimport 导入数据
mysqlimport 客户端提供了 LOADDATA INFILEQL 语句的一个命令行接口。mysqlimport 的大多数选项直接对应 LOAD DATA INFILE 子句。
从文件 dump.txt 中将数据导入到 mytbl 数据表中, 可以使用以下命令:
$ mysqlimport -u root-p –local database_name dump.txt
password *****
mysqlimport 命令可以指定选项来设置指定格式, 命令语句格式如下:
$ mysqlimport -u root-p –local –fields-terminated-by= : \
–lines-terminated-by= \r\n database_name dump.txt
password *****
mysqlimport 语句中使用 –columns 选项来设置列的顺序:
$ mysqlimport -u root-p –local –columns=b,c,a \
database_name dump.txt
password *****
感谢各位的阅读!关于“MySQL 基础的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!