【MYSQL】Mysql常用语句及命令
MySQL基本操作分类
SQL是结构化查询语言(Structured Query Language)简称,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
1. DDL(data definition language) : 数据库定义语言
用来定义创建操作表的时候用到的一些sql命令,比如CREATE、ALTER、DROP,为表加入索引等等。
Online DDL:是指在线操作DDL语句,比如更改数据字典,修改字段信息,但是在线上大量访问大数据的情况下回导致锁表,所以mysql官网为此提供了这个在线表变更,同时不影响现在数据提供服务。
mysql5.7 online ddl文档 https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl.html
mysql8 特性之原子DDL文档 https://dev.mysql.com/doc/refman/8.0/en/atomic-ddl.html
2. DML(data manipulation language) :数据操纵语言
最常用的,是对表中具体数据的操作,比如UPDATE、INSERT、DELETE这样的。
3. DCL(Data Control Language):数据库控制语言
用于数据库的控制设置功能,比如数据库角色,登录权限授予。
4. TCL(Transaction Control language) :数据库事务控制语言
用于sql语句事物控制,比如SET TRANSACTION COMMIT ROLLBACK
TPL事务处理语言:它的语句能确保被DML语句影响的表的所有行及时得以更新。TPL语句包括BEGIN TRANSACTION,COMMIT和ROLLBACK。
1.查看mysql版本号
MySQL [release_test_oa]> select version(); +------------+ | version() | +------------+ | 5.6.27-log | +------------+ 1 row in set (0.00 sec)
或者
MySQL [release_test_oa]> status; -------------- mysql Ver 15.1 Distrib 5.5.44-MariaDB, for Linux (x86_64) using readline 5.1 Connection id: 1044533 Current database: release_test_oa Current user: root@localhost SSL: Not in use Current pager: stdout Using outfile: '' Using delimiter: ; Server: MySQL Server version: 5.6.27-log Source distribution
2.连接本地mysql
mysql -uroot -p 或者 mysql -h127.0.0.1 -uroot -p
连接远程mysql
mysql -u root -p -h 192.168.1.2
3.导出本地数据库某张表(比如导出数据中的USERS表) 回车后要输入数据库密码
mysqldump databases -u root -p --tables USERS>/usr/tmp/users.sql
4.导出远程数据库某张表(USERS表) 回车后要输入数据库密码
mysqldump -h192.168.79.206 -p3306 databases -u root -p --tables USERS>/usr/tmp/users.sql
5.表名重命名
RENAME TABLE USERS TO USERS_BAK
6.查看表索引信息
show index from tables; 或者 show keys from tables; 两个命令输出都一样
7.复制表命令
原表是vistor
create table vistor_two like vistor; 这个会把原表的索引信息带过去, 用上面查看索引命令可以查看的到 ,但只是复制表结构; create table vistor_three select * from vistor; 这个不会把原表的索引信息带过去,会把数据复制过去; (最好不要用这个,之前工作中因为表没自增主键导致程序插入的数据主键字段id值都为0)
8.新增字段
alter table tablename add new_ziduan int(4) default '0';
添加多个字段
ALTER TABLE okr_okrs ADD COLUMN self_assessment_comment_id INT(11) DEFAULT '0' COMMENT '自评总结.@okr_comment.id' AFTER creator_name, ADD COLUMN monthly_review_comment_id INT(11) DEFAULT '0' COMMENT '上级月度总评.@okr_comment.id' AFTER creator_name;
9.删除字段
alter table tablename drop column;
10.删除表数据
delete from tablename ; 或者 truncate tablename ; 第一个删除会有删除记录,误删可以通过日志恢复记录;truncate是删除了旧表,重新创建了这个表,之前所有的状态都相当于新表;
11.复制表部分字段数据到另一张表 (同字段类型)
insert into tables_new (ID,BYNAME,STATUS) select ID,BYNAME,STATUS from tables_old;
12.查看表字段
show columns from tablename;
13.查看表状态
show table status; 显示所有的表 show table status from database_name like 'task%'; 显示数据库database_name中表名以task开头的表。
14.查看表有多少个字段
select count(*) from information_schema.COLUMNS where TABLE_SCHEMA='数据库名' and table_name='表名'
15.修改mysql登录用户密码
use mysql; 选中mysql库 update user set password=password('你要修改的密码') where user='用户名'; 然后在刷新权限生效 flush privileges;
可用select length(password('123'))察看加密后密码长度
16.查看mysql端口号
mysql> show global variables like 'port'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | port | 3306 | +---------------+-------+
17.查看临时表
mysql> SHOW STATUS LIKE 'created_tmp%'; +-------------------------+-------+ | Variable_name | Value | +-------------------------+-------+ | Created_tmp_disk_tables | 0 | | Created_tmp_files | 5 | | Created_tmp_tables | 0 | +-------------------------+-------+
18.查看引擎
mysql> SHOW ENGINES; +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES | | FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL | | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO | | MyISAM | YES | MyISAM storage engine | NO | NO | NO | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | | CSV | YES | CSV storage engine | NO | NO | NO | | ARCHIVE | YES | Archive storage engine | NO | NO | NO | | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
19.查看字符集对应排序规则
mysql> SHOW COLLATION; +----------------------------+----------+-----+---------+----------+---------+ | Collation | Charset | Id | Default | Compiled | Sortlen | +----------------------------+----------+-----+---------+----------+---------+ | armscii8_bin | armscii8 | 64 | | Yes | 1 | | armscii8_general_ci | armscii8 | 32 | Yes | Yes | 1 | | ascii_bin | ascii | 65 | | Yes | 1 | | ascii_general_ci | ascii | 11 | Yes | Yes | 1 | | big5_bin | big5 | 84 | | Yes | 1 | | big5_chinese_ci | big5 | 1 | Yes | Yes | 1 | | binary | binary | 63 | Yes | Yes | 1 | | cp1250_bin | cp1250 | 66 | | Yes | 1 | | cp1250_croatian_ci | cp1250 | 44 | | Yes | 1 | | cp1250_czech_cs | cp1250 | 34 | | Yes | 2 | | cp1250_general_ci | cp1250 | 26 | Yes | Yes | 1 | | cp1250_polish_ci | cp1250 | 99 | | Yes | 1 |
查看编码集
show charset;
比如想要知道当前mysql是否支持utf8mb4
编码,如下
20.查看线程使用的情况
mysql> SHOW STATUS LIKE 'threads%'; +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | Threads_cached | 0 | | Threads_connected | 1 | | Threads_created | 1 | | Threads_running | 1 | +-------------------+-------+
21.启动时候指定用户身份
[root@localhost bin]# ./mysqld --user=mysql 指定用mysql用户身份
22.查看表字段及注释
show full fields from table_name;
23.修改表引擎
ALTER TABLE table_name ENGINE=InnoDB; #将表存储引擎修改为innodb
24.重置autoIncrement的值
ALTER TABLE table_name AUTO_INCREMENT = 1;
25.索引创建 删除 查看
CREATE UNIQUE INDEX index_name ON table_name(字段名) 创建唯一索引方法1 ALTER TABLE table_name ADD UNIQUE (字段名) 创建唯一索引方法2 ALTER TABLE table_name ADD UNIQUE (字段名) 创建普通索引 DROP INDEX index_name ON talbe_name 删除索引方法1 ALTER TABLE table_name DROP INDEX index_name 删除索引方法2 show index from table_name 查看表索引信息
26.查询当前MySQL本次启动后的运行统计时间
mysql> show status like 'uptime'; +---------------+--------+ | Variable_name | Value | +---------------+--------+ | Uptime | 140459 | +---------------+--------+
27.查看是否有表锁住
show OPEN TABLES where In_use > 0;
28.查看查询进程
show processlist;
如果不进入mysql命令行也可以进入mysql/bin目录下输入mysqladmin processlist。
如果没有SUPER权限,则只能看到自己发起的线程, 否则可以看到全部的线程。
show processlist;也可以用于查询在线登录用户
29.返回不重复数据
SELECT DISTINCT user_name,vistor_username FROM KY_FEED_VISTOR WHERE user_name='shenhy'
单独的distinct只能放在开头 而且distinct()里面只能包含一个字段
SELECT * FROM KY_FEED_VISTOR WHERE user_name='shenhy' GROUP BY user_name, vistor_username ORDER BY vistor_time DESC
30.创建一个新表且新表的结构与查询的表的结构是一样,不过没有索引
create newTable newtable as select * from oldTable where 1=0;
这种方式只会将原表的字段结构复制到新表中来,但不会复制原表中的索引到新表中来。这种方式比较灵活可以在复制原表表结构的同时指定要复制哪些字段,并且自身复制表也可以根据需要增加字段结构。
31.模糊查询表
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = '数据库名' AND TABLE_NAME LIKE '表名%'
如果想生成清空多个表语句,也可以按照下面方法生成对多张表的truncate语句。
select CONCAT('truncate TABLE ',table_schema,'.',TABLE_NAME, ';') from INFORMATION_SCHEMA.TABLES where table_schema = '数据库名' AND TABLE_NAME LIKE '表名%';
32.复制表信息到另一张表
从一个表中复制所有的列插入到另一个已存在的表中: INSERT INTO 表名 SELECT * FROM 目标表名;
或者只复制希望的列插入到另一个已存在的表中: INSERT INTO 表名 (column_name(s)) SELECT column_name(s) FROM 目标表名;
33.获取字段后几个字符
34.mysql select update语句
当我们需要从select结果中去update时候,一般我们会想到update table set a= 1 where id in (select id from table), 但是这样是不行的,如下。
update select 语句需要使用inner join
update kaoqin_grant_record inner join (SELECT id FROM kaoqin_grant_record WHERE invalid_time <= '2019-11-01' AND balance_type = 5 AND operator_type = 1 AND is_has_cleand = 0) AS child on kaoqin_grant_record.id =child.id set kaoqin_grant_record.is_has_cleand = 1
35.获取所有表的行数
SELECT table_name, table_rows FROM information_schema.tables WHERE table_schema = 'hrms' ORDER BY table_rows desc
36.复制数据库表到另一个数据库中
create table 要复制表名 select * from 源数据库.待复制表名;
37. 截取字段内容
有时候我们会遇到一些截取某个字段内容部分字符串,如下我们要将"userIds":[864]中数字id提取出来用来统计多少用户信息。
可以使用mysql自带函数
SELECT DISTINCT SUBSTRING_INDEX(acontent, ']', 1) AS userId FROM ( SELECT SUBSTRING_INDEX(message_content, 'userIds":[', -1) AS acontent FROM okr_messages WHERE create_time > "2021-12-22 22:00:00") AS n;
可以使用DISTINCT函数进行去重,得到结果如下:
如果还想将这些数据导入数据表,可以生成insert插入语句:
SELECT CONCAT("insert into circle_userid values(", userId, ");") FROM ( SELECT DISTINCT SUBSTRING_INDEX(acontent, ']', 1) AS userId FROM ( SELECT SUBSTRING_INDEX(message_content, 'userIds":[', -1) AS acontent FROM okr_messages WHERE create_time > "2021-12-22 22:00:00") AS n ) AS result;
结果如下:
38. 查看数据库版本和默认存储引擎
select @@version,@@default_storage_engine;
持续更新........