[置顶] mysql的基本操作
程序员文章站
2022-05-15 15:48:13
...
mysql常用语句: 查看已经安装的mysql软件 yum list installed | grep mysql 安装rpm式的mysql包 rpm -i MySQL-5.0.9-0.i386.rpm rpm式mysql可选包的安装 rpm -i MySQL-client-5.0.9-0.i386.rpm rpm -i MySQL-devel-5.0.9-0.i386.rpm rpm -i MySQL-shared-5.0
mysql常用语句:
查看已经安装的mysql软件yum list installed | grep mysql
安装rpm格式的mysql包
rpm -i MySQL-5.0.9-0.i386.rpmrpm格式mysql可选包的安装
rpm -i MySQL-client-5.0.9-0.i386.rpm
rpm -i MySQL-devel-5.0.9-0.i386.rpm
rpm -i MySQL-shared-5.0.9-0.i386.rpm
rpm -i MySQL-bench-5.0.9-0.i386.rpm
启动mysqlchkconfig mysqld on
service iptables start
查看mysql基于的系统信息mysqladmin --version
进入mysql
mysql
查看mysql版本
select version ();
查看数据库
show databases;
创建root用户,默认root用户密码为空
mysqladmin -u root password "new_password";
用创建好的root用户登录mysql服务器
mysql -u root -p
查看mysql服务器是否启动
ps -ef | grep mysqld
如果MySql已经启动,以上命令将输出mysql进程列表,如果mysql未启动,你可以使用以下命令来启动mysql服务器
cd /usr/bin
./mysqld_safe &(后台执行)
关闭mysql服务器
cd /usr/bin
./mysqladmin -u root -p shutdown
mysql用户设置
在添加用户时,请注意使用MySQL提供的 PASSWORD() 函数来对密码进行加密。
注意:在注意需要执行 FLUSH PRIVILEGES 语句。 这个命令执行后会重新载入授权表。
如果你不使用该命令,你就无法使用新创建的用户来连接mysql服务器,除非你重启mysql服务器。
你可以在创建用户时,为用户指定权限,在对应的权限列中,在插入语句中设置为 'Y' 即可,用户权限列表如下:
Select_priv
Insert_priv
Update_priv
Delete_priv
Create_priv
Drop_priv
Reload_priv
Shutdown_priv
Process_priv
File_priv
Grant_priv
References_priv
Index_priv
Alter_priv
mysql -u root -p
use mysql;
INSERT INTO user(host,user,password,select_priv,insert_priv,update_priv) VALUES ('localhost','guest',PASSWORD('guest123'),'Y','Y','Y');
FLUSH PRIVILEGES;
SELECT host,user,password FROM user WHERE user='guest';
另外一种添加用户的方法为通过SQL的 GRANT 命令,你下命令会给指定数据库TUTORIALS添加用户 zara ,密码为 zara123
mysql -u root -p password;
use mysql;
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
ON TUTORIALS.*
TO 'zara'@'localhost'
IDENTIFIED BY 'zara123';
管理mysql的命令:
列出mysql数据库管理系统的数据库列表SHOW DATABASES;
选择要操作的mysql数据库,使用该命令后所有mysql命令都只针对数据库
use RUNOOB;
显示指定数据库的所有表
SHOW TABLES;
显示数据表的属性
SHOW COLUMNS FROM runoob_tbl;
显示数据表的详细索引信息
SHOW INDEX FROM runoob_tbl;
显示数据库 RUNOOB 中所有表的信息
SHOW TABLE STATUS FROM RUNOOB;
查询表名以runoob开头的表的信息
SHOW TABLE STATUS from RUNOOB LIKE 'runoob%';
加上 \G,查询结果按列打印
SHOW TABLE STATUS from RUNOOB LIKE 'runoob%'\G;
退出mysql
exit
注意:所有的数据库名,表名,表字段都是区分大小写的。所以你在使用SQL命令时需要输入正确的名称。
使用普通用户,你可能需要特定的权限来创建或者删除 MySQL 数据库。
所以我们这边使用root用户登录,root用户拥有最高权限,可以使用 mysql mysqladmin 命令来创建数据库,此数据库在root用户的mysql下面
mysqladmin -u root -p create RUNOOB
删除数据库RUNOOB
mysqladmin -u root -p drop RUNOOB
创建mysql数据表
use RUNOOB;
CREATE TABLE runoob_tbl(
runoob_id INT NOT NULL AUTO_INCREMENT,
runoob_title VARCHAR(100) NOT NULL,
runoob_author VARCHAR(40) NOT NULL,
submission_date DATE,
PRIMARY KEY ( runoob_id )
);
删除数据表
mysql -u root -p
use RUNOOB;
DROP TABLE runoob_tbl;
插入数据
mysql -u root -p password;
use RUNOOB;
INSERT INTO runoob_tbl
(runoob_title, runoob_author, submission_date)
VALUES
("Learn PHP", "John Poul", NOW());
INSERT INTO runoob_tbl
(runoob_title, runoob_author, submission_date)
VALUES
("Learn MySQL", "Abdul S", NOW());
INSERT INTO runoob_tbl
(runoob_title, runoob_author, submission_date)
VALUES
("JAVA Tutorial", "Sanjay", '2007-05-06');
查询数据
mysql -u root -p password;
use RUNOOB;
SELECT * from runoob_tbl;
指定条件查询
读取 runoob_tbl 表中 runoob_author 字段值为 Sanjay 的所有记录:
mysql -u root -p password;
use RUNOOB;
SELECT * from runoob_tbl WHERE runoob_author='Sanjay';
区分大小写的查询
mysql -u root -p password;
use RUNOOB;
SELECT * from runoob_tbl WHERE BINARY runoob_author='sanjay';
更新数据
mysql -u root -p password;
use RUNOOB;
UPDATE runoob_tbl
SET runoob_title='Learning JAVA'
WHERE runoob_id=3;
删除数据
mysql -u root -p password;
use RUNOOB;
DELETE FROM runoob_tbl WHERE runoob_id=3;
匹配查询
mysql -u root -p password;
use RUNOOB;
SELECT * from runoob_tbl
WHERE runoob_author LIKE '%jay';
升序查询
mysql -u root -p password;
use RUNOOB;
SELECT * from runoob_tbl ORDER BY runoob_author ASC;
降序查询
SELECT * from runoob_tbl ORDER BY runoob_author DESC;
分组
需要以下数据:
SET NAMES utf8;
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS `employee_tbl`;
CREATE TABLE `employee_tbl` (
`id` int(11) NOT NULL,
`name` char(10) NOT NULL DEFAULT '',
`date` datetime NOT NULL,
`singin` tinyint(4) NOT NULL DEFAULT '0' COMMENT '登录次数',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
BEGIN;
INSERT INTO `employee_tbl` VALUES ('1', '小明', '2016-04-22 15:25:33', '1'), ('2', '小王', '2016-04-20 15:25:47', '3'), ('3', '小丽', '2016-04-19 15:26:02', '2'), ('4', '小王', '2016-04-07 15:26:14', '4'), ('5', '小明', '2016-04-11 15:26:40', '4'), ('6', '小明', '2016-04-04 15:26:54', '2');
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;
set names utf8;
查看表中所有的数据
SELECT * FROM employee_tbl;
使用 GROUP BY 语句 将数据表按名字进行分组,并统计每个人有多少条记录:
SELECT name, COUNT(*) FROM employee_tbl GROUP BY name;
在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)
将以上的数据表按名字进行分组,再统计每个人登录的次数:
SELECT name, SUM(singin) as singin_count FROM employee_tbl GROUP BY name WITH ROLLUP;
其中记录 NULL 表示所有人的登录次数。
我们可以使用 coalesce 来设置一个可以取代 NUll 的名称,
coalesce 语法:select coalesce(a,b,c);
参数说明:如果a==null,则选择b;如果b==null,则选择c;如果a!=null,则选择a;如果a b c 都为null ,则返回为null(没意义)。
以下实例中如果名字为空我们使用总数代替:
SELECT coalesce(name, '总数'), SUM(singin) as singin_count FROM employee_tbl GROUP BY name WITH ROLLUP;
连接查询
需要的数据:
SET NAMES utf8;
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS `runoob_tbl`;
CREATE TABLE `runoob_tbl` (
`runoob_id` int(11) NOT NULL,
`runoob_title` varchar(255) DEFAULT NULL,
`runoob_author` varchar(255) DEFAULT NULL,
`submission_date` date DEFAULT NULL,
PRIMARY KEY (`runoob_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
BEGIN;
INSERT INTO `runoob_tbl` VALUES ('1', 'Learn PHP', 'John Poul', '2007-05-24'), ('2', 'Learn MySQL', 'Abdul S', '2007-05-24'), ('3', 'JAVA Tutorial', 'Sanjay', '2007-05-06');
COMMIT;
DROP TABLE IF EXISTS `tcount_tbl`;
CREATE TABLE `tcount_tbl` (
`runoob_author` varchar(255) DEFAULT NULL,
`runoob_count` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
BEGIN;
INSERT INTO `tcount_tbl` VALUES ('mahran', '20'), ('mahran', null), ('Jen', null), ('Gill', '20'), ('John Poul', '1'), ('Sanjay', '1');
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;
查询数据
mysql -u root -p password;
use RUNOOB;
SELECT * FROM tcount_tbl;
SELECT * FROM runoob_tbl;
使用MySQL的INNER JOIN(也可以省略 INNER 使用 JOIN,效果一样)来连接以上两张表来读取runoob_tbl表中所有runoob_author字段在tcount_tbl表对应的runoob_count字段值:
SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a INNER JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
等价于
SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a, tcount_tbl b WHERE a.runoob_author = b.runoob_author;
使用MySQL的LEFT JOIN
会读取左边数据表的全部数据,即便右边表无对应数据。
mysql -u root -p password;
use RUNOOB;
SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a LEFT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
MySQL RIGHT JOIN 会读取右边数据表的全部数据,即便左边边表无对应数据。
mysql -u root -p password;
use RUNOOB;
SELECT b.runoob_id, b.runoob_author, a.runoob_count FROM tcount_tbl a RIGHT JOIN runoob_tbl b ON a.runoob_author = b.runoob_author;
mysql中NULL值的处理
以下实例中假设数据库 RUNOOB 中的表 tcount_tbl 含有两列 runoob_author 和 runoob_count, runoob_count 中设置插入NULL值。
mysql -u root -p password;
use RUNOOB;
create table tcount_tbl
(
runoob_author varchar(40) NOT NULL,
runoob_count INT
);
INSERT INTO tcount_tbl
(runoob_author, runoob_count) values ('mahran', 20);
INSERT INTO tcount_tbl
(runoob_author, runoob_count) values ('mahnaz', NULL);
INSERT INTO tcount_tbl
(runoob_author, runoob_count) values ('Jen', NULL);
INSERT INTO tcount_tbl
(runoob_author, runoob_count) values ('Gill', 20);
SELECT * from tcount_tbl;
= 和 != 运算符是不起作用的:
SELECT * FROM tcount_tbl WHERE runoob_count = NULL;
SELECT * FROM tcount_tbl WHERE runoob_count != NULL;
查找数据表中 runoob_count 列是否为 NULL,必须使用IS NULL和
IS NOT NULL
select * from tcount_tbl where runoob_count IS NULL;
select * from tcount_tbl where runoob_count is not null;
mysql正则表达式
查找runoob_author字段中以'm'为开头的所有数据:
SELECT runoob_author FROM tcount_tbl WHERE runoob_author REGEXP '^m';
查找runoob_author字段中以'naz'为结尾的所有数据:
SELECT runoob_author FROM tcount_tbl WHERE runoob_author REGEXP 'naz$';
查找runoob_author字段中包含'ah'字符串的所有数据:
SELECT runoob_author FROM tcount_tbl WHERE runoob_author REGEXP 'ah';
查找name字段中以m或J开头且以'l'字符串结尾的所有数据:
SELECT runoob_author FROM tcount_tbl WHERE runoob_author REGEXP '^[mJ]|l$';
MySQL 事务
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, 做保存点
save point 保存点名称
3, 操作
4,可以回滚,可以提交,没有问题,就提交,有问题就回滚。
修改操作
mysql -u root -p password;
use RUNOOB;
create table testalter_tbl
(
i INT,
c CHAR(1)
);
SHOW COLUMNS FROM testalter_tbl;
删除,添加或修改表字段
如下命令使用了 ALTER 命令及 DROP 子句来删除以上创建表的 i 字段:
如果数据表中只剩余一个字段则无法使用DROP来删除字段。
ALTER TABLE testalter_tbl DROP i;
SHOW COLUMNS FROM testalter_tbl;
在表 testalter_tbl 中添加 i 字段,并定义数据类型:
ALTER TABLE testalter_tbl ADD i INT;
SHOW COLUMNS FROM testalter_tbl;
如果你需要指定新增字段的位置,可以使用MySQL提供的关键字 FIRST (设定位第一列), AFTER 字段名(设定位于某个字段之后)。
尝试以下 ALTER TABLE 语句, 在执行成功后,使用 SHOW COLUMNS 查看表结构的变化:
FIRST 和 AFTER 关键字只占用于 ADD 子句,所以如果你想重置数据表字段的位置就需要先使用 DROP 删除字段然后使用 ADD 来添加字段并设置位置。
ALTER TABLE testalter_tbl DROP i;
ALTER TABLE testalter_tbl ADD i INT FIRST;
ALTER TABLE testalter_tbl DROP i;
ALTER TABLE testalter_tbl ADD i INT AFTER c;
SHOW COLUMNS FROM testalter_tbl;
修改字段类型及名称
把字段 c 的类型从 CHAR(1) 改为 CHAR(10),可以执行以下命令:
ALTER TABLE testalter_tbl MODIFY c CHAR(10);
SHOW COLUMNS FROM testalter_tbl;
ALTER TABLE testalter_tbl CHANGE j j INT;
SHOW COLUMNS FROM testalter_tbl;
ALTER TABLE 对 Null 值和默认值的影响
指定字段 j 为 NOT NULL 且默认值为100 。
如果你不设置默认值,MySQL会自动设置该字段默认为 NULL。
ALTER TABLE testalter_tbl
MODIFY j BIGINT NOT NULL DEFAULT 100;
SHOW COLUMNS FROM testalter_tbl;
修改字段默认值
使用 ALTER 来修改字段的默认值
ALTER TABLE testalter_tbl ALTER j SET DEFAULT 1000;
SHOW COLUMNS FROM testalter_tbl;
可以使用 ALTER 命令及 DROP子句来删除字段的默认值,如下实例:
ALTER TABLE testalter_tbl ALTER j DROP DEFAULT;
SHOW COLUMNS FROM testalter_tbl;
修改数据表类型,可以使用 ALTER 命令及 TYPE 子句来完成。尝试以下实例,我们将表 testalter_tbl 的类型修改为 MYISAM :
注意:查看数据表类型可以使用 SHOW TABLE STATUS 语句。
ALTER TABLE testalter_tbl TYPE = MYISAM;
SHOW TABLE STATUS LIKE 'testalter_tbl'\G
修改表名
如果需要修改数据表的名称,可以在 ALTER TABLE 语句中使用 RENAME 子句来实现。
将数据表 testalter_tbl 重命名为 alter_tbl:
ALTER TABLE testalter_tbl RENAME TO alter_tbl;
show tables;
MySQL 索引
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。
打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。
索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索包含多个列。
创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。
实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
建立索引会占用磁盘空间的索引文件。
普通索引
创建索引
这是最基本的索引,它没有任何限制。它有以下几种创建方式:
CREATE INDEX indexName ON mytable(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) NOT NULL,
INDEX [indexName] (username(length))
);
删除索引的语法
DROP INDEX [indexName] ON mytable;
唯一索引
它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:
创建索引
CREATE UNIQUE INDEX indexName ON mytable(username(length))
修改表结构
ALTER mytable ADD UNIQUE [indexName] ON (username(length))
创建表的时候直接指定
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
UNIQUE [indexName] (username(length))
);
使用ALTER 命令添加和删除索引
有四种方式来添加数据表的索引:
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出现多次。
ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):该语句指定了索引为 FULLTEXT ,用于全文索引。
在表中添加索引。
ALTER TABLE testalter_tbl ADD INDEX (c);
SHOW COLUMNS FROM testalter_tbl;
还可以在 ALTER 命令中使用 DROP 子句来删除索引。
ALTER TABLE testalter_tbl DROP INDEX c;
SHOW COLUMNS FROM testalter_tbl;
使用 ALTER 命令添加和删除主键
主键只能作用于一个列上,添加主键索引时,你需要确保该主键默认不为空(NOT NULL)。
实例如下:
ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;
SHOW COLUMNS FROM testalter_tbl;
ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);
SHOW COLUMNS FROM testalter_tbl;
也可以使用 ALTER 命令删除主键:
ALTER TABLE testalter_tbl DROP PRIMARY KEY;
SHOW COLUMNS FROM testalter_tbl;
删除指定时只需指定PRIMARY KEY,但在删除索引时,你必须知道索引名。
显示索引信息
你可以使用 SHOW INDEX 命令来列出表中的相关的索引信息。可以通过添加 \G 来格式化输出信息。
尝试以下实例:
SHOW INDEX FROM table_name\G
MySQL 临时表
MySQL 临时表在我们需要保存一些临时数据时是非常有用的。临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间。
临时表在MySQL 3.23版本中添加,如果你的MySQL版本低于 3.23版本就无法使用MySQL的临时表。不过现在一般很少有再使用这么低版本的MySQL数据库服务了。
MySQL临时表只在当前连接可见,如果你使用PHP脚本来创建MySQL临时表,那没当PHP脚本执行完成后,该临时表也会自动销毁。
如果你使用了其他MySQL客户端程序连接MySQL数据库服务器来创建临时表,那么只有在关闭客户端程序时才会销毁临时表,当然你也可以手动销毁。
临时表实例
CREATE TEMPORARY TABLE SalesSummary (
product_name VARCHAR(50) NOT NULL,
total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00,
avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00,
total_units_sold INT UNSIGNED NOT NULL DEFAULT 0
);
INSERT INTO SalesSummary
(product_name, total_sales, avg_unit_price, total_units_sold)
VALUES
('cucumber', 100.25, 90, 2);
SELECT * FROM SalesSummary;
当你使用 SHOW TABLES命令显示数据表列表时,你将无法看到 SalesSummary表。
如果你退出当前MySQL会话,再使用 SELECT命令来读取原先创建的临时表数据,那你会发现数据库中没有该表的存在,因为在你退出时该临时表已经被销毁了。
删除MySQL 临时表
默认情况下,当你断开与数据库的连接后,临时表就会自动被销毁。当然你也可以在当前MySQL会话使用 DROP TABLE 命令来手动删除临时表。
以下是手动删除临时表的实例:
CREATE TEMPORARY TABLE SalesSummary (
product_name VARCHAR(50) NOT NULL,
total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00,
avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00,
total_units_sold INT UNSIGNED NOT NULL DEFAULT 0
);
INSERT INTO SalesSummary
(product_name, total_sales, avg_unit_price, total_units_sold)
VALUES
('cucumber', 100.25, 90, 2);
SELECT * FROM SalesSummary;
DROP TABLE SalesSummary;
SELECT * FROM SalesSummary;
MySQL 复制表
如果我们需要完全的复制MySQL的数据表,包括表的结构,索引,默认值等。 如果仅仅使用CREATE TABLE ... SELECT 命令,是无法实现的。
如何完整的复制MySQL数据表,步骤如下:
使用 SHOW CREATE TABLE 命令获取创建数据表(CREATE TABLE) 语句,该语句包含了原数据表的结构,索引等。
复制以下命令显示的SQL语句,修改数据表名,并执行SQL语句,通过以上命令 将完全的复制数据表结构。
如果你想复制表的内容,你就可以使用 INSERT INTO ... SELECT 语句来实现。
尝试以下实例来复制表 runoob_tbl 。
步骤一:
获取数据表的完整结构。
SHOW CREATE TABLE runoob_tbl \G;
步骤二:
修改SQL语句的数据表名,并执行SQL语句。
CREATE TABLE `clone_tbl` (
`runoob_id` int(11) NOT NULL auto_increment,
`runoob_title` varchar(100) NOT NULL default '',
`runoob_author` varchar(40) NOT NULL default '',
`submission_date` date default NULL,
PRIMARY KEY (`runoob_id`),
UNIQUE KEY `AUTHOR_INDEX` (`runoob_author`)
) ENGINE=InnoDB;
select * from clone_tbl;
步骤三:
执行完第二步骤后,你将在数据库中创建新的克隆表 clone_tbl。 如果你想拷贝数据表的数据你可以使用 INSERT INTO... SELECT 语句来实现。
INSERT INTO clone_tbl (runoob_id,
runoob_title,
runoob_author,
submission_date)
SELECT runoob_id,runoob_title,
runoob_author,submission_date
FROM runoob_tbl;
select * from clone_tbl;
MySQL 序列使用
MySQL序列是一组整数:1, 2, 3, ...,由于一张数据表只能有一个字段自增主键,如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现。
使用AUTO_INCREMENT
MySQL中最简单使用序列的方法就是使用 MySQL AUTO_INCREMENT 来定义列。
实例:
以下实例中创建了数据表insect, insect中id无需指定值可实现自动增长。
CREATE TABLE insect
(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (id),
name VARCHAR(30) NOT NULL,
date DATE NOT NULL,
origin VARCHAR(30) NOT NULL
);
INSERT INTO insect (id,name,date,origin) VALUES
(NULL,'housefly','2001-09-10','kitchen'),
(NULL,'millipede','2001-09-10','driveway'),
(NULL,'grasshopper','2001-09-10','front yard');
SELECT * FROM insect ORDER BY id;
获取AUTO_INCREMENT值
在MySQL的客户端中你可以使用 SQL中的LAST_INSERT_ID( ) 函数来获取最后的插入表中的自增列的值。
重置序列
如果你删除了数据表中的多条记录,并希望对剩下数据的AUTO_INCREMENT列进行重新排列,那么你可以通过删除自增的列,然后重新添加来实现。 不过该操作要非常小心,如果在删除的同时又有新记录添加,有可能会出现数据混乱。操作如下所示:
ALTER TABLE insect DROP id;
ALTER TABLE insect
ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST,
ADD PRIMARY KEY (id);
设置序列的开始值
一般情况下序列的开始值为1,但如果你需要指定一个开始值100,那我们可以通过以下语句来实现:
ALTER TABLE insect AUTO_INCREMENT = 100;
MySQL 处理重复数据
有些 MySQL 数据表中可能存在重复的记录,有些情况我们允许重复数据的存在,但有时候我们也需要删除这些重复的数据。
下面介绍如何防止数据表出现重复数据及如何删除数据表中的重复数据。
防止表中出现重复数据
你可以在MySQL数据表中设置指定的字段为 PRIMARY KEY(主键) 或者 UNIQUE(唯一) 索引来保证数据的唯一性。
让我们尝试一个实例:下表中无索引及主键,所以该表允许出现多条重复记录。
CREATE TABLE person_tbl
(
first_name CHAR(20),
last_name CHAR(20),
sex CHAR(10)
);
如果你想设置表中字段first_name,last_name数据不能重复,你可以设置双主键模式来设置数据的唯一性, 如果你设置了双主键,那么那个键的默认值不能为NULL,可设置为NOT NULL。如下所示:
CREATE TABLE person_tbl
(
first_name CHAR(20) NOT NULL,
last_name CHAR(20) NOT NULL,
sex CHAR(10),
PRIMARY KEY (last_name, first_name)
);
如果我们设置了唯一索引,那么在插入重复数据时,SQL语句将无法执行成功,并抛出错。
INSERT IGNORE INTO与INSERT INTO的区别就是INSERT IGNORE会忽略数据库中已经存在的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。这样就可以保留数据库中已经存在数据,达到在间隙中插入数据的目的。
以下实例使用了INSERT IGNORE INTO,执行后不会出错,也不会向数据表中插入重复数据:
select * from person_tbl;
INSERT IGNORE INTO person_tbl (last_name, first_name)
VALUES( 'Jay', 'Thomas');
INSERT IGNORE INTO person_tbl (last_name, first_name)
VALUES( 'Jay', 'Thomas');
select * from person_tbl;
NSERT IGNORE INTO当插入数据时,在设置了记录的唯一性后,如果插入重复数据,将不返回错误,只以警告形式返回。 而REPLACE INTO into如果存在primary 或 unique相同的记录,则先删除掉。再插入新记录。
另一种设置数据的唯一性方法是添加一个UNIQUE索引,如下所示:
CREATE TABLE person_tbl
(
first_name CHAR(20) NOT NULL,
last_name CHAR(20) NOT NULL,
sex CHAR(10)
UNIQUE (last_name, first_name)
);
统计重复数据
以下我们将统计表中 first_name 和 last_name的重复记录数:
SELECT COUNT(*) as repetitions, last_name, first_name
FROM person_tbl
GROUP BY last_name, first_name
HAVING repetitions > 1;
以上查询语句将返回 person_tbl 表中重复的记录数。 一般情况下,查询重复的值,请执行以下操作:
确定哪一列包含的值可能会重复。
在列选择列表使用COUNT(*)列出的那些列。
在GROUP BY子句中列出的列。
HAVING子句设置重复数大于1。
过滤重复数据
如果你需要读取不重复的数据可以在 SELECT 语句中使用 DISTINCT 关键字来过滤重复数据。
注意:order by 后面只能跟一个列
SELECT DISTINCT last_name, first_name
FROM person_tbl
ORDER BY last_name;
你也可以使用 GROUP BY 来读取数据表中不重复的数据:
注意:group by 后面只能跟一个列
SELECT last_name, first_name
FROM person_tbl
GROUP BY first_name;
删除重复数据
可以在数据表中添加 INDEX(索引) 和 PRIMAY KEY(主键)这种简单的方法来删除表中的重复记录。方法如下:
ALTER IGNORE TABLE person_tbl
ADD PRIMARY KEY (last_name, first_name);
MySQL 导出数据
MySQL中你可以使用SELECT...INTO OUTFILE语句来简单的导出数据到文本文件上。
使用 SELECT ... INTO OUTFILE 语句导出数据
以下实例中我们将数据表 runoob_tbl 数据导出到 /tmp/tutorials.txt 文件中:
SELECT * FROM runoob_tbl
INTO OUTFILE '/tmp/tutorials.txt';
导出表作为原始数据
mysqldump是mysql用于转存储数据库的实用程序。它主要产生一个SQL脚本,其中包含从头重新创建数据库所必需的命令CREATE TABLE INSERT等。
使用mysqldump导出数据需要使用 --tab 选项来指定导出文件指定的目录,该目标必须是可写的。
以下实例将数据表 runoob_tbl 导出到 /tmp 目录中:
$ mysqldump -u root -p --no-create-info --tab=/tmp RUNOOB runoob_tbl
导出SQL格式的数据
导出SQL格式的数据到指定文件,如下所示:
$ mysqldump -u root -p RUNOOB runoob_tbl > dump.txt
如果你需要导出整个数据库的数据,可以使用以下命令:
$ mysqldump -u root -p RUNOOB > database_dump.txt
如果需要备份所有数据库,可以使用以下命令:
$ mysqldump -u root -p --all-databases > database_dump.txt
将数据表及数据库拷贝至其他主机
如果你需要将数据拷贝至其他的 MySQL 服务器上, 你可以在 mysqldump 命令中指定数据库名及数据表。
在源主机上执行以下命令,将数据备份至 dump.txt 文件中:
$ mysqldump -u root -p database_name table_name > dump.txt
如果完整备份数据库,则无需使用特定的表名称。
如果你需要将备份的数据库导入到MySQL服务器中,可以使用以下命令,使用以下命令你需要确认数据库已经创建:
$ mysql -u root -p database_name
你也可以使用以下命令将导出的数据直接导入到远程的服务器上,但请确保两台服务器是相通的,是可以相互访问的:
$ mysqldump -u root -p database_name | mysql -h other-host.com database_name
以上命令中使用了管道来将导出的数据导入到指定的远程主机上。
MySQL 导入数据
MySQL中可以使用两种简单的方式来导入MySQL导出的数据。
使用 LOAD DATA 导入数据
MySQL 中提供了LOAD DATA INFILE语句来插入数据。
以下实例中将从当前目录中读取文件 dump.txt ,将该文件中的数据插入到当前数据库的 mytbl 表中。
LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl;
如果指定LOCAL关键词,则表明从客户主机上按路径读取文件。如果没有指定,则文件在服务器上按路径读取文件。
你能明确地在LOAD DATA语句中指出列值的分隔符和行尾标记,但是默认标记是定位符和换行符。
两个命令的 FIELDS 和 LINES 子句的语法是一样的。两个子句都是可选的,但是如果两个同时被指定,FIELDS 子句必须出现在 LINES 子句之前。
如果用户指定一个 FIELDS 子句,它的子句 (TERMINATED BY、[OPTIONALLY] ENCLOSED BY 和 ESCAPED BY) 也是可选的,不过,用户必须至少指定它们中的一个。
LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl
FIELDS TERMINATED BY ':'
LINES TERMINATED BY '\r\n';
LOAD DATA 默认情况下是按照数据文件中列的顺序插入数据的,如果数据文件中的列与插入表中的列不一致,则需要指定列的顺序。
如,在数据文件中的列顺序是 a,b,c,但在插入表的列顺序为b,c,a,则数据导入语法如下:
LOAD DATA LOCAL INFILE 'dump.txt'
INTO TABLE mytbl (b, c, a);
使用 mysqlimport 导入数据
mysqlimport客户端提供了LOAD DATA INFILEQL语句的一个命令行接口。mysqlimport的大多数选项直接对应LOAD DATA INFILE子句。
从文件 dump.txt 中将数据导入到 mytbl 数据表中, 可以使用以下命令:
$ mysqlimport -u root -p --local database_name dump.txt
mysqlimport命令可以指定选项来设置指定格式,命令语句格式如下:
$ mysqlimport -u root -p --local --fields-terminated-by=":" --lines-terminated-by="\r\n" database_name dump.txt
mysqlimport 语句中使用 --columns 选项来设置列的顺序:
$ mysqlimport -u root -p --local --columns=b,c,a database_name dump.txt
mysqlimport的常用选项介绍
选项 功能
-d or --delete 新数据导入数据表中之前删除数据数据表中的所有信息
-f or --force 不管是否遇到错误,mysqlimport将强制继续插入数据
-i or --ignore mysqlimport跳过或者忽略那些有相同唯一 关键字的行, 导入文件中的数据将被忽略。
-l or -lock-tables 数据被插入之前锁住表,这样就防止了, 你在更新数据库时,用户的查询和更新受到影响。
-r or -replace 这个选项与-i选项的作用相反;此选项将替代 表中有相同唯一关键字的记录。
--fields-enclosed- by= char 指定文本文件中数据的记录时以什么括起的, 很多情况下 数据以双引号括起。 默认的情况下数据是没有被字符括起的。
--fields-terminated- by=char 指定各个数据的值之间的分隔符,在句号分隔的文件中, 分隔符是句号。您可以用此选项指定数据之间的分隔符。 默认的分隔符是跳格符(Tab)
--lines-terminated- by=str 此选项指定文本文件中行与行之间数据的分隔字符串 或者字符。 默认的情况下mysqlimport以newline为行分隔符。 您可以选择用一个字符串来替代一个单个的字符: 一个新行或者一个回车。
mysqlimport命令常用的选项还有-v 显示版本(version), -p 提示输入密码(password)等。
上一篇: 用phpmailer通过SMTP的方式发送邮件代码详解
下一篇: 返回数组中指定的一列