一、连接数据库
不借助数据库管理软件(如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;
如果该文章有帮助到您,就留言点个赞吧!您的支持与肯定是我持续更新最大的动力。
来源:CSDN
作者:JAVA_日月
链接:https://blog.csdn.net/weixin_40623736/article/details/104671871