mysql常用命令

select命令

help select;                                        查看select用法
select distinct 列名 from tablename;                检索列中不同的值,可以踢出重复值
select * from table_name where name like "hello%";  查询name字段以hello开头的数据,hello*也行
select * from table_name where name like "%hello";  查询name字段以hello结尾的数据
select * from table_name where name like "%hello%"; 查询name字段以包含hello的数据
select prod_id from products limit 3;               查询前3行数据
select prod_id from products limit 3,3;             从第3行开始获取3条数据(不包括第3行)
select prod_id from products order by prod_id;      对列名进行排序,排序多个就用逗号分隔
select prod_id from products order by prod_id desc; 降序,在升序语句后加desc关键字即可
select id,age from abc orderby id desc,age;         对id进行降序,然后对id对应的age进行升序
select price from abc order by price desc limit 1;  获取最大值(先降序,然后获取第一条数据)
select name from abc where id = 10;                 获取id=10对应的name的值
select id,name from abc where id > 10 order by id;  获取id大于10的name值并对id进行排序,order by 要放在where 后面
select id,name from abc where id <> 100;            获取id不等于100的值,<>与!=等价
select id,name from abc where id between 10 and 20; 获取id范围在10-20之间的值
select id,name from abc where name is null;         空值检查
select id,name from abc where id > 10 and id <100;  检索同时满足两个条件的数据,优先级高于or
select id,name from abc where id > 10 or id < 5 ;   检索满足其中一个条件的数据,优先级低于and
select id,name from abc where id in (10,5);         in关键字与上面的or用法相同,都表示或
select id,name from abc where id not in (10,5);     获取id不匹配10和5的数据
select id,name from abc where name like "gong%";    获取所有以gong开头的name的值,可匹配多个
select id,name from abc where name like "%gong%";   获取包含gong的name的值,匹配多个
select id,name from abc where name like "g%n";      获取以g开头以n结尾的name的值,匹配多个
select id,name from abc where name like "_ong";     匹配ong前面的任意一个字符的name值
select id,name from abc where name regexp "gong";   正则匹配包含gong的name的值,不区分大小写
select name from abc where name regexp binary "gong";正则匹配,并区分大小写(加了binary关键字) 
select name from abc where name regexp "gong | guan";匹配gong或者guan的行
select name from abc where name regexp "[123]gong"; 匹配单一字符1、2、3开头后面为gong的内容
select name from abc where name regexp "[1-3]gong"; 与上一条命令相同,简化写法[1-3]
select name from abc where name regexp "\\.";       匹配包含.的内容,通过\\转义才能获取到  
select name from abc where name regexp "\\([0-9] sticks?\\)"; 匹配(n stick)和 (n sticks),n为0-9
select id from abc where id regexp "[[:digit:]]{3}"; 匹配任意3个数字
select id from abc where id regexp "[0-9][0-9][0-9]";与上条命令效果相同
select id from abc where id regexp "^[0-9]\\.";      匹配以数字或者.开头的行
select name from abc where name regexp "gong$";      匹配以gong结尾的name的值
select Concat(name,'(',address,')') from abc;        通过Concat()拼接,返回name(address)值
select Concat(name,'(',address,')') as new_namefrom abc; 拼接后的新列名为new_name,as指定别名
select RTrim(name) from abc;                         去掉字段右边的空格
select LTrim(name) from abc;                         去掉字段左边的空格
select Trim(name)  from abc;                         去掉字段两边的空格
select Upper(name) AS name_upper from abc;           将获取的结果全部转换为大写
select Lower(name) AS name_lower from abc;           将获取的结果全部转换为小写
select Length(name)AS length_name from abc;          获取字段的长度
select CurTime();                                    返回当前时间
select CurDate();                                    返回当前日期
select Data(order_date) from orders;                 返回日期时间字段中的日期部分
select Day(order_date)  from orders;                 返回日期时间字段中的天数部分
select Hour(order_date) from orders;                 返回日期时间字段中的小时部分
select Minute(order_date) from orders;               返回日期时间字段中的分钟部分
select Month(order_date) from orders;                返回日期时间字段中的月份部分
select Second(order_date) from orders;               返回日期时间字段中的秒部分
select Time(order_date) from orders;                 返回日期时间字段中的时间部分
select Year(order_date) from orders;                 返回日期时间字段中的年份部分
select Now();                                        获取当前日期和时间
select avg(age) as age_avg from abc;                 获取年龄的平均值
select count(age)as age_count from abc;              获取年龄列的行数
select min(age)  as age_min   from abc;              获取年龄的最小值
select max(age)  as age_max   from abc;              获取年龄的最大值
select sum(age)  as age_sum   from abc;              获取年龄的和
select database();                                   查看当前所在数据库
select id,count(*)as id_count from abc group by id;  对id进行分组后计算每个组的总数
select id,count(*)as id_count from abc group by id having count(*) > 10; 过滤分组
#group by 要放在where之后,order by 之前,否则报错
#having与where区别是:where在分组前过滤行,having在分组后进行过滤
select cust_name from customers where cust_id in (select cust_id from orders where order_num in (select order_num from orderitems where prod_id = "TNT2"));子查询,首先根据产品prod_id来检索出订单信息order_num,然后根据订单信息order_num来检索出客户id为cust_id,最后根据cust_id来获取客户信息cust_name
select vend_name,prod_name from products,vendors where vendors.vend_id = products.vend_id; 等值联结查询,vend_name和prod_name分别位于products和vendors表中,vend_id是vendors表的主键并且是products表的外键,因此可使用联结查询同时获取两个表的字段
select vend_name,vend_address,prod_name from products inner join vendors on vendors.vend_id = products.vend_id; 与上条语句作用相同,where替换为on,使用inner join,这是推荐的用法
#注:联结多个表可以使用AND(在where或者on后面的多个条件之间),联结会导致性能下降,注意使用
select tb1.column tc1,table2.column tc2 from table1 tb1 inner join table2 tb2 on tb1.column = tb2.column; 通过inner join实现多表查询,tb1和tb2是表table1和table2的别名,tc1和tc2是查询后指定的列别名
select c.* from customers AS c;                    获取表customers的所有列,c是表别名
select id,price from where id > 5 union select id,price from where price >10; 组合查询
select current_user();                             查询当前连接MySQL的用户
select decode((select password from test WHERE id = 1),’123456789′); 解密,通过加密字符串,查询后就是加密之前的密码
SHOW VARIABLES LIKE 'server_uuid'; 查看server_uuid
show slave hosts;                  查看mysql从库信息
show slave status;                 查看从库状态
SHOW TABLE STATUS LIKE 'table_name'; 获取表信息,用Data_length/1024/1024即可得到表大小
SHOW INDEX FROM your_table_name; 查询表中索引

intert into 命令

insert into user values (null,'gong','广东',null); 插入数据,没内容使用Null充当(不安全插入) 
insert into user (username,address,email)values('gong','广东','abc@qq.com') 插入数据(安全插入)
insert into user (username) value('gong'),('guan');   插入多行数据
insert into user (username) select username from user where id = 10;通过insert和select配合插入数据
insert into test (username,password)values("admin",select encode('test123456','123456789')); 向表test中添加用户名和密码,密码通过encode的形式加密,test123456为设置的密码,123456789为加密解密字符串(注意:password的字段类型需要为blob,存储二进制类型),通过update更新也可以

update与delete命令

update user set username="guan" where id = 100;                 更新单列的值
update user set username="guan",address="深圳" where id = 100;  更新多列的值
update user set username= null where id = 100;                  删除某个列,设为null
update user set password = password("passwd") where user = "root"; 修改用户密码
delete from user where id = 100;                               删除id为100的整行用户
delete from user;                                              删除整个表的数据,结构不变
drop  table user;                                              删除整个表

create命令

#创建表,主键必须not null,id列设置为自增,age默认值为10,没有默认可不用写
create table if not exists user (
    id int not null auto_increment,
    username varchar(10) not null,
    age int              not null default 10,
    address  varchar(100)    null,
    email    varchar(100)    null,
    primary key(id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
#注:主键可以有多个列组成,如果是单个列,那么此列唯一,如果多个列,组合值必须唯一
#本例子中引擎为innodb,还可以使用其余引擎,但要注意一个引擎的表不能引用具有使用不同引擎的表的外键
create user username identified by "passwd";     创建用户username,设置密码为passwd
create table 表a like 表b;                      根据表b的结构创建表a,不包含数据
create table newTable as select * from oldTable; 根据旧表创建新表,包括数据

alter命令

alter table user add age int;                            给表user添加列age,指定数据类型
alter table user add age int default 10;                 给表user添加列age,默认值为10
alter table user drop column age;                        删除表user中的列age
alter user username identified by "passwd";              修改用户密码
alter table oldtable rename to newtable;                 修改表名
alter table user modify column age varchar(10) default null;修改age类型为varchar,默认空
alter table tablename change column age agef varchar(50);修改列名从age到agef
alter table tablename auto_increment=4;                  重置自增键从4开始
alter table tablename add id int primary key not null auto_increment first;添加id放在开始位置
alter table tablename drop column id;                    删除id字段
alter table tablename modify id int auto_increment primary key;修改id为自增并设为主键
alter table tablename add unique(`id`);                  添加唯一约束,括号内为反引号
alter table user modify column created_on datetime default CURRENT_TIMESTAMP;修改表名user中的列created_on的类型为datetime,默认值为CURRENT_TIMESTAMP
alter table tablename modify 字段1 字段类型 after 字段2; 将字段1移动到字段2后面
alter table tablename modify 字段1 字段类型  first;      将字段1移动到最前面

其余命令

help create table;                           查看创建表语法
rename user oldusername to newusername;      重命名用户名
drop user  username;                         删除用户
show grants for username;                    查看用户具备的权限
grant select on test.* to username;          给用户username查询test库下全部表的权限
grant update on test.* to username;          给用户username更新test库下全部表的权限
grant delete on test.* to username;          给用户username删除test库下全部表的权限
grant insert on test.* to username;          给用户username向test库下全部表插入数据的权限
grant all privileges  on test.* to username; 给用户username操作test库下所有表的权限
grant all privileges on `abc_%`.* to user@'%' identified by 'passwd'; #给用于赋予abc_开头的所有库权限,注意abc那里是反引号
revoke select on test.* from username;       回收用户的查询权限
revoke update,insert on test.* from username;回收用户更新插入数据权限
set password for username = password("密码");设置用户密码
analyze table tablename;                     检查表键是否正确,如有异常在Msg_text输出
show status;                                 查看MySQL运行状态
show variables;                              查看MySQL服务器的配置参数
show variables like "tran%";                 筛选以tran为开头的参数信息
show processlist;                            查看所有活动进程
show slave status\G;                         查看主从库的状态
show databases;                              查询所有数据库信息
show table status from dbname where name="tablename";查看某个库下指定表的存储引擎
show table status from dbname;              查看库下所有表的存储引擎
show create database dbname;                 查看创建库的语句
show create database tablename;              查看创建表的语句
kill id;                                     杀掉某个进程
mysqldump -u root -p --single-transaction --databases dbname > dbname.sql #导出数据库和里面的表(包括数据,加了--single-transaction后不会锁表,保持数据一致性,降低性能影响)
mysqldump -u root -p --single-transaction  dbname tbname > tbname.sql 备份指定表的结构和数据
mysqldump -u root -p --single-transaction --all-databases > all.sql  导出全部数据库
mysqldump -u root -p --single-transaction --databases dbname --tables table1 table2 > two_table.sql 导出多张表(包含表结构与数据,如果表被删除,可以通过此备份恢复)
mysqldump -u root -p --single-transaction -d dbname tablename > table.sql 加了-d参数,只导出表结构不导表数据(如果表删除了,可通过此导出sql重新创建表,但是表中没有数据)
mysqldump -u root -p --single-transaction -t dbname tablename > table.sql 加了-t参数,只导出表数据不导表结构(如果表删除了那么没有结构无法恢复)
mysqldump -u root -p --single-transaction --no-data dbname tablename > dbtable.sql 导出数据库以及表结构,没有数据(如果数据库被删除,通过此sql可恢复数据库以及里面的表,但是表中无数据)
optimize table table_name;                   删除表后进行碎片清理(会锁表,空闲时间执行)
mysql -u root -p < a.sql > b.txt             #执行a.sql并将结果导入到b.txt中
mysqldump -u root -p --single-transaction --no-data dbname > dbtable.sql

1、mysql执行触发器,如何忽略语句中间的分号?

在MySQL中,触发器(Trigger)是用户定义的SQL语句的集合,它们在指定的数据库操作发生时自动执行。如果你在执行触发器时遇到了分号(;)的问题,通常是因为触发器的定义中包含了多个语句,而这些语句需要正确的分隔符,在MySQL中,触发器默认使用分号作为语句的结束符。但是,如果你的触发器包含多个语句,你需要改变语句的分隔符,通常使用$$或其他自定义的分隔符,如下:

DELIMITER $$

CREATE TRIGGER your_trigger_name
BEFORE INSERT ON your_table_name
FOR EACH ROW
BEGIN
    -- 你的触发器逻辑
    INSERT INTO another_table (column1, column2) VALUES (NEW.column1, NEW.column2);
END $$

DELIMITER ;

在这个示例中,我们首先使用DELIMITER $$改变了语句的分隔符,这样我们就可以在触发器定义中使用分号而不会导致命令提前结束。然后,我们定义了触发器,并在结束时使用END $$来标识触发器定义的结束。最后,我们用DELIMITER ;将分隔符改回默认的分号

2、mysql5.7如何禁用ssl?

修改my.cnf配置文件,添加参数ssl=0即可

3、mysql从库设置只读?

read_only=1     #my.cnf中配置,表示可读写
read_only=0     #表示只读

如果设置read_only=1,那么普通用户只能执行select查询,不能执行insert update delete create等操作,但是root用户仍然可以执行写入操作,如果要限制超级用户的权限,可以通过如下参数:

super_read_only=1   #超级用户也不能写入

配置了super_read_only=1后的注意事项:

  • 不会影响复制线程,也就是主从不受影响
  • 临时表不受限制:用户仍然可以修改和创建临时表
  • 设置了super_read_only=1那么read_only自动为,但是设置read_only=1不会自动设置super_read_only=1