语法:
下面是通用的SQL SELECT命令的语法来从MySQL表提取数据:
?123 SELECT field1, field2,...fieldN table_name1, table_name2... [WHERE Clause] [OFFSET M ][LIMIT N]
1.可以使用一个或多个以逗号分隔的表,包括各种使用WHERE子句条件。但是WHERE子句的SELECT命令是一个可选部分。
2.可以在一个单一的SELECT命令读取一个或多个字段。
3.可以指定星号(*)的字段的地方。在这种情况下,SELECT将返回所有的字段4.可以使用WHERE子句指定任何条件。
5.可以指定偏移用SELECT将开始返回记录的偏移量。默认情况下,偏移量为06.可以限制返回的使用LIMIT属性的数量。
从命令提示符获取数据:
这将使用SQL SELECT命令来从MySQL表tutorials_tbl获取数据例子:
下面的例子将返回所有记录tutorials_tbl表:
?123456789101112131415 root@host# mysql -u root -p passwordEnter password:******* mysql>use TUTORIALSDatabase changed mysql>SELECT * from tutorials_tbl +-------------+----------------+-----------------+-----------------+ | tutorial_id | tutorial_title | tutorial_author | submission_date | +-------------+----------------+-----------------+-----------------+ | 1 | Learn PHP | John Poul| 2007-05-21 | | 2 | Learn MySQL | Abdul S | 2007-05-21 | | 3 | JAVA Tutorial | Sanjay | 2007-05-21 | +-------------+----------------+-----------------+-----------------+ 3 rows in set (0.01 sec) mysql>
使用PHP脚本获取数据:
您可以使用相同的SQL SELECT命令进入PHP函数mysql_query()。这个函数是用来执行SQL命令后,另一个PHP函数mysql_fetch_array()可以用来获取所有选定的数据。这个函数返回的行作为一个关联数组/数字数组或两者。如果没有更多的行这个函数返回FALSE。
下面是一个简单的例子,获取记录tutorials_tbl表。
例子:
试试下面的例子显示tutorials_tbl表的所有记录。
?123456789101112131415161718192021222324252627282930 <?php $dbhost = 'localhost:3036'$dbuser = 'root'$dbpass = 'rootpassword'$conn = mysql_connect($dbhost, $dbuser, $dbpass)if(! $conn ) { die('Could not connect: ' . mysql_error())} $sql = 'SELECT tutorial_id, tutorial_title, tutorial_author, submission_date FROM tutorials_tbl' mysql_select_db('TUTORIALS')$retval = mysql_query( $sql, $conn )if(! $retval ) { die('Could not get data: ' . mysql_error())} while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) { echo "Tutorial ID :{$row['tutorial_id']} <br>". "Title: {$row['tutorial_title']} <br>". "Author: {$row['tutorial_author']} <br>". "Submission Date : {$row['submission_date']} <br>". "--------------------------------<br>"} echo "Fetched data successfully\n"mysql_close($conn)?>
这些行的内容被分配到变量$row,行中的值,然后打印。
注: 一定要记住,当要插入到一个字符串数组的值直接用花括号。
在上面的例子中不断MYSQL_ASSOC作为PHP函数mysql_fetch_array()第二个参数,以便它返回一个关联数组的行为。一个关联数组,可以使用他们的名字,而不是使用索引访问字段。
PHP提供了另一种称为mysql_fetch_assoc()函数也返回该行作为关联数组。
实例:
试试下面的例子显示从tutorial_tbl表的所有记录,使用mysql_fetch_assoc()函数。
?123456789101112131415161718192021222324252627282930 <?php $dbhost = 'localhost:3036'$dbuser = 'root'$dbpass = 'rootpassword'$conn = mysql_connect($dbhost, $dbuser, $dbpass)if(! $conn ) { die('Could not connect: ' . mysql_error())} $sql = 'SELECT tutorial_id, tutorial_title, tutorial_author, submission_date FROM tutorials_tbl' mysql_select_db('TUTORIALS')$retval = mysql_query( $sql, $conn )if(! $retval ) { die('Could not get data: ' . mysql_error())} while($row = mysql_fetch_assoc($retval)) { echo "Tutorial ID :{$row['tutorial_id']} <br>". "Title: {$row['tutorial_title']} <br>". "Author: {$row['tutorial_author']} <br>". "Submission Date : {$row['submission_date']} <br>". "--------------------------------<br>"} echo "Fetched data successfully\n"mysql_close($conn)?>
也可以使用常量MYSQL_NUM,作为第二个参数的PHP函数mysql_fetch_array()。这将导致该函数返回一个数字索引的数组。
实例:
试试下面的例子显示使用MYSQL_NUM参数tutorials_tbl表中的所有记录。
?123456789101112131415161718192021222324252627282930 <?php $dbhost = 'localhost:3036'$dbuser = 'root'$dbpass = 'rootpassword'$conn = mysql_connect($dbhost, $dbuser, $dbpass)if(! $conn ) { die('Could not connect: ' . mysql_error())} $sql = 'SELECT tutorial_id, tutorial_title, tutorial_author, submission_date FROM tutorials_tbl' mysql_select_db('TUTORIALS')$retval = mysql_query( $sql, $conn )if(! $retval ) { die('Could not get data: ' . mysql_error())} while($row = mysql_fetch_array($retval, MYSQL_NUM)) { echo "Tutorial ID :{$row[0]} <br>". "Title: {$row[1]} <br>". "Author: {$row[2]} <br>". "Submission Date : {$row[3]} <br>". "--------------------------------<br>"} echo "Fetched data successfully\n"mysql_close($conn)?>
所有上述三个例子,将产生相同的结果。
释放内存:
它是一种很好的做法,在每一个SELECT语句释放游标内存。这可以通过使用PHP函数了mysql_free_result()。下面的例子来说明它是如何被使用的。
实例:
试试下面的例子
?12345678910111213141516171819202122232425262728293031 <?php $dbhost = 'localhost:3036'$dbuser = 'root'$dbpass = 'rootpassword'$conn = mysql_connect($dbhost, $dbuser, $dbpass)if(! $conn ) { die('Could not connect: ' . mysql_error())} $sql = 'SELECT tutorial_id, tutorial_title, tutorial_author, submission_date FROM tutorials_tbl' mysql_select_db('TUTORIALS')$retval = mysql_query( $sql, $conn )if(! $retval ) { die('Could not get data: ' . mysql_error())} while($row = mysql_fetch_array($retval, MYSQL_NUM)) { echo "Tutorial ID :{$row[0]} <br>". "Title: {$row[1]} <br>". "Author: {$row[2]} <br>". "Submission Date : {$row[3]} <br>". "--------------------------------<br>"} mysql_free_result($retval)echo "Fetched data successfully\n"mysql_close($conn)?>
在获取数据的同时可以编写复杂的SQL,只要喜欢。程序将保持与上述相同。
表数据导出到一个文本文件最简单的方法是使用SELECT... INTO OUTFILE语句的查询结果直接导出到一个文件在服务器主机上。
导出数据的SELECT...INTO OUTFILE声明:
这句话的语法结合了常规的SELECT INTO OUTFILE文件名的末尾。默认的输出格式是相同的LOAD DATA,所以下面的语句导出tutorials_tbl的表制表符分隔的,换行结尾的文件到/tmp/tutorials.txt:
mysql>SELECT * FROM tutorials_tbl
->INTO OUTFILE '/tmp/tutorials.txt'
也可以更改输出格式,使用选项来指示如何引用和分隔列和记录。 CRLF终止线要导出tutorial_tbl的CSV格式的表格,使用这样的语句:
mysql>SELECT * FROM passwd INTO OUTFILE '/tmp/tutorials.txt'
->FIELDS TERMINATED BY ',' ENCLOSED BY '"'
->LINES TERMINATED BY '\r\n'
SELECT ... INTO OUTFILE具有以下属性:
由MySQL服务器直接创建输出文件,这样的文件名应指定您希望在服务器主机上的文件将被写入。没有本地版本的LOAD DATA LOCAL版本的类似的语句。
必须要有MySQL的FILE权限才能执行的SELECT... INTO语句。
输出文件必须不存在。这可以防止MySQL从会破坏文件可能重要。
应该在服务器主机上或一些方法来检索文件从该主机的登录帐户。否则SELECT... INTO OUTFILE可能是没有价值的。
在Unix下,创造了世界可读的文件和所拥有的MySQL服务器。这意味着虽然就可以读取该文件,但是不能够删除它。
作为原始数据的导出表:
使用mysqldump程序复制或备份表和数据库。它可以写表输出的原始数据文件或为一组的INSERT语句重新创建该表中的记录。
转储一个表,必须指定一个数据文件 - 选项卡上的选项,表示想要的MySQL服务器写入文件所在的目录。
使用mysqldump程序复制或备份表和数据库。它可以写表输出的原始数据文件,或为一组的INSERT语句重新创建该表中的记录。
转储一个表,必须指定一个数据文件 - 选项卡上的选项,表示想要的MySQL服务器写入文件所在的目录。
$ mysqldump -u root -p --no-create-info \--tab=/tmp TUTORIALS tutorials_tbl
password ******
在SQL格式导出表的内容或定义:
一个表中的SQL格式导出到一个文件,使用这样的命令:
$ mysqldump -u root -p TUTORIALS tutorials_tbl >dump.txtpassword ******
这将创建文件的内容如下:
-- MySQL dump 8.23--
-- Host: localhost Database: TUTORIALS
---------------------------------------------------------
-- Server version 3.23.58
--
-- Table structure for table `tutorials_tbl`
--
CREATE TABLE tutorials_tbl (
tutorial_id int(11) NOT NULL auto_increment,
tutorial_title varchar(100) NOT NULL default '',
tutorial_author varchar(40) NOT NULL default '',
submission_date date default NULL,
PRIMARY KEY (tutorial_id),
UNIQUE KEY AUTHOR_INDEX (tutorial_author)
) TYPE=InnoDB
--
-- Dumping data for table `tutorials_tbl`
--
INSERT INTO tutorials_tbl
VALUES (1,'Learn PHP','John Poul','2007-05-24')
INSERT INTO tutorials_tbl
VALUES (2,'Learn MySQL','Abdul S','2007-05-24')
INSERT INTO tutorials_tbl
VALUES (3,'JAVA Tutorial','Sanjay','2007-05-06')
要转储多个表,他们的名字所有的数据库名称参数。要转储整个数据库,不指定任何表后的数据库,如下所示:
$ mysqldump -u root -p TUTORIALS >database_dump.txtpassword ******
所有可用的数据库备份主机上使用以下命令:
$ mysqldump -u root -p --all-databases >database_dump.txtpassword ******
在SQL格式导出表的内容或定义:
这些方法可用于实现数据库的备份策略。
表或数据库复制到另一台主机:
如果要复制的表或数据库从一个MySQL服务器,然后使用mysqldump数据库名和表名。
在源主机上运行以下命令。这将转储完整的数据库到dump.txt文件:
$ mysqldump -u root -p database_name table_name >dump.txtpassword *****
复制完整的数据库,而不使用一个特定的表名称,如上面所解释。
现在,FTP dump.txt文件在另一台主机上,使用下面的命令。在运行此命令之前,请确保已创建目标服务器上的数据库名称。
$ mysql -u root -p database_name <dump.txtpassword *****
另一种方法,而无需使用一个中间文件来完成,mysqldump输出直接通过网络发送到远程的MySQL服务器。如果可以连接到两台服务器的cookbook 数据库所在的主机上,使用以下命令:
$ mysqldump -u root -p database_name \states | mysql -h other-host.com database_name
命令mysqldump的一半连接到本地服务器,并写入转储输出管道。 MySQL的一半的命令连接到远程MySQL服务器otherhost.com。它读取输入管和其他host.com服务器发送的每个语句。
有时候我们会不小心对一个大表进行了 update,比如说写错了 where 条件......
此时,如果 kill 掉 update 线程,那回滚 undo log 需要不少时间。如果放置不管,也不知道 update 会持续多久。
那我们能知道 update 的进度么?
实验
我们先创建一个测试数据库:
快速创建一些数据:
连续执行同样的 SQL 数次,就可以快速构造千万级别的数据:
查看一下总的行数:
我们来释放一个大的 update:
然后另起一个 session,观察 performance_schema 中的信息:
可以看到,performance_schema 会列出当前 SQL 从引擎获取的行数。
等 SQL 结束后,我们看一下 update 从引擎总共获取了多少行:
可以看到该 update 从引擎总共获取的行数是表大小的两倍,那我们可以估算:update 的进度 = (rows_examined) / (2 * 表行数)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)