MYSQL学习笔记

mysql笔记
--------------
--创建数据库,该命令的作用:1. 如果数据库不存在则创建,存在则不创建。2. 创建RUNOOB数据库,并设定编码集为utf8
create database if not exists RUNOOB default charset utf8 collate utf8_general_ci;
--drop 命令删除数据库
drop database if exists RUNOOB;
--MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型
---严格数值数据类型:int/integer,smallint,dec/decimal,numeric,bigint,对DECIMAL(P,D)表示列可以存储D位小数的P位数
---近似数值数据类型:float,double,real,
---日期/时间:date,datetime,timestape,year,time
---字符串:char,varchar,longtext,tinyblob,tinytext,blob,text,mediumbolb,mediumtext,longblob
--创建 MySql 的表时,表名和字段名外面的符号 ` 不是单引号,而是英文输入法状态下的反单引号,也就是键盘左上角 esc 按键下面的那一个 ~ 按键,坑惨了。反引号是为了区分 MySql 关键字与普通字符而引入的符号,一般的,表名与字段名都使用反引号。
create table if not exists `RUNOOB`(
`runood_id` int unsigned auto_increment,--AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1
`runood_title` varchar(100) not null,--如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错。
`runood_author` varchar(40) not null,
`submission_date` date,
primary key (`runood_id`)--PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔
)engine=InnoDB DEFAULT CHARSET=utf8;--ENGINE 设置存储引擎,CHARSET 设置编码
--MySQL 删除数据表
drop table if exists runoob;--删除表全部数据和表结构,立刻释放磁盘空间
--删除表内数据,用 delete
delete * from runoob;--删除表全部数据,表结构不变,对于 MyISAM 会立刻释放磁盘空间,InnoDB 不会释放磁盘空间;delete from 表以后虽然未释放磁盘空间,但是下次插入数据的时候,仍然可以使用这部分空间
---删除学生表内姓名为张三的记录。
delete * from runoob where name='张三';-- 带条件的删除,表结构不变,不管是 innodb 还是 MyISAM 都不会释放磁盘空间;delete from 表以后虽然未释放磁盘空间,但是下次插入数据的时候,仍然可以使用这部分空间
optimize table runoob;--delete 操作以后,使用 optimize table table_name 会立刻释放磁盘空间,不管是 innodb 还是 myisam;
---清除表内数据,保存表结构,用 truncate
truncate table runoob;-- 删除表全部数据,保留表结构,立刻释放磁盘空间 
/*当你不再需要该表时, 用 drop;

2、当你仍要保留该表,但要删除所有记录时, 用 truncate;

3、当你要删除部分记录时, 用 delete。
*/
--MySQL 插入数据,
 INSERT INTO runoob_tbl 
    (runoob_title, runoob_author, submission_date)
    VALUES
    ("学习 PHP", "菜鸟教程", NOW());--我们并没有提供 runoob_id 的数据,因为该字段我们在创建表的时候已经设置它为 AUTO_INCREMENT(自动增加) 属性。 所以,该字段会自动递增而不需要我们去设置。实例中 NOW() 是一个 MySQL 函数,该函数返回日期和时间
---插入多条
INSERT INTO table_name  (field1, field2,...fieldN)  
VALUES  (valueA1,valueA2,...valueAN),
(valueB1,valueB2,...valueBN),
(valueC1,valueC2,...valueCN)......;	
--MySQL 查询数据
SELECT column_name,column_name --SELECT 命令可以读取一条或者多条记录。
FROM table_name --查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件
[WHERE Clause] --你可以使用 WHERE 语句来包含任何条件。
[LIMIT N] --你可以使用 LIMIT 属性来设定返回的记录数
[ OFFSET M] --你可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0
--MySQL WHERE 子句
SELECT field1, field2,...fieldN 
FROM table_name1, table_name2... --查询语句中你可以使用一个或者多个表,表之间使用逗号, 分割,并使用WHERE语句来设定查询条件。
[WHERE condition1 [AND [OR]] condition2..... --你可以在 WHERE 子句中指定任何条件。使用 AND 或者 OR 指定一个或多个条件,WHERE 子句也可以运用于 SQL 的 DELETE 或者 UPDATE 命令。
---where子句操作符 =,!=,>,<,>=,<=
select * from runoob_tbl where runoob_author="菜鸟教程";-- WHERE 子句的字符串比较是不区分大小写的,你可以使用 BINARY 关键字来设定 WHERE 子句的字符串比较是区分大小写的
select * from runoob_tbl where binary runoob_author="runoob.com";--使用了 BINARY 关键字,是区分大小写的
--MySQL UPDATE 查询
UPDATE table_name SET field1=new-value1, field2=new-value2 --你可以同时更新一个或多个字段。
[WHERE Clause] --你可以在 WHERE 子句中指定任何条件,你可以在一个单独表中同时更新数据
update runoob_tbl set runoob_title="学习c++" where runoob_id=3;
update students set age=age+1;
update students set name="小明", age=19 wheretel="13288097888";
UPDATE table_name SET field=REPLACE(field, 'old-string', 'new-string') 
[WHERE Clause] --当我们需要将字段中的特定字符串批量修改为其他字符串时
UPDATE runoob_tbl SET runoob_title = REPLACE(runoob_title, 'C++', 'Python') where 
runoob_id = 3;
--MySQL DELETE 语句
DELETE FROM table_name 
[WHERE Clause];--如果没有指定 WHERE 子句,MySQL 表中的所有记录将被删除。你可以在 WHERE 子句中指定任何条件,您可以在单个表中一次性删除记录
--MySQL LIKE 子句
---SQL LIKE 子句中使用百分号 %字符来表示任意字符,类似于UNIX或正则表达式中的星号 *。如果没有使用百分号 %, LIKE 子句与等号 = 的效果是一样的。
SELECT field1, field2,...fieldN 
FROM table_name
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'--LIKE 通常与 % 一同使用
select * from runoob_tbl where runoob_author like "%com";--获取 runoob_author 字段中以 COM 为结尾的的所有记录
/*
like 匹配/模糊匹配,会与 % 和 _ 结合使用。

'%a'     //以a结尾的数据
'a%'     //以a开头的数据
'%a%'    //含有a的数据
'_a_'    //三位且中间字母是a的
'_a'     //两位且结尾字母是a的
'a_'     //两位且开头字母是a的
*/
--MySQL UNION 操作符
---MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据。
SELECT expression1, expression2, ... expression_n --expression1, expression2, ... expression_n: 要检索的列
FROM tables --tables: 要检索的数据表。
[WHERE conditions] --WHERE conditions: 可选, 检索条件。
UNION [ALL | DISTINCT] --DISTINCT: 可选,删除结果集中重复的数据。默认情况下 UNION 操作符已经删除了重复数据,所以 DISTINCT 修饰符对结果没啥影响。ALL: 可选,返回所有结果集,包含重复数据。
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];
---从 "Websites" 和 "apps" 表中选取所有不同的country(只有不同的值)
SELECT country FROM Websites
UNION
SELECT country FROM apps
ORDER BY country;
---从 "Websites" 和 "apps" 表中选取所有的country(也有重复的值):
SELECT country FROM Websites
UNION all
SELECT country FROM apps
ORDER BY country;
---从 "Websites" 和 "apps" 表中选取所有的中国(CN)的数据(也有重复的值):
SELECT country, name FROM Websites
WHERE country='CN'
UNION ALL
SELECT country, app_name FROM apps
WHERE country='CN'
ORDER BY country;
--MySQL 排序
SELECT field1, field2,...fieldN table_name1, table_name2...
ORDER BY field1, [field2...] [ASC [DESC]]--你可以使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列。你可以添加 WHERE...LIKE 子句来设置条件
SELECT * from runoob_tbl ORDER BY submission_date ASC;
SELECT * from runoob_tbl ORDER BY submission_date DESC;
---MySQL 拼音排序
----如果字符集采用的是 gbk(汉字编码字符集),直接在查询语句后边添加 ORDER BY:
SELECT * 
FROM runoob_tbl
ORDER BY runoob_title;
----如果字符集采用的是 utf8(万国码),需要先对字段进行转码然后排序:
SELECT * 
FROM runoob_tbl
ORDER BY CONVERT(runoob_title using gbk);
--MySQL GROUP BY 语句
---GROUP BY 语句根据一个或多个列对结果集进行分组。在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。
SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
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;
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');
 SELECT name, COUNT(*) FROM   employee_tbl GROUP BY name;--数据表按名字进行分组,并统计每个人有多少条记录:
 ---使用 WITH ROLLUP,WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)。
 SELECT name, SUM(singin) as singin_count FROM  employee_tbl GROUP BY name WITH ROLLUP;
 SELECT coalesce(name, '总数'), SUM(singin) as singin_count FROM  employee_tbl GROUP BY name WITH ROLLUP;--如果名字为空我们使用总数代替
 --Mysql 连接的使用
 ---INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录
 ---LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
 ---RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
 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 LEFT 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 RIGHT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
 --MySQL NULL 值处理
/* MySQL提供了三大运算符:

IS NULL: 当列的值是 NULL,此运算符返回 true。
IS NOT NULL: 当列的值不为 NULL, 运算符返回 true。
<=>: 比较操作符(不同于=运算符),当比较的的两个值为 NULL 时返回 true。
关于 NULL 的条件比较运算是比较特殊的。你不能使用 = NULL 或 != NULL 在列中查找 NULL 值 。

在 MySQL 中,NULL 值与任何其它值的比较(即使是 NULL)永远返回 false,即 NULL = NULL 返回false 。

MySQL 中处理 NULL 使用 IS NULL 和 IS NOT NULL 运算符。
*/
SELECT * FROM runoob_test_tbl WHERE runoob_count IS NULL;
SELECT * from runoob_test_tbl WHERE runoob_count IS NOT NULL;
--MySQL 正则表达式
---MySQL中使用 REGEXP 操作符来进行正则表达式匹配。
/*
^	匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。
$	匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。
.	匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。
[...]	字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。
[^...]	负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。
p1|p2|p3	匹配 p1 或 p2 或 p3。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。
*	匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
+	匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
{n}	n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,m}	m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。
*/
 SELECT name FROM person_tbl WHERE name REGEXP '^st';
 SELECT name FROM person_tbl WHERE name REGEXP 'ok$';
 SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';
 --MySQL 事务
 ---事务用来管理 insert,update,delete 语句;事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
 ---一般来说,事务是必须满足4个条件(ACID):原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
 /*原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。

隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
*/
/*
MYSQL 事务处理主要有两种方法:
1、用 BEGIN, ROLLBACK, COMMIT来实现

BEGIN 开始一个事务
ROLLBACK 事务回滚
COMMIT 事务确认
2、直接用 SET 来改变 MySQL 的自动提交模式:

SET AUTOCOMMIT=0 禁止自动提交
SET AUTOCOMMIT=1 开启自动提交
*/
begin;
insert into runoob_transaction_test value(5);
commit; 
begin;
insert into runoob_transaction_test values(7);
rollback; 
--MySQL ALTER命令
create table testalter_tbl
 (
i INT,
c CHAR(1)
 );
 alter table testalter_tbl drop i;--使用了 ALTER 命令及 DROP 子句来删除以上创建表的 i 字段
 alter table testalter_tbl add i int;--使用 ADD 子句来向数据表中添加列,如下实例在表 testalter_tbl 中添加 i 字段,并定义数据类型
 ---如果你需要指定新增字段的位置,可以使用MySQL提供的关键字 FIRST (设定位第一列), AFTER 字段名(设定位于某个字段之后)
 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;--FIRST 和 AFTER 关键字只占用于 ADD 子句,所以如果你想重置数据表字段的位置就需要先使用 DROP 删除字段然后使用 ADD 来添加字段并设置位置。
---修改字段类型及名称
----如果需要修改字段类型及名称, 你可以在ALTER命令中使用 MODIFY 或 CHANGE 子句 。
ALTER TABLE testalter_tbl MODIFY c CHAR(10);--把字段 c 的类型从 CHAR(1) 改为 CHAR(10)
ALTER TABLE testalter_tbl CHANGE i j BIGINT;--使用 CHANGE 子句, 语法有很大的不同。 在 CHANGE 关键字之后,紧跟着的是你要修改的字段名,然后指定新字段名及类型
ALTER TABLE testalter_tbl CHANGE j j INT;
----ALTER TABLE 对 Null 值和默认值的影响,当你修改字段时,你可以指定是否包含值或者是否设置默认值。
alter table testalter_tbl modify j bigint not null default 100;
---修改字段默认值
alter table testalter_tbl alter i set default 1000;
----ALTER 命令及 DROP子句来删除字段的默认值,
ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;
----修改数据表类型,可以使用 ALTER 命令及 TYPE 子句来完成
ALTER TABLE testalter_tbl ENGINE = MYISAM;--将表 testalter_tbl 的类型修改为 MYISAM 
----修改表名
alter table testalter_tbl rename to alter_tbl;
---alter其他用途:
----修改存储引擎:修改为myisam
alter table tableName engine=myisam;
----删除外键约束:keyName是外键别名
alter table tableName drop foreign key keyName;
----修改字段的相对位置:这里name1为想要修改的字段,type1为该字段原来类型,first和after二选一,这应该显而易见,first放在第一位,after放在name2字段后面
alter table tableName modify name1 type1 first|after name2;
--MySQL 索引
---索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。
---创建索引时,你需要确保该索引是应用在	SQL 查询语句的条件(一般作为 WHERE 子句的条件)。
---虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
---建立索引会占用磁盘空间的索引文件。
--普通索引
---创建索引
create index indexname on mytable(username(length));--如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。
---修改表结构(添加索引)
ALTER table tableName ADD INDEX indexName(columnName);
---创建表的时候直接指定
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 table mytable ADD UNIQUE [indexName] (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);--添加索引
ALTER TABLE testalter_tbl DROP INDEX c;--DROP 子句来删除索引
--使用 ALTER 命令添加和删除主键
---主键只能作用于一个列上,添加主键索引时,你需要确保该主键默认不为空(NOT NULL)
ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;
ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);
---使用 ALTER 命令删除主键
ALTER TABLE testalter_tbl DROP PRIMARY KEY;--删除主键时只需指定PRIMARY KEY,但在删除索引时,你必须知道索引名。
---显示索引信息
SHOW INDEX FROM table_name; \G --可以通过添加 \G 来格式化输出信息。
--MySQL 临时表
---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);
 DROP TABLE SalesSummary;
 --MySQL 复制表
 ---使用 SHOW CREATE TABLE 命令获取创建数据表(CREATE TABLE) 语句,该语句包含了原数据表的结构,索引等。
 ---复制以下命令显示的SQL语句,修改数据表名,并执行SQL语句,通过以上命令 将完全的复制数据表结构
 ---如果你想复制表的内容,你就可以使用 INSERT INTO ... SELECT 语句来实现。
 SHOW CREATE TABLE runoob_tbl \G;
 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;
INSERT INTO clone_tbl (runoob_id,
    unoob_title,
    runoob_author,
    submission_date)
    SELECT runoob_id,runoob_title,
    runoob_author,submission_date
    FROM runoob_tbl;
---另一种完整复制表的方法:
CREATE TABLE targetTable LIKE sourceTable;
INSERT INTO targetTable SELECT * FROM sourceTable;
---可以拷贝一个表中其中的一些字段:
CREATE TABLE newadmin AS
(
    SELECT username, password FROM admin
)
---可以将新建的表的字段改名:
CREATE TABLE newadmin AS
(  
    SELECT id, username AS uname, password AS pass FROM admin
)
---可以拷贝一部分数据:
CREATE TABLE newadmin AS
(
    SELECT * FROM admin WHERE LEFT(username,1) = 's'
)
---可以在创建表的同时定义表中的字段信息:
CREATE TABLE newadmin
(
    id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY
)
AS
(
    SELECT * FROM admin
)  
--MySQL 序列使用
---MySQL序列是一组整数:1, 2, 3, ...,由于一张数据表只能有一个字段自增主键, 如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现
CREATE TABLE insect
    (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (id),
    name VARCHAR(30) NOT NULL, # type of insect
    date DATE NOT NULL, # date collected
    origin VARCHAR(30) NOT NULL # where collected
);
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');
---重置序列
---如果你删除了数据表中的多条记录,并希望对剩下数据的AUTO_INCREMENT列进行重新排列,那么你可以通过删除自增的列,然后重新添加来实现。
ALTER TABLE insect DROP id;
ALTER TABLE insect
ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST,
ADD PRIMARY KEY (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
)engine=innodb auto_increment=100 charset=utf8;--一般情况下序列的开始值为1,但如果你需要指定一个开始值100
---或者你也可以在表创建成功后,通过以下语句来实现:
 ALTER TABLE t AUTO_INCREMENT = 100;
--MySQL 处理重复数据
---防止表中出现重复数据
----你可以在MySQL数据表中设置指定的字段为 PRIMARY KEY(主键) 或者 UNIQUE(唯一) 索引来保证数据的唯一性。
CREATE TABLE person_tbl
(
    first_name CHAR(20),
    last_name CHAR(20),
    sex CHAR(10)
);
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)
);
----INSERT IGNORE INTO与INSERT INTO的区别就是INSERT IGNORE会忽略数据库中已经存在的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。这样就可以保留数据库中已经存在数据,达到在间隙中插入数据的目的。
INSERT IGNORE INTO person_tbl (last_name, first_name)
VALUES( 'Jay', 'Thomas');
----INSERT 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)
);
--统计重复数据
SELECT COUNT(*) as repetitions, last_name, first_name
FROM person_tbl
GROUP BY last_name, first_name
HAVING repetitions > 1;
--过滤重复数据
---如果你需要读取不重复的数据可以在 SELECT 语句中使用 DISTINCT 关键字来过滤重复数据
SELECT DISTINCT last_name, first_name FROM person_tbl;
---你也可以使用 GROUP BY 来读取数据表中不重复的数据:
SELECT last_name, first_name
FROM person_tbl
GROUP BY (last_name, first_name);
--删除重复数据
CREATE TABLE tmp SELECT last_name, first_name, sex FROM person_tbl  GROUP BY (last_name, first_name, sex);
DROP TABLE person_tbl;
ALTER TABLE tmp RENAME TO person_tbl;
--当然你也可以在数据表中添加 INDEX(索引) 和 PRIMAY KEY(主键)这种简单的方法来删除表中的重复记录。方法如下:
ALTER IGNORE TABLE person_tbl
ADD PRIMARY KEY (last_name, first_name);
--MySQL 导出数据
---MySQL中你可以使用SELECT...INTO OUTFILE语句来简单的导出数据到文本文件上。
SELECT * FROM runoob_tbl INTO OUTFILE '/tmp/runoob.txt';
---你可以通过命令选项来设置数据输出的指定格式,以下实例为导出 CSV 格式:
mysql> SELECT * FROM passwd INTO OUTFILE '/tmp/runoob.txt'
    -> FIELDS TERMINATED BY ',' ENCLOSED BY '"'
    -> LINES TERMINATED BY '\r\n';
---在下面的例子中,生成一个文件,各值用逗号隔开。这种格式可以被许多程序使用。
SELECT a,b,a+b INTO OUTFILE '/tmp/result.text'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM test_table;
--MySQL 导入数据
 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 LOCAL INFILE 'dump.txt' 
INTO TABLE mytbl (b, c, a);--LOAD DATA 默认情况下是按照数据文件中列的顺序插入数据的,如果数据文件中的列与插入表中的列不一致,则需要指定列的顺序。

 

你可能感兴趣的:(mysql,关系型数据库)