mysql非常用命令笔记

拈花ヽ惹草 提交于 2020-03-05 20:24:11

一、连接数据库

不借助数据库管理软件(如Navicat等软件),通过dos连接mysql服务器,然后操作数据库.

连接数据库通用格式:mysql -P 端口号 -h mysql主机名或ip地址 -u 用户名 -p
解释: (-P大写P代表端口,小写p代表密码,h代表主机名或ip,u代表user用户)”

 mysql -P 3306 -h 192.168.1.101 -u root -p

1.本地连接
如果是命令行是mysql所在的本机,而且用默认的端口 3306 时,可以简化语句为:

mysql -u root -p

2.远程连接
注意: 使用远程连接时,使用的连接用户和该用户现在的ip地址应该是远程数据库中允许的用户和允许的ip,否则是不允许连接的.

mysql -P 3306 -h 192.168.1.101 -u root -p

二、操作数据库

在使用用户名和密码成功登录mysql数据库后,在该用户的权限范围内可以操作该用户对数据库的操作.
db_test是我自己创建的数据名.在操作数据时每条语句是用;或\g来标志结束的

1.查看所有数据库

show databases;

2.创建数据库

create database db_test;

3.使用数据库

use db_test;

4.显示数据库中所有表

show tables;

5.查看表结构

show columns from customers; 

或者使用快捷方式:

DESCRIBE customers;

三、关于命令行模式数据库文件的导入和导出

命令行模式下,导入导出sql文件,进入CMD既可.

导出数据库文件
包括导出数据库到指定表.
1.导出数据库db_test的结构和数据

mysqldump -h localhost -u root -p db_test > D:\db_test.sql

2.导出数据库db_test的结构(加-d参数):

mysqldump -h localhost -u root -p db_test -d > D:\db_test_str.sql

3.导出数据库db_test中的customers表的结构和数据:

mysqldump -h localhost -u root -p db_test customers > D:\customers.sql

4.导出数据库db_test中的customers表的结构(加-d参数):

mysqldump -h localhost -u root -p db_test -d > D:\customers_str.sql

5.导入数据库文件
向数据库db_test导入数据库文件db_test.sql.

mysql -h localhost -u root -p db_test < D:\db_test.sql

四、其他常用语句

1、用于显示广泛的服务器状态信息

SHOW STATUS

2、分别用来显示创 建特定数据库或表的MySQL语句

SHOW CREATE DATABASE
SHOW CREATE TABLE

3、用来显示授予用户(所有用户或特定用户)的安 全权限

SHOW GRANTS

4、用来显示服务器错误或警告消息

SHOW ERRORS
SHOW WARNINGS

5、新增字段

ALTER TABLE s_activity_plan ADD sendMail INT ( 11 ) NOT NULL COMMENT '注释';

6、手机号正则校验

SELECT * FROM shgl_user_account WHERE mobile not REGEXP "^[1][3456789][0-9]{9}$";

7、检查手机号重复数据

SELECT
	a.*
FROM
	(
		SELECT
			seller_mobile,
			count(seller_mobile) num
		FROM
			seller
		GROUP BY
			seller_mobile
	) a
WHERE
	a.num > 1

8、修改字段的注释

alter table 表名 modify column 字段名  字段类型  comment '修改后的字段注释';

9、添加联合唯一索引

ALTER TABLE `表名` ADD UNIQUE INDEX `索引名` ( `字段1`, `字段2` );

10、删除索引

drop index 索引名 on 表名;

11、按指定字段的最后一个数字查询
例如查询id最后一位为1的数据:

SELECT * FROM 表名 WHERE RIGHT(id,1)=1

查询id最后一位为0的数据:

SELECT * FROM 表名 WHERE RIGHT(id,1)=0

原理是利用数字与字符串的自动转换,获得id的末尾数值。

12、字符串拼接函数

CONCAT('str')

13、给已存在的表添加主键

ALTER TABLE 表名 ADD id INT(10) NOT NULL PRIMARY KEY AUTO_INCREMENT FIRST;

14、执行sql脚本
可以有2种方法:
第一种方法:
在命令行下(未连接数据库),输入

 mysql -h localhost -u root -p123456 < F:\test.sql 

(注意路径不用加引号) 回车即可.
第二种方法:
在命令行下(已连接数据库,此时的提示符为 mysql> ),输入

 source F:\test.sql 

(注意路径不用加引号的) 或者

 \. F:\test.sql 

(注意路径不用加引号的) 回车即可

15、修改表名

alter table test rename test1;

16、查询数据库运行线程

show processlist

17、保留两位小数

round(,保留小数的个数)  例如 round(4.555,1)  结果:4.6
TRUNCATE(x,d)

函数返回被舍去至小数点后d位的数字x。若d的值为0,则结果不带有小数点或不带有小数部分。
若d设为负数,则截去(归零)x小数点左起第d位开始后面所有低位的值。

SELECT TRUNCATE(100.3465,2),TRUNCATE(100,2),TRUNCATE(0.6,2),TRUNCATE(114.6,-1);

结果分别:100.34,100,0.6,110

18、mysql null转换

1、如果为空返回0

select ifnull(null,0)

2、如果为空返回0,否则返回1

select if(isnull(col),0,1) as col.

19、匿名表

dual

20、时间转字符串

date_format(create_time, '%Y-%m-%d %H:%I:%S')

21、时间转时间戳

select unix_timestamp(now());

22、字符串转时间

select str_to_date('2016-01-02', '%Y-%m-%d %H');

23、字符串转时间戳

select unix_timestamp('2016-01-02');

24、时间戳转时间

select from_unixtime(1451997924);

25、时间戳转字符串

select from_unixtime(1451997924,'%Y-%d');

附表
MySQL日期格式化(format)取值范围。

值	含义
秒	%S、%s	两位数字形式的秒( 00,01, ..., 59)
分	%I、%i	两位数字形式的分( 00,01, ..., 59)
小时 	%H	24小时制,两位数形式小时(00,01, ...,23)
%h	12小时制,两位数形式小时(00,01, ...,12)
%k	24小时制,数形式小时(0,1, ...,23)
%l	12小时制,数形式小时(0,1, ...,12)
%T	24小时制,时间形式(HH:mm:ss)
%r	 12小时制,时间形式(hh:mm:ss AM 或 PM)
%p 	AM上午或PM下午
周 	 %W	一周中每一天的名称(Sunday,Monday, ...,Saturday)
%a	一周中每一天名称的缩写(Sun,Mon, ...,Sat)
%w 	以数字形式标识周(0=Sunday,1=Monday, ...,6=Saturday)
%U	数字表示周数,星期天为周中第一天
%u	数字表示周数,星期一为周中第一天
天	%d 	两位数字表示月中天数(01,02, ...,31)
%e 	 数字表示月中天数(1,2, ...,31)
%D	英文后缀表示月中天数(1st,2nd,3rd ...%j	以三位数字表示年中天数(001,002, ...,366)
月	%M 	英文月名(January,February, ...,December)
%b 	英文缩写月名(Jan,Feb, ...,Dec)
%m 	两位数字表示月份(01,02, ...,12)
%c 	数字表示月份(1,2, ...,12)
年	%Y 	四位数字表示的年份(2015,2016...%y 	 两位数字表示的年份(15,16...)
文字输出 	%文字 	直接输出文字内容

26、 查询上个月第一天时间

SELECT
	date_sub(
		date_sub(
			date_format(now(), '%y-%m-%d 00:00:00'),
			INTERVAL extract(DAY FROM now()) - 1 DAY
		),
		INTERVAL 1 MONTH
	)

27、查询上个月最后一天时间

SELECT
	date_sub(
		date_sub(
			date_format(now(), '%y-%m-%d 23:59:59'),
			INTERVAL extract(DAY FROM now()) DAY
		),
		INTERVAL 0 MONTH
	) AS date

28、获取上个月

SELECT
date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),'%Y %m')

29、查看本月数据

SELECT
*
FROM
content_publish
WHERE
date_format(publish_time, '%Y %m') = date_format(DATE_SUB(curdate(), INTERVAL 0 MONTH),'%Y %m')

30、查询上上个月数据

SELECT
*
FROM
content_publish
WHERE
date_format(publish_time, '%Y %m') = date_format(DATE_SUB(curdate(), INTERVAL 2 MONTH),'%Y %m')

31、当前日期

select DATE_SUB(curdate(),INTERVAL 0 DAY) ;

32、明天日期

select DATE_SUB(curdate(),INTERVAL -1 DAY) ;

33、昨天日期

select DATE_SUB(curdate(),INTERVAL 1 DAY) ;

34、前一个小时时间

select date_sub(now(), interval 1 hour);

35、后一个小时时间

select date_sub(now(), interval -1 hour);

36、前30分钟时间

select date_add(now(),interval -30 minute)

37、后30分钟时间

select date_add(now(),interval 30 minute)

38、sql错误

【错误一】

Expression #4 of SELECT list is not in GROUP BY clause and contains nonaggregated
column 'partner.r.identity_no' which is not functionally dependent on columns in GROUP BY clause;
this is incompatible with sql_mode=only_full_group_by

解决办法:
编辑mysql配置文件 my.ini
linux 为 /etc/my.cnf
分别在[mysqld]和[mysql]下面添加这段

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

然后重启 mysql服务
linux的重启命令 service mysqld restart

【错误二】
mysql 1040 连接数太多 mysql Error 1040 too many connection解决办法
1、重启mysql服务

service mysqld restart

2、登陆mysql

mysql -p

3、查看当前的最大连接数

show variables like 'max_connections';

4、修改最大连接数

set global max_connections = 3600;

#查看连接进程

show full processlist

show processlist; 可以显示前100条连接信息

39、分组统计并列排行

  select
    a.*,
    case
      when @last_achievement = a.achievement
        then @rank
      when @last_achievement := a.achievement
        then @rank := @rank + 1
      end as ranking
  from
(select
      i.user_id as userId,
      i.order_no as orderNo,
      u.user_name as userName,
      u.head_img as headImg,
      u.nickname as nickname,
      u.name as name,
      sum(f.total_order_goods_amount) as achievement
    from incomes_expenses_record i
    left join app_user u on i.user_id = u.user_id
    left join profit_record f on f.incomes_expenses_record_id = i.incomes_expenses_record_id
      where i.flag_del = 0
        and i.incomes_expenses_type = 3
        and i.operation_type = 1
        and date_format(i.create_time, '%Y-%m') = date_format(now(), '%Y-%m')
        and i.user_id in
    <foreach collection="teamUserIds" separator="," open="(" close=")" item="userId">
        #{userId}
    </foreach>
    group by i.order_no,i.user_id
    order by achievement desc) a,(SELECT @rank := 0,@last_achievement := NULL) r

40、mysql 左连接注意事项

A表 left join B表查询
如果要以A表的数据为基准,where条件后面切记不能带上B表的条件

41、 复制表

select into from 和 insert into select
都是用来复制表
两者的主要区别为: select into from 要求目标表不存在,因为在插入时会自动创建;insert into select from 要求目标表存在。
1、复制表结构及其数据:

create table table_name_new as select * from table_name_old

2、只复制表结构:

create table table_name_new as select * from table_name_old where 1=2;

或者:

create table table_name_new like table_name_old

3、只复制表数据:
如果两个表结构一样:

insert into table_name_new select * from table_name_old

如果两个表结构不一样:

insert into table_name_new(column1,column2...) select column1,column2... from table_name_old

42、mysql update select 从查询结果中更新数据

示例1

UPDATE user_online_month_atu a
INNER JOIN (
SELECT
user_id,
sum(c.online_times) as online_times,
SUM(c.login_count) as login_count,
Sum(c.view_page_count) as view_page_count,
LEFT(c.log_date,length(c.log_date) - 2) as date
FROM
user_online_time_atu c
GROUP BY
c.user_id ,date
) b ON a.user_id = b.user_id AND a.`month`=b.date
SET a.online_time = b.online_times ,a.login_count=b.login_count,a.view_page_count=b.view_page_count

示例2

UPDATE app_user_info a INNER JOIN (
	SELECT
		u.user_name,
		u.invite_code,
		u.invite_user_code
	from user_code u
) b on a.user_name = b.user_name
set a.invite_code = b.invite_code,a.invite_user_code = b.invite_user_code

43、mysql生成随机字符串

select substring(MD5(RAND()),1,20)

44、生成 3 位的随机数

SELECT CEILING(RAND()*900+100);

45、生成 4 位的随机数

SELECT CEILING(RAND()*9000+1000);

46、获取当前时间戳

select unix_timestamp(now());

47、获取当前时间戳 毫秒数

select REPLACE(unix_timestamp(current_timestamp(3)),'.','');

48、查询mysql缓存配置

show global variables like '%query_cache%';

49、查询表引擎:

show variables like '%storage_engine%';

50、mysql缓存
临时会话修改,关闭缓存

mysql> set query_cache_type=0;

临时全局修改,关闭缓存

mysql> set global query_cache_size=0;
mysql> set global query_cache_type=0;

启用全局缓存

set global query_cache_size=20971520;
set global query_cache_type=1;

永久修改

vi my.cnf
query_cache_type=0
query_cache_size=0

还有一种方式是添加类似oracle的hint

select sql_no_cache count(*) from mysql.user;

如果该文章有帮助到您,就留言点个赞吧!您的支持与肯定是我持续更新最大的动力。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!