linux mysql selected_linux下mysql使用简介

----------------更新日志------------------

2013/01/04 补充【常用SQL语句】两个表之间数据复制;补充【SQL中常用函数】类型转换

2012/11/18 补充【SQL中常用函数】获取指定时间

2012/09/26 补充【常用SQL语句】创建索引

2012/09/04 增加【异常处理】

2012/08/02 补充【SQL中常用函数】输出到CSV文件

2012/07/03 补充【SQL中常用函数】字符串查找,where in查询结果按照in中的排序

2012/06/15 增加【SQL模糊匹配】

2012/06/01 补充【常用SQL语句】

2012/04/19 补充【常用SQL语句】

2012/04/06 补充【常用SQL语句】left join重复问题

2012/03/30 补充【常用SQL语句】

2012/03/28 补充【SQL中常用函数】

2012/02/23 增加【mysql的日志清除】

2012/01/30 增加 常用SQL语句

2012/01/29 初版

------------------------------------------

目录

【mysql安装】

【常用SQL语句】

【SQL模糊匹配】

【SQL中常用函数】

【mysql安装】

【mysql中的键】

【mysql的sql文本文件】

【mysql的日志清除】

【异常处理】

【navicat for mysql】

【查询大小写区分】

【参考资料】

【SQL模糊匹配】

------------------------------------------

【mysql安装】

安装选项

--with-plugins=myisam,innodb_plugin,innobase

数据库目录

/var/lib/mysql/

配置文件目录

/etc/my.cnf

log目录

/var/lib/mysql/[hostname名].err

初始化数据库:

mysql_install_db --user=mysql

启动:

mysqld start  或者 service mysql start

停止:

mysqld stop

是否支持innodb查询:

show variables like 'have_innodb';

【常用SQL语句】

1)连接数据库

连接远程mysql数据库

mysql -uremoteuser -pmh_db_server -h65.255.42.38

-Djoyhero_user

mysql常用参数:“

--skip-column-names 查询结果不显示表头标题,例如:

mysql --skip-column-names -e "update table set field=xx limit

10;select row_count();"

1)查看表结构信息

show create table mem_tip_info;

2)查看前几条数据

select uid from sys_user limit 2;

SELECT * FROM table  LIMIT [offset,] rows |

rows OFFSET offset

SELECT * FROM mytable LIMIT 5,10;  // 检索记录行

6-15

3)插入一条数据,若存在则更新某几个字段的值

ON DUPLICATE KEY UPDATE

例如:insert into test2 select * from test1 on duplicate key update

a = 'REMOVE-ME';

http://blog.csdn.net/cheungjustin/article/details/5992445

4)导入表定义sql文件

命令行输入: mysql -h localhost -u root -p mydb2 <

e:\mysql\mydb2.sql

mysql -h localhost -u star -p star < \

5)插入多条数据

insert into sys_mail_system (uid, content_id) values(1, 'a'),

(2, 'b');

替换形式插入:

replace into sys_mail_system (uid, content_id) values(1, 'a'),

(2, 'b');

6)清空表中所有数据

truncate table log_gm_operate;  立即执行

delete from log_gm_operate;

7)修改表数据

update 表名 set 字段=新值,… where 条件

mysql> update MyClass set name='Mary' where

id=1;

8)当前数据库包含的表信息:

mysql> show tables; (注意:最后有个s)

9)显示所有的数据库

命令:show databases (注意:最后有个s)

mysql> show databases;

10)数据库导出导入操作

mysqldump导出database或table:

mysqldump -u -p

[table1 table2]

> dump.sql

例如:

mysqldump -u wcnc -p smgp_apps_wcnc >

wcnc.sql

导出表部分数据

mysqldump -uroot -p'njmysqlurp543' joyhero_index user_index

--where="uid <=200" >

user_index_100.sql

恢复数据库或表

mysql -u username -p password dbname <

filename.sql

其它参数说明:

--databases:

mysqldump后跟的所有都是database,而不是table。这个在需要备份多个数据库的时候有效。

如果使用了--databases参数,则在导入的时候可以不指定数据库,并且数据库可不存在。

例如:

-t or --no-create-info

这个选项使的mysqldump命令不创建CREATE

TABLE语句,这个选项在您只需要数据而不需要DDL(数据库定义语句)时很方便。

-d or --no-data 这个选项使的mysqldump命令不创建INSERT语句。

在您只需要DDL语句时,可以使用这个选项。

11)两个数据库之间拷贝

$mysqldump database [table] | mysql [-h other.host.com]

database1

12)左关联

left join on

where子句

select  A.ID as AID, B.ID as BID

from A left join B on A.ID = B.ID where

B.ID<3

关联产生多条数据解决方案:

http://www.forasp.cn/html/2291.html

select product.*,foraspcn.image from product left join(select

imagename,pid from image group by pid) foraspcn on product.pid =

foraspcn.pid;

第二张表现group by滤掉重复数据,GROUP BY 是分组查询, 一般 GROUP BY 是和 聚合函数配合使用,

13)修复表

REPAIR TABLE [表名称];

http://blog.chinaunix.net/space.php?uid=20447986&do=blog&id=1945633

14)用户权限查看和修改

mysql>use

mysql> grant all on *.* TO user12@'127.0.0.1'

identified by "user12" with grant option;

grant all on *.* TO user12@localhost identified by "user12" with

grant option;

mysql>GRANT ALL ON *.* TO star@localhost

IDENTIFIED BY "star" WITH GRANT OPTION;

mysql>GRANT ALL ON *.* TO star@127.0.0.1

IDENTIFIED BY "star" WITH GRANT OPTION;

grant all on *.* to 'remoteuser'@"%" identified by

"mh_db_server"

注意密码必须要用双引号

show grants for star@localhost

show grants for star@'%'

http://hi.baidu.com/drinfgu/blog/item/20ed39dbc902b2163af3cf18.html

15)表结构增加一列

alter table mytable add column single char(1) not null;

16)创建数据库

create database

17)位运算

&  就是与运算

SELECT  *  FROM

TABLE  WHERE

(ID  &

0x01);

这样就把ID为奇数的记录选出来了

18)获取当前时间

select now();

select curdate();

select curtime();

19 where in查询结果按照in中的排序

使用find_in_set

例如:Select * FROM table1 Where (ID IN (3,5,1,4,2))

ORDER BY FIND_IN_SET(ID, '3,5,1,4,2')

20)查看当前时区

show variables like '%time_zone%';

如果mysql时间和系统时间不一致,重启服务器

21)查询一周三个月半年之内的数据

如果数据行中有一个保存日期/时间的数据my_date

下面是查询一周内的数据:

SELECT  *

FROM  table_name

WHERE  (DATE_SUB(CURDATE()

-  INTERVAL  7  DAY)  <=

my_date);

其他的类似  三个月  INTERVAL  3  MONTH  ......

半年

INTERVAL  6  MONTH  ......

22)

iconv -f utf-8 -t gb2312 /server_test/reports/software_.txt

> /server_test/reports/software_asserts.txt

23)分隔字符串,获取部分字符串

SQL: update `edw_video` set company =

substring(keyword,1,length(SUBSTRING_INDEX(keyword,",",1)))

说明:str 要split的目标字符串 (输入格式为‘11,2,3,4,5,6’; 输出为‘2,3,4,5,6’)

delimiter

分隔符 (‘,’)

split1

输出第一项(‘11’)

--截取第二个 '.' (倒数)之后的所有字符。

mysql> select

substring_index('www.sqlstudy.com.cn', '.', -2);

字符串操作:

http://www.cnblogs.com/tillere007/archive/2010/06/09/1754985.html

24)输出到csv文件

mysql user12_s251 -e"select id, name from mem_user into outfile

'/tmp/data.csv'";

25) 创建索引

CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX

index_name

[index_type]

ON tbl_name (index_col_name,...)

-- 创建无索引的表格

create table testNoPK (

id int not null,

name varchar(10)

);

-- 创建普通索引

create index IDX_testNoPK_Name on testNoPK

(name);

26)两个表之间数据复制

经常会遇到需要表复制的情况,如将一个table1的数据的部分字段复制到table2中,或者将整个table1复制到table2中,

这时候我们就要使用SELECT INTO 和 INSERT INTO SELECT 表复制语句了。

-- INSERT INTO SELECT语句

语句形式为:Insert into Table2(field1,field2,...) select

value1,value2,... from Table1

要求目标表Table2必须存在,由于目标表Table2已经存在,所以我们除了插入源表Table1的字段外,还可以插入常量。

-- SELECT INTO FROM语句

语句形式为:SELECT vale1, value2 into Table2 from Table1

要求目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中。

替代方法: create table new_table_name (Select * from

old_table_name);

【SQL模糊匹配】

我们都知道SQL查询过程中,单引号“'”是特殊字符,所以在查询的时候要转换成双单引号“''”。

但这只是特殊字符的一个,在实际项目中,发现对于like操作还有以下特殊字符:下划线“_”,百分号“%”,方括号“[]”以及尖号“^”。

其用途如下:

下划线:用于代替一个任意字符(相当于正则表达式中的 ? )

百分号:用于代替任意数目的任意字符(相当于正则表达式中的 * )

方括号:用于转义(事实上只有左方括号用于转义,右方括号使用最近优先原则匹配最近的左方括号)

尖号:用于排除一些字符进行匹配(这个与正则表达式中的一样)

以下是一些匹配的举例,需要说明的是,只有like操作才有这些特殊字符,=操作是没有的。

a_b...

a[_]b%

a%b...

a[%]b%

a[b...

a[[]b%

a]b...

a]b%

a[]b...

a[[]]b%

a[^]b...

a[[][^]]b%

a[^^]b...

a[[][^][^]]b%

对于like操作,需要进行以下替换(注意顺序也很重要)

[ -> [[]  (这个必须是第一个替换的!!)

% -> [%]  (这里%是指希望匹配的字符本身包括的%而不是专门用于匹配的通配符)

_ -> [_]

^ -> [^]

【SQL中常用函数】

1)获取unix系统时间

时间戳

获取当前时间戳:unix_timestamp();

unix_timestamp(date) 如果调用时没有参数,以无符号的整数形式返回一个 Unix 时间戳(从

'1970-01-01 00:00:00' GMT 开始的秒数)。如果以一个参数 date 调用

UNIX_TIMESTAMP(),它将返回该参数值从 '1970-01-01 00:00:00' GMT 开始经过的秒数值。date

可以是一个 DATE 字符串,一个 DATETIME 字符串,一个 TIMESTAMP,或者以一个 YYMMDD 或 YYYYMMDD

显示的本地时间

例如:

字符串形式:

sysdate()

例如:select sysdate(); 返回2008-08-08 14:47:11

2)将时间戳直接转换成日期时间

FROM_UNIXTIME

例如:

select

uid,userid,username,email,FROM_UNIXTIME(addtime,'%Y年%m月%d日') from

members

3)把结果集按照规则连接成字符串

group_concat()

该函数返回带有来自一个组的连接的非NULL值的字符串结果。

group_concat(字段名 SEPARATOR '分隔符')

group_concat长度有默认限制,修改方法是在同一个session中执行如下语句

SET group_concat_max_len = 100000

4)返回当前连接的最后一次插入的自增字段值

例如: select last_insert_id()

5)把结果集按照规则连接成字符串

group_concat()

默认按逗号分割,例如:

select group_concat(cid) from sys_city where uid= $uid

可以指定分隔符,例如:

select group_concat(cid,SEPARATOR '|||') from sys_city where

uid= $uid

6) 字符串连接函数

mysql字符串连接 concat函数

使用方法:

concat(str1,str2,…)

mysql向表中某字段后追加一段字符串:

update table_name set field=concat(field,'str')

mysql 向表中某字段前加字符串

update table_name set field=concat('str',field)

返回结果为连接参数产生的字符串。如有任何一个参数为null ,则返回值为 null。

8)字符串查找 (查询某字段中包含以逗号分隔的字符串的记录)

SELECT * FROM test WHERE find_in_set('3',pnum) OR

find_in_set('9',pnum);

+----+-------+---------+

| id | pname | pnum  |

+----+-------+---------+

|  3 | 产品3 | 3,4  |

|  4 | 产品4 | 1,7,8,9 |

+----+-------+---------+

9)字符串截取

substr:字符串截取函数。substr($str,$start,$end)

MySQL中的substr函数中如要从第一个字符开始截取,则第一个参数应该为1;

10)获取指定时间

昨天凌晨3点钟

unix_timestamp(concat(DATE_SUB(CURDATE(), INTERVAL 1 DAY),'

03:00:00'))

今天凌晨3点钟

unix_timestamp(concat(CURDATE(),' 03:00:00'))

前天的日期(字符串形式)

date_format(curdate()-1,'%Y%m%d')

11)类型转换

Cast(value as type)或者 Convert(value ,type);

可以转换的type如下:

二进制,同带binary前缀的效果 : BINARY

字符型,可带参数 : CHAR()

日期 : DATE

时间: TIME

日期时间型 : DATETIME

浮点数 : DECIMAL

整数 : SIGNED

无符号整数 : UNSIGNED

例如:

update table_name set next_check_time=

unix_timestamp(concat('2012-12-27 ',cast(send_hour_minute as

char),':00')) where

next_check_time<>0;

【mysql中的键】

unique是当你定义数据库时候对某个字段限制唯一值(就是这个值不能重复)

primary key定义这个表的主键(比如id,不能重复,不能为空)

foreign

key定义这个表的外键(与其他表关联的键,比如Students表的id字段与Course表的id字段相对应)

check是定义这个字段只能输入满足条件的,比如sex字段,只能输入男和女)

Create Students(

id varchar(10) not null,

name varchar(20) not null unique,

sex varchar(2) not null check(sex ='男' or sex = '女'),

address varchar(30) null,

primary key (id),

id int foreign key references Course(id)

);

00001 name1 男 address1(可以输入)

00001 name3 男 address2(不可以输入,id主键不能重复)

00002 name1 男 address3(不可以输入,name字段必须唯一)

00004 name4 她 address4(不可以输入,sex字段必须是男或女)

00005 name5 女 address5(可以输入)

【mysql的sql文本文件】

1. 添加注释

mysql 服务器支持 # 到该行结束、-- 到该行结束 以及 的注释方格:

mysql> SELECT 1+1;  # 这个注释直到该行结束

mysql> SELECT 1+1;  -- 这个注释直到该行结束

mysql> SELECT 1 + 1;

【mysql的日志清除】

1)空链接到数据库 mysql -uroot -p

2)show master logs; 查看目前的log列表

3)删除log信息

purge master logs to‘mysql-bin.000067';

表示mysql-bin.000067之前的bin日志将被删除

PURGE MASTER LOGS BEFORE‘2008-12-19 21:00:00';

4)进行查看确认 show master logs;

/var/lib/mysql

【异常处理】

1. 查看执行比较慢的SQL语句

vim /var/lib/mysql/mysql-slow.log

./mysqladmin processlist | grep -i Locked

2. 杀死锁死的进程

for i in `./mysqladmin processlist | grep -i Locked

| awk '{print $2}'`;do ./mysqladmin kill $i ;

done

【navicat for mysql】

1. 两个数据库表结构比较与差分脚本生成

菜单 -> Tools -> Structure

Synchronization

2. 两个数据库表数据同步

菜单 -> Tools -> Data

Transfer...

3. 远程机连接

http://blog.sina.com.cn/s/blog_48f9c0840100tp5h.html

【查询大小写区分】

1.方法一:设置字段的collate属性

http://www.codesky.net/article/201112/121977.html

【存储过程】

mysql中怎么拆分以逗号隔开的字符串

http://bbs.csdn.net/topics/380168180

mysql中split函数

http://zy116494718.iteye.com/blog/1156863

【参考资料】

Linux下安装mysql

http://wenda.tianya.cn/wenda/thread?tid=79f41c7a7e0a7551

InnoDB和MyISAM的区别

http://www.cnblogs.com/villion/archive/2009/07/09/1893762.html

navicat使用

http://wenku.baidu.com/view/1bf8584469eae009581becfd.html

mysql常用命令

http://www.cnblogs.com/hateislove214/archive/2010/11/05/1869889.html

MySql安装及数据库导入导出

http://wenku.baidu.com/view/f53930294b73f242336c5f40.html

让MySQL支持InnoDB :

http://www.geekso.com/post/124/

MySQL数据库中SQL语句中 关于日期、时间\时间戳的函数

http://ggmmchou.blog.163.com/blog/static/59333149201112625426846/

select last_insert_id()语句 和 mysql_insert_id函数 的区别

http://hi.baidu.com/traindiy/blog/item/81f56163f081696b0d33fac8.html

MySQL内置函数获取几天前的日期

http://blog.csdn.net/amber_room/article/details/7024896

启动多个实例

http://xukaizijian.blog.163.com/blog/static/17043311920110309562210/

本文原创,转载请注明出处 http://blog.sina.com.cn/faithfish

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值