mysql汇总常用操作

时间:2022-02-02 06:40:36

====================== PREPARE + EXECUTE  预备一个语句并执行

 

MySQL prepare语法:

PREPARE statement_name FROM preparable_SQL_statement; /*定义*/
EXECUTE statement_name [USING @var_name [, @var_name] ...]; /*执行预处理语句*/
{DEALLOCATE | DROP} PREPARE statement_name /*删除定义*/ ;

PREPARE语句用于预备一个语句,并指定名称statement_name,以后引用该语句。语句名称对大小写不敏感。preparable_stmt可以是一个文字字符串,也可以是一个包含了语句文本的用户变量。该文本必须表现为一个单一的SQL语句,而不是多个语句。在这语句里,‘?’字符可以被用于标识参数,当执行时,以指示数据值绑定到查询后。‘?’字符不应加引号,即使你想要把它们与字符串值结合在一起。参数标记只能用于数据值应该出现的地方,而不是SQL关键字,标识符,等等。

如果预语句已经存在,则在新的预语句被定义前,它会被隐含地删掉。

 

 

 

    SET @v_sql = CONCAT('UPDATE ',_order_table,' AS o SET `status`=2 WHERE o.status=0;');

    PREPARE stmt FROM @v_sql;
    EXECUTE stmt ;
    DEALLOCATE PREPARE stmt;

 

 

 

 

====================== CONCAT

 

CONCAT(str1,str2,…)返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。

 

SET @type = CONCAT(_type,' AS `type`');

 

 

======================= mysql

 

-f 碰到错误继续执行
mysql -f $db_root_name $db_root_pass $db_port $db_host_hub $db_hub < $sql_path/hub_update.sql

 

 

-e 执行sql脚本

mysql -f $db_root_name $db_root_pass $db_port $db_host_hub $db_hub -e "${allsql}"

 

 

导出sql执行的结果

mysql $db_root_name $db_root_pass $db_port $db_host_hub $db_hub < "${root_path}/sql_hub_klc.sql" |sed '1d' > "${root_path}/sql_hub_klc.txt"

 

 

执行存储过程:

klc_host="$1:3301"

/usr/bin/mysql -h $corp_db_host $db_root_name $db_root_pass -P $corp_db_port $corp_name -e "CALL p_change_number_winning_times ('replication','123456','ssc_hub',\"${klc_host}\");"

 

 

 

======================= 导入

mysql dbname--default-character-set=utf8  -u root < /tmp/test.sql  -p

 

 

source 导入

mysql\bin\mysql -u root -p --default-character=utf8
   mysql> source c:\redmoonoa.sql

 

 

 

==========================

 

 

 

mysql> show master logs;   顯示二進制日志數目

mysql>show variables like 'log_bin'; 确认你日志是否启用

mysql> show master status; 怎样知道当前的二进制日志

查看从某一段时间到某一段时间的二进制日志
mysqlbinlog --start-datetime='2008-01-19 00:00:00' --stop-datetime='2008-01-30 00:00:00'  /var/lib/mysql/mysql-bin.000006 > mysqllog1.log

shell>mysqlbinlog mail-bin.000001   看二进制日志文件用mysqlbinlog
或者shell>mysqlbinlog mail-bin.000001 | tail

flush privileges;  刷新数据库

mysql> SHOW STATUS;  运行下列命令可以获取状态变量的值:

mysql> SHOW STATUS LIKE ‘[匹配模式]’; ( 可以使用%、?等 )  如果只要检查某几个状态变量,可以使用下列命令:

select version(); 查看mysql版本

 

 

 

创建一个具有root权限的用户(admin)和密码
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'192.168.12.202' IDENTIFIED BY 'adminpassword';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'192.168.12.201' IDENTIFIED BY 'adminpassword';

在主库上创建同步的用户
GRANT REPLICATION SLAVE ON *.* TO repluser@192.168.12.202 IDENTIFIED BY repluserpassword';

修改密码
SET PASSWORD FOR admin@"%" = PASSWORD('adminpassword’);
mysqladmin -u root -p password adminpassword




CHECK TABLES scheme_log;
Repair table scheme_log;
Optimize table gll_pro_ru;
Checksum table gll_pro_ru;

 

 

 

mysql -h 192.168.1.77 -u root -p -P 3301 -S /data/mysql/mysql_3301/mysql_3301.sock

 

 

取db服务器时间

"select DATE_FORMAT(NOW(),'%H:%i:%s')  as dbDateTime"

 

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

 

1、将时间转换为时间戳
select unix_timestamp('2009-10-26 10-06-07')
如果参数为空,则处理为当前时间
2、将时间戳转换为时间
select from_unixtime(1256540102)

 

 

----------------------------------报错  Incorrect datetime value: '' for column
DECLARE last_timestamp TIMESTAMP DEFAULT '';   改为
DECLARE last_timestamp TIMESTAMP DEFAULT NULL;

 

 

---------初始安装mysql设置用户

1 删除user 为空
delete from user where user="";

2 修改localhost root 密码
SET PASSWORD FOR root@"localhost" = PASSWORD('password');

3 删除password为空
delete from user where Password="";

 

--------

 

mysqladmin -u root -p password admin@asdf

update user set host = '%' where user = 'admin';

SET PASSWORD FOR root@"localhost" = PASSWORD('admin@asdf');

GRANT REPLICATION SLAVE ON *.* TO repluser@192.168.12.202 IDENTIFIED BY 'admin@asdf';

 

set names gbk;

select 12 %12;

show tables like '%user%';

 

show create table ***;

 

describe **;

 

show index from **;

 

 

show database;
show tables;

show procedure status

 


删库和删表:
drop database 库名;
drop table 表名;

将表中记录清空:
delete from 表名;

CREATE DATABASE 库名;


如果你决定不想执行正在输入过程中的一个命令,输入\c取消它
mysql> SELECT
    -> USER()
    -> \c
mysql>

 

------------------------------- 定界符 delimiter //

 

delimiter //
。。。。
//

 

 

 

更改MYSQL 任意远程主机登录权限2010-01-29 14:35mysql -h localhost -u root
//这样应该可以进入MySQL服务器

2、mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION
//赋予任何主机访问数据的权限

3、mysql>FLUSH PRIVILEGES
//修改生效

4、mysql>EXIT
//退出MySQL服务器

 

 

-----------------------------flush privileges;  刷新数据库

 

 

 

 

-----------------------Mysql的DATE_FORMAT()进行日期格式转换

文章摘要:碰到一个MYSQL的问题,表logstatb中moment字段的内容是"年-月-日时:分:秒",需要查询匹配“年月日”或“时:分:秒”即可的数据条目,这个时候就可以通过下面的SQL语句实现: select * from logstatb where date_format(moment,'%Y%m%d')

碰到一个MYSQL的问题,表logstatb中moment字段的内容是"年-月-日 时:分:秒",需要查询匹配“年月日”或“时:分:秒”即可的数据条目,这个时候就可以通过下面的SQL语句实现:

select * from logstatb where date_format(moment,'%Y%m%d')= '20080227'(匹配“年月日”)
select * from logstatb where date_format(moment,'%H:%i:%s')= '16:40:01'(匹配“时:分:秒”)

DATE_FORMAT (date, format)能根据格式串format 格式化日期或日期和时间值date,返回结果串。可用DATE_FORMAT( ) 来格式化DATE 或DATETIME 值,以便得到所希望的格式。根据format字符串格式化date值:

%S, %s 两位数字形式的秒( 00,01, . . ., 59)
%i 两位数字形式的分( 00,01, . . ., 59)
%H 两位数字形式的小时,24 小时(00,01, . . ., 23)
%h, %I 两位数字形式的小时,12 小时(01,02, . . ., 12)
%k 数字形式的小时,24 小时(0,1, . . ., 23)
%l 数字形式的小时,12 小时(1, 2, . . ., 12)
%T 24 小时的时间形式(h h : m m : s s)
%r 12 小时的时间形式(hh:mm:ss AM 或hh:mm:ss PM)
%p AM 或P M
%W 一周中每一天的名称( S u n d a y, Monday, . . ., Saturday)
%a 一周中每一天名称的缩写( Sun, Mon, . . ., Sat)
%d 两位数字表示月中的天数( 00, 01, . . ., 31)
%e 数字形式表示月中的天数( 1, 2, . . ., 31)
%D 英文后缀表示月中的天数( 1st, 2nd, 3rd, . . .)
%w 以数字形式表示周中的天数( 0 = S u n d a y, 1=Monday, . . ., 6=Saturday)
%j 以三位数字表示年中的天数( 001, 002, . . ., 366)
% U 周(0, 1, 52),其中Sunday 为周中的第一天
%u 周(0, 1, 52),其中Monday 为周中的第一天
%M 月名(J a n u a r y, February, . . ., December)
%b 缩写的月名( J a n u a r y, February, . . ., December)
%m 两位数字表示的月份( 01, 02, . . ., 12)
%c 数字表示的月份( 1, 2, . . ., 12)
%Y 四位数字表示的年份
%y 两位数字表示的年份
%% 直接值“%”

 

 

------------------------字母检索

 

select * from test1 where LEFT(content,1) = 'h';

 

---------------------查看MYSQL表占用空间状态

 

 

 

查整个库的状态:

select concat(truncate(sum(data_length)/1024/1024,2),'MB') as data_size,concat(truncate(sum(max_data_length)/1024/1024,2),'MB') as max_data_size,concat(truncate(sum(data_free)/1024/1024,2),'MB') as data_free,concat(truncate(sum(index_length)/1024/1024,2),'MB') as index_size from information_schema.tables where TABLE_SCHEMA ='shop';

 

 

查单表:

 

select concat(truncate(sum(data_length)/1024/1024,2),'MB') as data_size,concat(truncate(sum(max_data_length)/1024/1024,2),'MB') as max_data_size,concat(truncate(sum(data_free)/1024/1024,2),'MB') as data_free,concat(truncate(sum(index_length)/1024/1024,2),'MB') as index_size from information_schema.tables where TABLE_NAME = 'ecs_goods';

 

 

---------------------Windows操作系统中命令行("DOS"窗口)下。
 在你的DOS窗中的左上角标题栏片左键,属性,
 在字体中,选择“宋体”,确认
 mysql中 set names 'gbk';

---------------------存储过程参数乱码
create procedure t ( aa char(10) charset 'gbk')

 

 

---------------------远程连接显示中文乱码

 

mysql -h192.168.99.80 -uroot -p12345678 --default-character-set=gbk

 

 

 

 

-----------------------------------表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。

select case when A>B then A else B end,case when B>C then B else C end  From test

 

 

 

 

-----------------------------------请简述项目中优化sql语句执行效率的方法,从哪些方面,sql语句性能如何分析?
答:(1)选择最有效率的表名顺序
(2)WHERE子句中的连接顺序
(3)SELECT子句中避免使用‘*’
(4)用Where子句替换HAVING子句
(5)通过内部函数提高SQL效率
(6)避免在索引列上使用计算。
(7)提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉。

 

 

-----------------------------------常用命令

 

SELECT VERSION(), CURRENT_DATE;  版本号和当前日期

 

 

 

 

获取 数据 和 表信息:
mysql > connect;
mysql> show databases;
mysql> show tables;
mysql> show tables from db_name;
mysql> show columns from tbl_name;
mysql> show index from tbl_name;
mysql> show table status;
mysql> show table status from db_name;
mysql> show create database db_name;
mysql> show create table tbl_name;

shell > bin/mysqlshow -uroot -pmeiyoumima
shell> bin/mysqlshow db_name -uroot -pmeiyoumima
shell> bin/mysqlshow db_name tbl_name -uroot -pmeiyoumima
shell> bin/mysqlshow --keys db_name tbl_name -uroot -pmeiyoumima
shell> bin/mysqlshow --status db_name
shell> bin/mysqldump --no-data db_name tbl_name -uroot -pmeiyoumima

 

 

 

 

----------------------------------------------Linux下面忘记root密码解决方法

1.停止mysql
killall -TERM mysqld

2.跳过认证进入数据库

#/usr/local/mysql/bin/mysqld_safe --skip-grant-tables &
mysqld_safe --skip-grant-table --user=mysql &
mysql

3.修改密码
update mysql.user set password=password('newpass') where user='root';
flush privileges

4.重启mysql就OK了.

 

 

----------------------------------------------删除表后,让新增ID自动承接存在的最大ID

删除自动ID(auto_increment)表下的内容,会出现ID空档.
例如删除ID=6 ID=7
1 2 3 4 5  8....
这样ID就从8开始记录.
这样需要1个方法让他从6来继续
执行sql语句.
ALTER TABLE `表` AUTO_INCREMENT = 6

 

 

 

---------------------更新成为当前系统时间,mysql日期格式化

UPDATE User SET Date=DATE_FORMAT(NOW(),'%Y-%m-%d') WHERE Name='张三'

 

 

 

DATETIME类型用在你需要同时包含日期和时间信息的值时。
DATE类型用在你仅需要日期值时,没有时间部分。

describe 表 显示表结构

flush privileges;  刷新数据库

show database;
show tables;


-----------------
增加字段 并指定在哪个字段后面,字段类型,编码,长度,是否允许为空,默认值,注记
varchar 类型:
ALTER TABLE zf_blog ADD nnn VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT me COMMENT remarks after age

int 类型:
ALTER TABLE zf_blog ADD iidd INT(11) UNSIGNED NOT NULL COMMENT iidd
ALTER TABLE zf_blog ADD iidd INT(11) UNSIGNED NULL DEFAULT '0'

text类型:
ALTER TABLE zf_blog ADD text TEXT CHARACTER SET utf8 COLLATE utf8-general_ci NULL;


ID自增,主建
ALTER TABLE zf_blog ADD id INT(11) UNSIGNED NOT AUTO_INCREMENT PRIMARY KEY;

time类型
ALTER TABLE zf_blog ADD ctime DATETIME NULL DEFAULT '0000-00-00 00:00:00'
ALTER TABLE zf_blog ADD ctime DATE NOT NULL DEFAULT '0000-00-00'

decimal类型
ALTER TABLE zf_blog ADD decimal DECIMAL(10,2) UNSIGNED NULL DEFAULT '0.00'

------------------------
删除字段
ALTER TABLE zf_blog DROP ctime;
ALTER TABLE zf_blog DROP ctime,DROP nnn;

删除记录:
DELETE FROM zf_blog WHERE id = 1;

 

 

 

 

 

-----------------------------mysql自带的分析命令desc

desc输出:
mysql> desc select * from imgs where imgid=1651768337;
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
| 1 | SIMPLE | imgs | const | PRIMARY | PRIMARY | 8 | const | 1 | |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
1 row in set (0.00 sec)

注意key、rows和Extra这三项,这条语句返回的结果说明了该sql会使用PRIMARY主键索引来查询,结果集数量为1条,Extra没有显示,证明没有用到排序或其他操作。
由此结果可以推断,mysql会从索引中查询imgid=1651768337这条记录,然后再到真实表中取出所有字段,是很简单的操作。
key是指明当前sql会使用的索引,mysql执行一条简单语句时只能使用到一条索引,注意这个限制;rows是返回的结果集大小,
结果集就是使用该索引进行一次搜索的所有匹配结果;Extra一般会显示查询和排序的方式,。

 

 

 

-----------------mysql优化Analyze Table
查看索引列的分布情况,查看索引的散列程度

mysql> show index from gll_pro_ru ;
+------------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table      | Non_unique | Key_name       | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+------------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| gll_pro_ru |          0 | PRIMARY        |            1 | id          | A         |      359555 |     NULL | NULL   |      | BTREE      |         |
| gll_pro_ru |          1 | class_ctime_no |            1 | sn_class    | A         |        6658 |     NULL | NULL   |      | BTREE      |         |
| gll_pro_ru |          1 | class_ctime_no |            2 | sn_no       | A         |      179777 |     NULL | NULL   |      | BTREE      |         |
| gll_pro_ru |          1 | class_ctime_no |            3 | ctime       | A         |      359555 |     NULL | NULL   |      | BTREE      |         |
+------------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
4 rows in set (0.00 sec)


SHOW INDEX会返回以下字段:

  · Table表的名称。
  · Non_unique如果索引不能包括重复词,则为0。如果可以,则为1。
  · Key_name索引的名称。
  · Seq_in_index索引中的列序列号,从1开始。
  · Column_name列名称。
  · Collation列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)。
  · Cardinality索引中唯一值的数目的估计值。通过运行ANALYZE TABLE或myisamchk -a可以更新。基数根据被存储为整数的统计数据来计数,所以即使对于小型表,
该值也没有必要是精确的。基数越大,当进行联合时,MySQL使用该索引的机会就越大。

       · Sub_part如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL。
  · Packed指示关键字如何被压缩。如果没有被压缩,则为NULL。
  · Null如果列含有NULL,则含有YES。如果没有,则该列含有NO。
  · Index_type用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。
  · Comment多种评注。

  您可以使用db_name.tbl_name作为tbl_name FROM db_name语法的另一种形式。这两个语句是等价的:

  mysql> SHOW INDEX FROM mytable FROM mydb;

  mysql> SHOW INDEX FROM mydb.mytable;

  SHOW KEYS是SHOW INDEX的同义词。您也可以使用mysqlshow -k db_name tbl_name命令列举一个表的索引。

  SHOW INNODB STATUS语法

  SHOW INNODB STATUS

  在MySQL 5.1中,这是SHOW ENGINE INNODB STATUS的同义词,但不赞成使用。

---------------------------------------通过Analyze Table语句来修复索引

mysql> analyze table gll_pro_ru;
+-----------------------+---------+----------+----------+
| Table                 | Op      | Msg_type | Msg_text |
+-----------------------+---------+----------+----------+
| sq_gllutf8.gll_pro_ru | analyze | status   | OK       |
+-----------------------+---------+----------+----------+
1 row in set (2.03 sec)


-----------------------------修复以后的结果:
mysql> show index from gll_pro_ru ;
+------------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table      | Non_unique | Key_name       | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+------------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| gll_pro_ru |          0 | PRIMARY        |            1 | id          | A         |      359555 |     NULL | NULL   |      | BTREE      |         |
| gll_pro_ru |          1 | class_ctime_no |            1 | sn_class    | A         |           9 |     NULL | NULL   |      | BTREE      |         |
| gll_pro_ru |          1 | class_ctime_no |            2 | sn_no       | A         |         251 |     NULL | NULL   |      | BTREE      |         |
| gll_pro_ru |          1 | class_ctime_no |            3 | ctime       | A         |         539 |     NULL | NULL   |      | BTREE      |         |
+------------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
4 rows in set (0.00 sec)

 

 

 

===================================================================

 

 

mysql> show index from ios_radio;
+-----------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+--

----+------------+---------+
| Table     | Non_unique | Key_name           | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed |

Null | Index_type | Comment |
+-----------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+--

----+------------+---------+
| ios_radio |          0 | PRIMARY            |            1 | id          | A         |           4 |     NULL | NULL   |   

  | BTREE      |         |
| ios_radio |          1 | Index_Radio_All_Id |            1 | zone_id     | A         |        NULL |     NULL | NULL   |   

  | BTREE      |         |
| ios_radio |          1 | Index_Radio_All_Id |            2 | lang_id     | A         |        NULL |     NULL | NULL   |   

  | BTREE      |         |
+-----------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+--

----+------------+---------+
3 rows in set (0.00 sec)




mysql> analyze table ios_radio;
+---------------+---------+----------+----------+
| Table         | Op      | Msg_type | Msg_text |
+---------------+---------+----------+----------+
| ios.ios_radio | analyze | status   | OK       |
+---------------+---------+----------+----------+
1 row in set (0.07 sec)



mysql> show index from ios_radio;
+-----------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table     | Non_unique | Key_name           | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-----------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| ios_radio |          0 | PRIMARY            |            1 | id          | A         |           4 |     NULL | NULL   |      | BTREE      |         |
| ios_radio |          1 | Index_Radio_All_Id |            1 | zone_id     | A         |           2 |     NULL | NULL   |      | BTREE      |         |
| ios_radio |          1 | Index_Radio_All_Id |            2 | lang_id     | A         |           2 |     NULL | NULL   |      | BTREE      |         |
+-----------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
3 rows in set (0.02 sec)

 

 

 

 

 

 

========== ========== ========== ========== ========== =====

 

 

 

 

 



Checksum table gll_pro_ru;
数据在传输时,可能会发生变化,也有可能因为其它原因损坏,为了保证数据的一致,我们可以计算checksum(校验值)。
使用MyISAM引擎的表会把checksum存储起来,称为live checksum,当数据发生变化时,checksum会相应变化。
在执行Checksum Table时,可以在最后指定选项qiuck或是extended;qiuck表示返回存储的checksum值,而extended会重新计算checksum,如果没有指定选项,则默认使用extended。

Optimize table gll_pro_ru;
经常更新数据的磁盘需要整理碎片,数据库也是这样,Optimize Table语句对MyISAM和InnoDB类型的表都有效。
如果表经常更新,就应当定期运行Optimize Table语句,保证效率。
与Analyze Table一样,Optimize Table也可以使用local来取消写入binlog。

Check table gll_pro_ru;
数据库经常可能遇到错误,譬如数据写入磁盘时发生错误,或是索引没有同步更新,或是数据库未关闭MySQL就停止了。
遇到这些情况,数据就可能发生错误:
Incorrect key file for table: ' '. Try to repair it.
此时,我们可以使用Check Table语句来检查表及其对应的索引。

Repair table gll_pro_ru;
用于修复表,只对MyISAM和ARCHIVE类型的表有效。
这条语句同样可以指定选项:
QUICK:最快的选项,只修复索引树。
EXTENDED:最慢的选项,需要逐行重建索引。
USE_FRM:只有当MYI文件丢失时才使用这个选项,全面重建整个索引。

 

 

 

 

----------------------union

 

 

union可以对同一个表的两次查询联合起来. 这样做的益处也非常明显, 比如在blog应用中, 可以利用一条sql语句实现置顶blog和普通blog的分页显示. 
代码 复制代码
(    
SELECT *    
FROM `blog`    
WHERE top=1    
ORDER BY created DESC    
)    
UNION (    
   
SELECT *    
FROM `blog`    
WHERE top = 0    
ORDER BY created DESC    
) LIMIT 2 , 3   
 
 
 
注:union要求联合的两个表所要查找的数据列要一样多,如果一个表中没有另一个表的字段,可以用NULL代替。

 

 

 

 

 

 

 


++安装mysql
参见自带的INSTALL-SOURCE文件
$ ./configure ?prefix=/app/mysql-5.0.51a ?with-charset=utf8 ?with-extra-charsets=utf8,gb2312,utf8

++启动/关闭mysql
$ path/mysqld_safe -user=mysql &
$ /mysqladmin -p shutdown

++修改root口令
$ mysqladmin -u root -p password ‘新密码’

++查看服务器状态
$ path/mysqladmin version -p

++连接远端mysql服务器
$ path/mysql -u 用户名 -p #连接本机
$ path/mysql -h 远程主机IP -u 用户名 -p#连接远程MYSQL服务器

++创建/删除 数据库或表
$ mysqladmin -u root -p create xxx
mysql> create database 数据库名;
mysql> create TABLE items (
id INT(5) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
symbol CHAR(4) NOT NULL,
username CHAR(8),
INDEX sym (symbol),INDEX …..
UNIQUE(username)
) type=innodb;
mysql> drop database [if exists] 数据库名
mysql> create table 表名;
mysql> drop table 表名;

++查看数据库和查看数据库下的表
mysql> show databases;
mysql> show tables;
mysql> show table status;
mysql> desc 表名; #查看具体表结构信息
mysql> SHOW CREATE DATABASE db_name #显示创建db_name库的语句
mysql> SHOW CREATE TABLE tbl_name #显示创建tbl_name表的语句

++创建用户
mysql> grant select,insert,update,delete,alter on mydb.* to test2@localhost identified by “abc”;
mysql> grant all privileges on *.* to test1@”%” identified by “abc”;
mysql> flush privileges;

++用户管理
mysql> update user set password=password (’11111′) where user=’test1′; #修改test1密码为111111
mysql> DELETE FROM user WHERE User=”testuser” and Host=”localhost”; #删除用户帐号
mysql> SHOW GRANTS FOR user1; #显示创建user1用户的grant语句

++mysql数据库的备份和恢复
$ mysqldump -uuser -ppassword -B DB_name [--tables table1 --tables table2] > exportfile.sql
$ mysql -uroot -p xxx < aaa.sql #导入表
$ mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名 ##导出单独的表

++导出一个数据库结构
$ mysqldump -u wcnc -p -d ?add-drop-table smgp_apps_wcnc >wcnc_db.sql
-d 没有数据 ?add-drop-table 在每个create语句之前增加一个drop table

++忘记mysql密码
先停止所有mysql服务进程
$ mysqld_safe ?skip-grant-tables & mysql
mysql> use mysql;
mysql> update user set password=password(’111111′) where user=’root’;
mysql> flush privileges;
然后重启mysql并以新密码登入即可

++当前使用的数据库
mysql> select database();

===数据库日常操作维护====
++创建表
mysql> create table table_name
(column_name datatype {identity |null|not null},f_time TIMESTAMP(8),…)ENGINE=MyISAM AUTO_INCREMENT=3811 DEFAULT CHARSET=utf8;
例: CREATE TABLE guest (name varchar(10),sex varchar(2),age int(3),career varchar(10));
# desc guest可查看表结构信息
# TIMESTAMP(8) YYYYMMDD 其中(2/4/6/8/10/12/14)对应不同的时间格式
mysql> SHOW CREATE TABLE tbl_name #显示创建tbl_name表的语句

++创建索引
可以在建表的时候加入index indexname (列名)创建索引,
也可以手工用命令生成 create index index_name on table_name (col_name[(length)],… )
mysql> CREATE INDEX number ON guest (number(10));
mysql> SHOW INDEX FROM tbl_name [FROM db_name] #显示现有索引
mysql> repair TABLE date QUICK; #索引列相关变量变化后自动重建索引

++查询及常用函数
mysql> select t1.name, t2.salary from employee AS t1, info AS t2 where t1.name = t2.name;
mysql> select college, region, seed from tournament ORDER BY region, seed;
mysql> select col_name from tbl_name WHERE col_name > 0;
mysql> select DISTINCT …… [DISTINCT关键字可以除去重复的记录]
mysql> select DATE_FORMAT(NOW(),’%m/%d/%Y’) as DATE, DATE_FORMAT(NOW(),’%H:%m:%s’) AS TIME;
mysql> select CURDATE(),CURTIME(),YEAR(NOW()),MONTH(NOW()),DAYOFMONTH(NOW()),HOUR(NOW()),MINUTE(NOW());
mysql> select UNIX_TIMESTAMP(),UNIX_TIMESTAMP(20080808),FROM_UNIXTIME(UNIX_TIMESTAMP()); mysql> select PASSWORD(”secret”),MD5(”secret”); #加密密码用
mysql> select count(*) from tab_name order by id [DESC|ASC]; #DESC倒序/ASC正序

* 函数count,AVG,SUM,MIN,MAX,LENGTH字符长度,LTRIM去除开头的空头,RTRIM去尾部空格,TRIM(str)去除首部尾部空格,LETF/RIGHT(str,x)返回字符串str的左边/右边x个字符,SUBSTRING(str,x,y)返回str中的x位置起至位置y的字符mysql> select BINARY ‘ross’ IN (’Chandler’,’Joey’, ‘Ross’); #BINARY严格检查大小写

* 比较运算符IN,BETWEEN,IS NULL,IS NOT NULL,LIKE,REGEXP/RLIKE
mysql> select count(*),AVG(number_xx),Host,user from mysql.user GROUP by user [DESC|ASC] HAVING user=root; #分组并统计次数/平均值

++UNIX_TIMESTAMP(date)
返回一个Unix时间戳记(从’1970-01-01 00:00:00′GMT开始的秒数)
mysql> select UNIX_TIMESTAMP();
mysql> select UNIX_TIMESTAMP(’1997-10-04 22:23:00′);
mysql> select FROM_UNIXTIME(875996580); #根据时间戳记算出日期

++控制条件函数
mysql> select if(1<10,2,3), IF(55>100,’true’,’false’);
#IF()函数有三个参数,第一个是被判断的表达式,如果表达式为真,返回第二个参数,如果为假,返回第三个参数.
mysql> select CASE WHEN (2+2)=4 THEN “OK” WHEN (2+2)<>4 THEN ‘NOT OK’ END AS status;

++系统信息函数
mysql> select DATABASE(),VERSION(),USER();
mysql> select BENCHMARK(9999999,LOG(RAND()*PI())) AS PERFORMANACE; #一个测试mysql运算性能工具

++将wp_posts表中post_content字段中文字”old”替换为”new”
mysql> update wp_posts set post_content=replace(post_content,’old’,’new’)

++改变表结构
mysql> alter table table_name alter_spec [, alter_spec ...]
例:alter table dbname add column userid int(11) not null primary key auto_increment;
这样,就在表dbname中添加了一个字段userid,类型为int(11)。

++调整列顺序
mysql> alter table tablename CHANGE id id int(11) first;

++修改表中数据
insert [into] table_name [(column(s))] values (expression(s))
例:mysql>insert into mydatabase values(’php’,’mysql’,’asp’,’sqlserver’,’jsp’,’oracle’);
mysql> create table user select host,user from mysql.user where 1=0;
mysql> insert into user(host,user) select host,user from mysql.user;

++更改表名
命令:rename table 原表名 to 新表名;

++表的数据更新
mysql> update table01 set field04=19991022[, field05=062218] where field01=1;

++删除数据
mysql> delete from table01 where field01=3;
#如果想要清空表的所有纪录,建议用truncate table tablename而不是delete from tablename.

++SHELL提示符下运行SQL命令
$ mysql -e “show slave status\G ”

++坏库扫描修复
cd /var/lib/mysql/xxx && myisamchk playlist_block

++insert into a (x) values (’11a’)
出现: ata truncated for column ‘x’ at row 1
解决办法:
在my.ini里找到
sql-mode=”STRICT_TRANS_TABLES,NO_AUTO_Create_USER,NO_ENGINE_SUBSTITUTION”
把其中的STRICT_TRANS_TABLES,去掉,然后重启mysql就ok了

++复制表
mysql> create table target_table like source_table

++innodb支持事务
新表:create TABLE table-name (field-definitions) TYPE=INNODB;
旧表: alter TABLE table-name TYPE=INNODB;
mysql> start transaction #标记一个事务的开始
mysql> insert into….. #数据变更
mysql> ROLLBACK或commit #回滚或提交
mysql> SET AUTOCOMMIT=1; #设置自动提交
mysql> select @@autocommit; #查看当前是否自动提交

++表锁定相关
mysql> LOCK TABLE users READ; # 对user表进行只读锁定
mysql> LOCK TABLES user READ, pfolios WRITE #多表锁控制
mysql> UNLOCK TABLES; #不需要指定锁定表名字, MySQL会自动解除所有表锁定

=====一些mysql优化与管理======
++管理用命令
mysql> show variables #查看所有变量值
? max_connections 数据库允许的最大可连接数,
#需要加大max_connections可以在my.cnf中加入set-variable = max_connections=32000,可以对与下面的threads_connected值决定是否需要增大.

show status [like ....];
? threads_connected 数据库当前的连接线程数
#FLUSH STATUS 可以重置一些计数器

show processlist;
kill id;

++my.cnf配置
?Enable Slow Query Log
long_query_time=1
log-slow-queries=/var/log/mysql/log-slow-queries.log
log-queries-not-using-indexes

# mysqldumpslow -s c -t 20 host-slow.log #访问次数最多的20个sql语句
# mysqldumpslow -s r -t 20 host-slow.log #返回记录集最多的20个sql

?others
max_connections=500 #用过的最大连接数SHOW Status like ‘max_used_connection’;
wait_timeout=10 #终止所有空闲时间超过 10 秒的连接
table_cache=64 #任何时间打开表的总数
ax_binlog_size=512M #循环之前二进制日志的最大规模
max_connect_errors = 100

query_cache_size = 256M #查询缓存
#可用 SHOW STATUS LIKE ‘qcache%’;查看命中率
#FLUSH STATUS重置计数器, FLUSH QUERY CACHE清缓存

thread_cache = 40
#线程使用,SHOW STATUS LIKE ‘Threads_created %’; 值快速增加的话考虑加大

key_buffer = 16M
#show status like ‘%key_read%’; Key_reads 代表命中磁盘的关键字请求个数
#A: 到底 Key Buffer 要设定多少才够呢? Q: MySQL 只会 Cache 索引(*.MYI),因此参考所有 MYI文件的总大小

sort_buffer_size = 4M #查询排序时所能使用的缓冲区大小,每连接独享4M
#show status like ‘%sort%’; 如sort_merge_passes很大,就表示加大

sort_buffer_sizesort_buffer_size = 6M #查询排序时所能使用的缓冲区大小,这是每连接独享值6M
read_buffer_size = 4M #读查询操作所能使用的缓冲区大小
join_buffer_size = 8M #联合查询操作所能使用的缓冲区大小
skip-locking #取消文件系统的外部锁
skip-name-resolve
thread_concurrency = 8  #最大并发线程数,cpu数量*2
long_query_time = 10 #Slow_queries记数器的查询时间阀值