码迷,mamicode.com
首页 > 数据库 > 详细

mysql常用

时间:2015-11-11 11:16:42      阅读:367      评论:0      收藏:0      [点我收藏+]

标签:

MySQL添加字段的方法并不复杂,下面将为您详细介绍MySQL添加字段和修改字段等操作的实现方法,希望对您学习MySQL添加字段方面会有所帮助。

1.登录数据库
>mysql -u root -p 数据库名称

2.查询所有数据表
>show tables;

3.查询表的字段信息
>desc 表名称;

4.1添加表字段

alter table table1 add transactor varchar(10) not Null;

alter table table1 add id int unsigned not Null auto_increment primary key

ALTER TABLE `happy` ADD `credit_card` VARCHAR( 50 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL 添加一个字段 并设为 utf8_general_ci字符
ALTER TABLE `happy` CHANGE `hotel_id` `hotel_id` CHAR( 8 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL 修改 一个字段的字符为utf8_general_ci
ALTER TABLE `happy` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci 修改表默认字符属性为utf8_general_ci
ALTER DATABASE `elong` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci 修改库默认字符属性为 utf8_general_ci

4.2.修改某个表的字段类型及指定为空或非空
>alter table 表名称 change 字段名称 字段名称 字段类型 [是否允许非空];
>alter table 表名称 modify 字段名称 字段类型 [是否允许非空];

>alter table 表名称 modify 字段名称 字段类型 [是否允许非空];

4.3.修改某个表的字段名称及指定为空或非空
>alter table 表名称 change 字段原名称 字段新名称 字段类型 [是否允许非空

4.4如果要删除某一字段,可用命令:ALTER TABLE mytable DROP 字段 名;

4.5 修改表名
alter table 表名 rename to 新表名

4.6 创建带字符的数据库
CREATE DATABASE db_name DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

4.7 修改数据库字符
ALTER DATABASE db_name DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci

4.8 修改mysql字段顺序的方法:
ALTER TABLE tablename CHANGE `area` `area` VARCHAR(50) AFTER `city` ;

4.9 导出txt
select * from fromtable into outfile "d:/fromtable .txt"; 导出纯数据格式

5.0 关联删除 更新 cascade
ALTER TABLE `articles`
ADD CONSTRAINT `FK_userid`
FOREIGN KEY ( `userid` )
REFERENCES `users` ( `id` )
ON DELETE CASCADE ON UPDATE RESTRICT ;
--解释:当主表users 删除一条记录时 从表articles自动删除所有包含users主键的值

5.1 使用ALTER TABLE语句创建索引
其中包括普通索引、UNIQUE索引和PRIMARY KEY索引3种创建索引的格式,
table_name是要增加索引的表名,
column_list指出对哪些列进行索引,多列时各列之间用逗号分隔。
索引名index_name可选,缺省时,MySQL将根据第一个索引列赋一个名称。另外,ALTER TABLE允许在单个语句中更改多个表,因此可以同时创建多个索引

alter table table_name add index index_name (column_list) ;
alter table table_name add unique (column_list) ;例如 ALTER TABLE `tbl_option` ADD UNIQUE (`name`)
alter table table_name add primary key (column_list) ; 创建主键

5.2 使用CREATE INDEX语句对表增加索引。能够增加普通索引和UNIQUE索引两种
create index index_name on table_name (column_list) ;
create unique index index_name on table_name (column_list) ;
5.3 查看索引
show index from tblname;

删除索引
drop index index_name on table_name ;
alter table table_name drop index index_name ;
alter table table_name drop primary key ;
5.4 获取字段信息 enum 等
show columns from tbl_user like ‘status‘

5.5 导出单个表
D:\xampp\mysql\bin\mysqldump -uroot -padmin elong el_hotel>el_hotel.sql

5.6 输入以下SQL语句,创建一个具有root权限的用户(admin)和密码(12345678):
GRANT ALL PRIVILEGES ON *.* TO ‘admin‘@‘localhost‘ IDENTIFIED BY ‘12345678‘;
GRANT ALL PRIVILEGES ON *.* TO ‘admin‘@‘127.0.0.1‘ IDENTIFIED BY ‘12345678‘;
//授权phplamp用户拥有phplamp数据库的所有权限。
grant all privileges on phplampDB.* to phplamp@localhost identified by ‘1234‘; (账户不存在,新创建)

如果想指定部分权限给一用户,可以这样来写:
mysql>grant select,update on phplampDB.* to phplamp@localhost identified by ‘1234‘; (账户不存在,新创建)


远程登陆
GRANT ALL ON *.* TO admin@‘%‘ IDENTIFIED BY ‘admin‘ WITH GRANT OPTION;
允许任何IP地址(上面的 % 就是这个意思)的电脑 用admin帐户 和密码(admin)来访问这个MySQL Server; root帐户是无法远程登陆的,只可以本地登陆

删除用户帐号
DROP USER user_name;
改名
RENAME USER old_name TO new_name;

查看用户的权限可以用(常用)
SHOW GRANTS FOR user_name;

撤销权限:(常用)
GRANT SELECT ON testdb.* TO user_name; 表示将用户对testdb数据库中所有表的SELECT权限增加. (账户存在)
REVOKE SELECT ON testdb.* FROM user_name; 表示将用户对testdb数据库中所有表的SELECT权限撤销. (账户存在)

GRANT ALL PRIVILEGES ON `hotelinr`.* TO ‘liuzhao‘@‘%‘; 增加拥有数据库hotelinr 的权限 (账户存在)
REVOKE ALL PRIVILEGES ON `hotelinr`.* FROM ‘liuzhao‘@‘%‘; 撤销拥有数据库hotelinr 的权限 (账户存在)

flush privileges;

5.7 修改mysql账号
update user set Password=password(‘123456‘) where User=‘root‘

5.8 还原Mysql时出现错误:Unknown command ‘\n’ 或者 ‘\’ 或者 ‘\\’ 等,
这是因为编码的不一致把导致的错误,还原的时候可以进行转码: --default-character-set=utf8 解决
mysql -uroot -padmin --default-character-set=utf8 taobao <d:/topay_hotels.sql

5.9 mysql复制一个数据库中的一张表到另外一个数据库
Insert into db1.table1 select * from db2.table2

6.0 explain [extended] select ... from ... where ...
type: range //访问类型
key: x //索引名
Extra: Using where; Using filesort

Explain的type显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
一般来说,得保证查询至少达到range级别,最好能达到ref,否则就可能会出现性能问题。
6.1 强制索引 FORCE INDEX (index_name)
EXPLAIN SELECT author_id FROM `article` FORCE INDEX ( y ) WHERE category_id = 1 AND comments > 1 ORDER BY views DESC LIMIT 1

6.2 唯一约束应用到两个字段的组合
mysql> create table table1 (
-> field1 int,
-> field2 int,
-> unique key (field1,field2)
-> );
INSERT table1(field1,field2) VALUES(1,2);以后再 INSERT table1(field1,field2) VALUES(1,2);就不让他插入,
而INSERT table1(field1,field2) VALUES(1,1);或 INSERT table1(field1,field2) VALUES(2,2); 就可以插入,

新增一个约束
alter table tablename add unique key 约束名(field1,field2);
删除唯一约束
先用SHOW CREATE TABLE table table_name;查询出表结构,然后找到相应字段的索引名,最后删除索引ALTER TABLE table_name DROP INDEX index_name;
6.3 默认值为当前时间
1、自动UPDATE 和INSERT 到当前的时间:
`p_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
2、自动INSERT 到当前时间,不过不自动UPDATE
`p_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
3、一个表中不能有两个字段默认值是当前时间,只能以程序控制
`p_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`p_timew2` timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00‘

6.4 mysql 安装服务 mysqld --install mysql3307 在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\项目找到刚才手动安装的服务
修改mysql3307下面的ImagePath数值 "D:\mysql5.1\3307\bin\mysqld" --defaults-file="D:\mysql5.1\3307\my.ini" MySQL3307

6.5 查看表的所有信息:show create table 表名;
删除主键约束:alter table 表名 drop primary key;
删除外键约束:alter table 表名 drop foreign key 外键(区分大小写);

6.6 查看mysql连接数
mysqladmin -uroot -p processlist

6.7 复制表结构 表数据
一、新建表 CREATE TABLE 方法
整表复制: create table 新表 select * from 旧表;
结构复制: 1、create table 新表 select * from 旧表 where 1<>1;
2、CREATE TABLE 新表 LIKE 旧表;

二、已有表 INSERT INTO 方法
得到建表语句: show create table 旧表;
复制数据到新表:
1、复制旧表的数据到新表(假设两个表结构一样)
INSERT INTO 新表 SELECT * FROM 旧表;
2、复制旧表的数据到新表(假设两个表结构不一样)
INSERT INTO 新表(字段1,字段2,…….) SELECT 字段1,字段2,…… FROM 旧表;

6.8 直接操作mysql
mysql -uroot -padmin -e "use el_agency;select username from tbl_user limit 1"

6.9 两个关联表之间的关联更新
update g_products as a,ghotel_room_mapping as b set a.sjl_roomname=b.partner_roomname where b.partner_roomname!=‘‘ and a.hotelid=b.hotelid and a.roomid=b.roomid and a.rpid=b.rpid
mysql update 与 left join 一起使用联合多表更新数据
UPDATE table_1 a LEFT JOIN table_2 b ON b.id = a.id SET field=value WHERE b.field> 10 AND a.field =1

7.0 如果您指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则执行旧行 UPDATE c=c+1 即 有则更新 无则添加
INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1,visit_time=NOW();

批量插入时 使用ON DUPLICATE KEY UPDATE ,使用VALUES 获取字段中的值
INSERT INTO aa (`id`,`hid`,`roomid`) VALUES (1,2,7),(2,5,8),(3,5,9),(4,5,10) ON DUPLICATE KEY UPDATE `roomid`=VALUES(roomid)

7.1 insert ignore into
当插入数据时,如出现错误时,如重复数据,将不返回错误,只以警告形式返回。所以使用ignore请确保语句本身没有问题,否则也会被忽略掉

7.2 replace into
如果存在primary or unique相同的记录,则先删除掉。再插入新记录

7.3 以XML格式查看查询结果
shell> mysql --xml
mysql> SELECT * FROM test.stories;

例如:shell> mysql --xml -u root -padmin -e "use yt_ghotel_data;select * from g_hotels;">d:/aa.xml

7.4 select * from table where (ID = 10) or (ID = 32) or (ID = 22) or (ID = 76) or (ID = 13) or (ID = 44) 让结果按10,32,22,76,13,44的顺序检索出来,请问如何书写?
答:select * from table where (ID = 10) or (ID = 32) or (ID = 22) or (ID = 76) or (ID = 13) or (ID = 44) order by field(ID,10,32,22,76,13,44)

7.5 整理mysql缓存碎片 FLUSH QUERY CACHE;
清空mysql缓存 RESET QUERY CACHE;

7.6 批量替换字段内容
UPDATE 表名 SET 字段名 = REPLACE (字段名, ‘aaa‘, ‘bbb‘);

7.7 查看存储过程
show create procedure proc_name; //查看指定存储过程
select `name` from mysql.proc where db = ‘your_db_name‘ and `type` = ‘PROCEDURE‘; //查看全部存储过程
show function status; 查看全部方法
7.8 新建表时指定使用innodb 还是 MySIAM
create table xx(
....
) engine=myisam
查看表使用的哪个引擎
show create table tablename;
show table status like ‘tablename’\G
查看所有引擎及默认引擎 如果想改变默认的存储引擎,可以修改my.ini文件中的default-storage-engine
show engines
7.9 使用ALTER TABLE把MyISAM表格移动到InnoDB的引擎
ALTER TABLE tablename CHANGE TYPE=InnoDB
alter table tablename engine=myisam;

8.0 将txt 导入mysql
load data local infile ‘D:\data.txt‘ into table tablename fields terminated by ‘\t‘;

8.1 创建表同时创建索引
create table tablename(id int(11) primary key auto_increment,hotelid int(8) not null default ‘0‘, index hotelid_inx(hotelid));

8.2 查看没有关闭的连接 mysql> show processlist; mysql> show full processlist;
查看最大连接数 mysql> show variables like ‘%max_connections%‘;

8.3 查询索引的使用率 show status like “Header_read%”; 值越高表明索引的使用率越高
8.4 大批量添加数据
对于MyISAM:
alter table table_name disable keys;
Loading data//insert 语句
alter table table_name enable keys;
对于InnoDB:
将要导入的数据按照主键排序
set unique_checks=0,关闭唯一性校验
set autocommit=0,关闭自动提交

8.5 sql优化小技巧
order by null 使用group by分组查询是默认分组后,还要进行排序,这样可能会降低速度。在group by之后加上order by null这样就会阻止排序
尽量使用left join(左外连接)代替多表查询
optimize table table_name; 如果你的数据库存储引擎是MyISAM,一定要定时进行碎片清理(否则删除的数据永远不会丢失)

8.6 SUBSTRING_INDEX 将某个字段里的内容进行分割并写入到其他字段中

SELECT
SUBSTRING_INDEX(phone,‘-‘,2) AS PNumber,
SUBSTRING_INDEX(phone,‘-‘, -1) AS Ext,
phone FROM tb_user
WHERE ucid=271338;
+--------------+------+-------------------+
| PNumber | Ext | phone |
+--------------+------+-------------------+
| 010-88888882 | 5612 | 010-88888882-5612 |
+--------------+------+-------------------+
8.7 去除最后一位字符
substring(insert_str,1,length(insert_str)-1)

8.8 查看表的字段comment 备注
SELECT
COLUMN_NAME,
COLUMN_COMMENT
FROM information_schema.COLUMNS WHERE TABLE_NAME=‘outside_base‘


8.9 查看数据库的编码方式
show variables like ‘character%‘;

9.0 mysql本地或远程建立function或procedure时报上面的错误
my.cnf
[mysqld] 下加上
log_bin_trust_function_creators=1


9.0 MySQL快速复制数据库的方法
#mysqldump db1 -u root -ppassword --add-drop-table | mysql newdb -u root -ppassword
#mysqldump db1 -uroot -ppassword --add-drop-table | mysql -h 192.168.1.22 newdb -uroo 远程

9.1 批量删除表
Select CONCAT( ‘drop table ‘, table_name, ‘;‘ ) FROM information_schema.tables Where table_name LIKE ‘hotelrate_%‘;

9.1 source 时很慢
将innodb_flush_log_at_trx_commit设为0
set global innodb_flush_log_at_trx_commit=0;

9.2 查看innodb状态
5.1后版本 show engine innodb status\G;
5.1前版本 show innodb status\G;
9.3 union ,union all
union 会去掉重复 适用两个表取并集
union all 保留重复数据 适用于重合两个表

9.4 查询表的自身属性
desc information_schema.tables;
SELECT table_name, create_time FROM information_schema.tables WHERE table_name like ‘hotelrate_%‘ and create_time>‘2014-12-02‘;

9.5 SELECT UNIX_TIMESTAMP(‘2012-06-08‘) => 1339084800
SELECT UNIX_TIMESTAMP(CURRENT_DATE()) =>1339084800 注: CURRENT_DATE 返回date字符串格式
SELECT UNIX_TIMESTAMP(NOW()) => 1339123415 注:NOW()的返回值是一个DATETIME字符串格式
SELECT FROM_UNIXTIME(‘1427373406‘,‘%Y-%m-%d %H:%i:%s‘); =>2015-03-26 20:36:46


9.6 MySQL的binlog数据查看
只查看第一个binlog文件的内容
mysql>show binlog events;
查看指定binlog文件的内容
mysql>show binlog events in ‘mysql-bin.000002‘;
查看当前正在写入的binlog文件
mysql>show master status\G
获取binlog文件列表
mysql>show binary logs;

本地查看
基于开始/结束时间
mysqlbinlog --start-datetime=‘2013-09-10 00:00:00‘ --stop-datetime=‘2013-09-10 01:01:01‘ -d 库名 二进制文件
基于pos值
mysqlbinlog --start-postion=107 --stop-position=1000 -d 库名 二进制文件

9.7 在频繁的update之后要执行optimize table来消除碎片
9.8 查看表状态 show table status from database \G; ## data_free 值可以查看碎片占用空间大小
9.9 获取InnoDB行锁争用情况
mysql>show status like ‘innodb_row_lock%‘;
还可以通过设置InnoDB Monitors来进一步观察发生锁冲突的表、数据行等,并分析锁争用的原因

10.0 查看表的索引情况
mysql> show index from tablename\G
10.1 ip to int UNSIGNED
mysql> select INET_ATON(‘127.0.0.1‘);
mysql> select INET_NTOA(‘2130706433‘);

10.2查看语句是否用到临时表
EXPLAIN 计划结果的 Extra ,包含 Using Temporary 表示会用到临时表

10.3 group_concat 默认是以逗号分隔 可以自定义 ;group_concat有长度限制默认1024 可以手工更改group_concat_max_len 系统变量
mysql> select * from aa;
+------+------+
| id| name |
+------+------+
|1 | 10|
|1 | 20|
|1 | 20|
|2 | 20|
|3 | 200 |
|3 | 500 |
mysql> select id,group_concat(name) from aa group by id;
+------+--------------------+
| id| group_concat(name) |
+------+--------------------+
|1 | 10,20,20|
|2 | 20 |
|3 | 200,500|

mysql> select id,group_concat(name SEPARATOR ‘;‘) from aa group by id; #自定义分隔
+------+--------------------+
| id| group_concat(name) |
+------+--------------------+
|1 | 10;20;20|
|2 | 20 |
|3 | 200;500|

mysql> select id,group_concat(name SEPARATOR ‘;‘) from aa group by id; #排序
+------+--------------------+
| id| group_concat(name order by id desc) |
+------+--------------------+
|1 | 20;20;10|
|2 | 20 |
|3 | 500;200|

mysql> select id,group_concat( DISTINCT name SEPARATOR ‘;‘) from aa group by id; #DISTINCT
+------+--------------------+
| id| group_concat(name order by id desc) |
+------+--------------------+
|1 | 20;10|
|2 | 20 |
|3 | 500;200|


 

mysql常用

标签:

原文地址:http://www.cnblogs.com/wangxusummer/p/4955332.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!