博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL进阶
阅读量:5220 次
发布时间:2019-06-14

本文共 5149 字,大约阅读时间需要 17 分钟。

小知识:

\G 放到sql语句后,可以使每个字段打印到单独的行,如:

mysql> select * from user_msg limit 2 \G;

一、增加删除表字段的ALTER命令:

ALTER TABLE tbl DROP name;            #删除name字段ALTER TABLE tbl ADD name INT FIRST;   #首部添加name字段ALTER TABLE tbl DROP name;ALTER TABLE tbl ADD name INT AFTER age;  #age的后面添加name字段

修改字段类型及名称:

如果需要修改字段类型及名称, 你可以在ALTER命令中使用 MODIFY 或 CHANGE 子句 。

例如,把字段 c 的类型从 CHAR(1) 改为 CHAR(10),可以执行以下命令:

ALTER TABLE testalter_tbl MODIFY c CHAR(10);

使用 CHANGE 子句, 语法有很大的不同。 在 CHANGE 关键字之后,紧跟着的是你要修改的字段名,然后指定新字段名及类型。尝试如下实例:

ALTER TABLE testalter_tbl CHANGE i j BIGINT;ALTER TABLE testalter_tbl CHANGE j j INT;

修改字段默认值:

ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;

修改表名

如果需要修改数据表的名称,可以在 ALTER TABLE 语句中使用 RENAME 子句来实现。

尝试以下实例将数据表 testalter_tbl 重命名为 alter_tbl:

ALTER TABLE testalter_tbl RENAME TO alter_tbl;

二、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;

唯一索引:

 UNIQUE关键字修饰。

三、MySQL 临时表

使用TEMPORARY修饰表名;

当你使用 SHOW TABLES命令显示数据表列表时,你将无法看到 临时表。

如果你退出当前MySQL会话,再使用 SELECT命令来读取原先创建的临时表数据,那你会发现数据库中没有该表的存在,因为在你退出时该临时表已经被销毁了。

使用 DROP TABLE 命令可以手动删除临时表。

四、MySQL 复制表(重要)

SHOW CREATE TABLE tbl \G;  #打印创建表tb1的全过程

//手动复制一遍,改个表名,tb2,就复制了tb1的数据结构;(理解错误。。。mark一下)

//已经显示出创建tb1的代码过程了,将表明由tb1改为tb2就可以了。。。然后如下复制数据:

复制数据:

INSERT INTO tb2 (runoob_id,                  runoob_title,                  runoob_author,                  submission_date) SELECT runoob_id,runoob_title, runoob_author,submission_date FROM tbl;

五、MySQL 序列

CREATE TABLE insect  (   id INT UNSIGNED NOT NULL AUTO_INCREMENT = 100,   #默认从1开始   PRIMARY KEY (id),   name VARCHAR(30) NOT NULL,                       # type of insect   date DATE NOT NULL,                              # date collected   origin VARCHAR(30) NOT NULL                      # where collected);
ALTER TABLE insect AUTO_INCREMENT = 100;

重置序列

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

ALTER TABLE insect DROP id; ALTER TABLE insect ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (id);

六、MySQL 处理重复数据

主键不能为空,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));

插入时控制:

INSERT IGNORE INTO与INSERT INTO的区别:

INSERT IGNORE INTO:如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。

统计重复数据

以下我们将统计表中 first_name 和 last_name的重复记录数:

SELECT COUNT(*) as repetitions, last_name, first_nameFROM person_tblGROUP BY last_name, first_nameHAVING repetitions > 1;

过滤重复数据

如果你需要读取不重复的数据可以在 SELECT 语句中使用 DISTINCT 关键字来过滤重复数据。

SELECT DISTINCT last_name, first_name            #注意:last_name和first_name作为一个整体使用的DISTINCT。效果同下GROUP BY:FROM person_tblORDER BY last_name;

你也可以使用 GROUP BY 来读取数据表中不重复的数据:

SELECT last_name, first_nameFROM person_tblGROUP BY (last_name, first_name);

删除重复数据

如果你想删除数据表中的重复数据,你可以使用以下的SQL语句:

  CREATE TABLE tmp SELECT last_name, first_name, sex   #间接创建表的方法                   FROM person_tbl;                   GROUP BY (last_name, first_name);    DROP TABLE person_tbl;  ALTER TABLE tmp RENAME TO person_tbl;

七、MySQL 导出(入)数据

为了将一个数据库的数据写入一个文件,使用SELECT ... INTO OUTFILE 

SELECT * FROM tb1 INTO OUTFILE '/tem/tutorials.txt';

你可以通过命令选项来设置数据输出的指定格式,以下实例为导出 CSV 格式:

SELECT * FROM tb1 INTO OUTFILE '/tmp/tutorials.txt'          FIELDS TERMINATED BY ',' ENCLOSED BY '"'          LINES TERMINATED BY '\r\n';

#每项用 , 分割   用 " 包裹   行结束符为:'\r\n' ;

#注意:

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服务器所拥有。这意味着,虽然你就可以读取该文件,但可能无法将其删除

导出SQL格式的数据

导出SQL格式的数据到指定文件,如下所示:

mysqldump -u root -p database1 tbl > dump.txtpassword ******

#以上为从数据库database1的表tb1导出到dump.txt;

#导出整个数据库,不加tb1即可;

#备份所有数据库:

mysqldump -u root -p --all-databases > database_dump.txtpassword ******

使用 LOAD DATA 导入数据

MySQL 中提供了LOAD DATA INFILE语句来插入数据。 以下实例中将从当前目录中读取文件 dump.txt ,将该文件中的数据插入到当前数据库的 mytbl 表中。

LOAD DATA 默认情况下是按照数据文件中列的顺序插入数据的,如果数据文件中的列与插入表中的列不一致,则需要指定列的顺序。

如,在数据文件中的列顺序是 a,b,c,但在插入表的列顺序为b,c,a,则数据导入语法如下:

LOAD DATA LOCAL INFILE 'dump.txt'    INTO TABLE mytbl (b, c, a);

#如果指定LOCAL关键词,则表明从客户主机上按路径读取文件。如果没有指定,则文件在服务器上按路径读取文件。

mysqlimport命令可以指定选项来设置指定格式,命令语句格式如下:

mysqlimport -u root -p --local --columns=b,c,a \ --fields-terminated-by=":" \ --lines-terminated-by="\r\n"  database_name dump.txtpassword *****

 

转载于:https://www.cnblogs.com/Lunais/p/5808611.html

你可能感兴趣的文章
Java 内部类
查看>>
测试一个对象是否是类字符串
查看>>
{面试题7: 使用两个队列实现一个栈}
查看>>
[转]SQL中 OVER(PARTITION BY) 取上一条,下一条等
查看>>
前端开发就从认识浏览器开始 - 浏览器处理请求的过程
查看>>
【练习】使用事务和锁定语句
查看>>
centos7升级firefox的flash插件
查看>>
jmeter系列二(jmeter engine相关)
查看>>
前端页面设计问题小计
查看>>
一份超全超详细的 ADB 用法大全
查看>>
Spring定时任务(@Scheduled)
查看>>
WebView 调试
查看>>
IB使用
查看>>
Linux硬链接和软链接(符号链接)
查看>>
git stash
查看>>
Apache Common-IO 使用
查看>>
Java-第一课正则表达式
查看>>
深入剖析,什么是eval的直接调用.
查看>>
apidoc
查看>>
3月14日-15日学习总结
查看>>