mysql实用指令

连接

mysql -h192.168.1.113 -uroot -P3306 -phaha

-p后面接密码

-u后面接用户名

MARK:

后面所有用到的sql命令。。比如下面的建表命令:

`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',

`id` 后面要接空格 不能接table键的

建表

 CREATE TABLE `tableA` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',

`name` varchar(1024) NOT NULL DEFAULT '' COMMENT '用户名',

`status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '状态:0为无效,1为生效',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;


删除表
Drop table tableA;


插入数据

INSERT INTO tableA(id, name, status) VALUES(1, "wawa", 1);

修改字段属性:

复制代码
-- 修改字段属性
-- ALTER TABLE tb_name MODIFY 字段名称 字段类型 [完整性约束条件]
-- 将email字段 VARCHAR(50)修改成VARCHAR(200)
-- 注意,修改时如果不带完整性约束条件,原有的约束条件将丢失,如果想保留修改时就得带上完整性约束条件
ALTER TABLE user10 MODIFY email VARCHAR(200) NOT NULL DEFAULT 'a@a.com';

-- 将card移到test后面
ALTER TABLE user10 MODIFY card CHAR(10) AFTER test;

-- 将test放到第一个,保留原完整性约束条件
ALTER TABLE user10 MODIFY test CHAR(32) NOT NULL DEFAULT '123' FIRST;
复制代码

修改字段名称和属性:

-- 将test字段改为test1
-- ALTER TABLE 表名 CHANGE 原字段名 新字段名 字段类型 约束条件
ALTER TABLE user10 CHANGE test test1 CHAR(32) NOT NULL DEFAULT '123';


更新数据

update tableA set name='roro' where id=1;

查询

select * from tableA;

查询数学运算

select count(*) from tableA where sfiled1='aaa' and mod(ivalue,100)>0; 取模运算..

数值运算符函数 
SELECT CEIL(3.01) ==>4 /*有n.xx 都是n+1 进一取整 向上取整 
SELECT FLOOR(3.99) ==>3 /*取n.xx 都是n 舍一取整 向下取整 
SELECT 3 DIV 4 ==> 0 /*整数除法,取商 
SELECT 3/4 ==>0.75 /*除法 
SELECT 2.1 MOD 2 ==>0.1 /*取余数(取模) 被除数是整数,小数都可以 
SELECT 21 % 2 ==>1 /*取余数 mod=% 
SELECT POWER(3,4) ==>81 /*3的4次方 幂运算 
SELECT ROUND(3.1415926,4) ==>3.1416 /*四舍五入,保留4位小数 
SELECT TRUNCATE(123.89,1) ==>123.8 /*截取小数点后的位数 
SELECT TRUNCATE(123.89,0) ==>123 /*截取小数点后的位置,0位为整数部分 
SELECT TRUNCATE(123.89,-1) ==>120 /*截取-1,从个位起去掉后面的数值替换为0

聚合函数 
只有一个返回值 
AVG() - 平均值 
SELECT ROUND(AVG(goods_price),2) AS avg_price FROM tdb_goods; 
COUNT() - 计数 
SELECT COUNT(goods_id) as counts FROM tdb_goods; 
MAX() - 最大值 
SELECT MAX(goods_price) as counts FROM tdb_goods; 
MIN() - 最小值 
SUM() - 求和 
SELECT SUM(goods_price) as counts FROM tdb_goods;


查看表结构:

desc tablename;

show create table tablename;

如果要清空表中的所有记录,可以使用下面的两种方法:

  DELETE FROM table1
  TRUNCATE TABLE table1

 

 

无则插入 有则更新..

假设有个表mypro 有id,ts,card,age 4个字段

insert into mypro values(12306,100000,3,0) on duplicate key update age= 3, ts=2222;

时间字段为DATATIME格式时,查询语句如下:

select uid, UNIX_TIMESTAMP(create_time), order_id, pay from gold_list where create_time > FROM_UNIXTIME(iBgnTm) and create_time < FROM_UNIXTIME(iEndTm);

关于索引

假如表结构如下:

CREATE TABLE `goldlist` (
`uid` bigint(20) DEFAULT NULL,
`pay` double(20,2) NOT NULL,
`status` tinyint(4) NOT NULL,
`createtime` int(11) DEFAULT NULL,
PRIMARY KEY (`uid`),
KEY `status_index` (`status`,`createtime`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8

那么select * from goldlist where createtime>1494321000;的性能和select * from goldlist where createtime>1494321000 and status=1;之间性能的差距 是几十倍甚至于上百倍..

其中 status_index是联合索引 查询的时候 需要将status和createtime填全才能起到加速作用..

另外如果status的取值是多个。。比如1,2,3,4都是不同含义,而预想查询的是>3的范围。。那么语句可以写成select * from goldlist where createtime>1494321000 and status in(3,4);千万别写成status>2或者是status>=3;

添加索引:

ALTER TABLE `goldlist` ADD INDEX status_index( `status`,`createtime` ); 

取最新的问题:

select EventId, UserId, EventType, max(EventId) as b  from GuessData group by UserId order by b desc;

EventId是db里自增的数据序号值,因为group by只会取最旧的一个,要取最新的话 只能用max()

 UPDATE和REPLAC的区别

UPDATE和REPLACE基本类似,但是它们之间有两点不同。   
首先查重,
1. 当没有找到匹配记录(不存在重复记录)时:
    UPDATE什么都不做,
    REPLACE会做insert动作。
2. 当找到匹配记录(存在重复记录)时:
    UPDATE可以更新记录的一部分字段。
    REPLACE将已存在记录彻底删除(DELETE),再插入新的记录(INSERT)。也就是说,将所有的字段都更新为新记录的字段了。

去重语法 DISTINCT 

比如 PLAN_NUMBER和PRODUCT_NAME字段去重,语句:SELECT DISTINCT PLAN_NUMBER,PRODUCT_NAME FROM psur_list;

添加表字段

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

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

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

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

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

如果要删除某一字段

可用命令:ALTER TABLE mytable DROP 字段名;

重命名表

alter table  旧名 rename 新名; 

用终端连接太慢时候处理

今天使用mysql -hhostname -uusername -ppassword -Pport的方式进入数据,连接成功。

然后运行了use dbname命令,出现了下面一段话。

第一次见到这个语句,所以查了一下。

Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

出现问题的原因是:: 我们进入mysql 时,没有使用-A参数; 当我们打开数据库,即use dbname时,要预读数据库信息,当使用-A参数时,就不预读数据库信息。

当数据库中表非常多,如果预读数据库信息,将非常慢,可能会卡住,如果数据库中表非常少,将不会出现问题。

正确的打开方式是: mysql -hhostname -uusername -ppassword -Pport -A的方式进入数据库。

原文地址:https://www.cnblogs.com/yylingyao/p/6747596.html