mysql常用sql语句

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql常用sql语句相关的知识,希望对你有一定的参考价值。

1. mysql 管理命令 帮助? HELP

1.1查看mysql状态信息

show processlist; 查询当前连接进程
show status  查看当前会话的数据库状态信息
show global status; 查看整个数据库运行状态信息,很重要的分析并做好监控
show processlist; 查看正在执行的sql语句,
show full processlist  查看正在执行的完整sql语句,
set global key_buffer_size=32777218   不重启数据库调整参数,临时生效
show variables;查看数据库的参数信息,如my.cnf中参数是否生效

1.2修改mysql字符集为UTF-8的方法:

show variables like "%char%"

在/etc/my.cnf对应如下配置段加入相应命令
[clinet]
字段加入default-character-set=utf8   客户端生效
[mysqld]
字段加入character-set-server=utf8
[mysql]
字段里加入default-character-set=utf8   本地生效
然后重启mysql服务

查询字符集文件
show character set;

1.3解决mysql乱码的问题?

方法1:
1. 检查建表语句,判断字符集类型show create table test_t0;
2. 设置字符集set names latinl;

方法2:
导入数据的时候指定符字符
mysql -uroot -p123456 --default-character-set=latin1 discuz</backup/discuz.sql

方法3:
在my.cnf文件中加入字符集
[mysqld]
default-character-set=latinl   适合5.5以前
character-set-server=latinl    适合5.5以后

不乱码的思想,linux ,客户端,服务器端,库,表,程序都统一字符集,中英文环境尽量使用UTF8

1.4 mysql的历史命令保护

vi /root/.mysql_bistory   # 创建mysql历史命令
ln -s dev/noull > mysql_history   # 保户命令历史,创建成空文件

系统历史命令清除  bashrc history -c

1.5 Mysql远程管理 mysql -uroot -p -h 192.168.1.100

mysql交互式   mysql -uroot -p123456 -e “show databases;”

Mysql安全优化
删除空用户和多余用户
            drop user ‘username‘@‘host‘

删除空用户
        drop user ‘ ‘@‘host‘   

1.6 mysql锁表

5.1版本: flush tables with read lock
5.5版本: flush table with read lock

解锁:
解锁跟系统的两个变量值有关,自动解锁时间
Wait_timeout = 28800
Interactive_timeout = 28800

1小时默认3600秒  8小时*3600秒=28800秒    24小时共86400秒

Show variables like “%timeout%”

1.7 数据库文件路径

mysql> show variables link ‘%datadir%‘;

2.Mysql的升级

官方升级网址
https://dev.mysql.com/doc/refman/5.5/en/upgrading.html

As part of the "Logical Upgrade", I had to add the --flush-privileges option when dumping because mysql didn‘t recognise the newly created users when restoring views. Additionally I added --triggers for completeness.
mysqldump --add-drop-table --routines --events --triggers --flush-privileges --all-databases --force -uroot -p > mysql_backup.sql

3. Mysql SQL语句(DDL DML DCL 语言)

**SQL语句常见的分类**

DDL   数据定义语言(CREATE ALTER DROP)
DML   数据操作语言(SELECT INSTER DELETE UPDATE)
DCL   数据控制语言(GRANT  REVOKE  COMMIT ROLLBACK)

结构化查询语言(Structured Query Language)简称SQL(发音:/?es kju? ?el/ "S-Q-L"),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。

一:数据查询语言(DQL:Data Query Language):
其语句,也称为“数据检索语句”,用以从表中获得数据,确定数据怎样在应用程序给出。保留字SELECT是DQL(也是所有SQL)用得最多的动词,其他DQL常用的保留字有WHERE,ORDER BY,GROUP BY和HAVING。这些DQL保留字常与其他类型的SQL语句一起使用。
二:数据操作语言(DML:Data Manipulation Language):
其语句包括动词INSERT,UPDATE和DELETE。它们分别用于添加,修改和删除表中的行。也称为动作查询语言。
三:事务处理语言(TPL):
它的语句能确保被DML语句影响的表的所有行及时得以更新。TPL语句包括BEGIN TRANSACTION,COMMIT和ROLLBACK。
四:数据控制语言(DCL):
它的语句通过GRANT或REVOKE获得许可,确定单个用户和用户组对数据库对象的访问。某些RDBMS可用GRANT或REVOKE控制对表单个列的访问。
五:数据定义语言(DDL):
其语句包括动词CREATE和DROP。在数据库中创建新表或删除表(CREAT TABLE 或 DROP TABLE);为表加入索引等。DDL包括许多与人数据库目录中获得数据有关的保留字。它也是动作查询的一部分。
六:指针控制语言(CCL):
它的语句,像DECLARE CURSOR,FETCH INTO和UPDATE WHERE CURRENT用于对一个或多个表单独行的操作

mysql 的system命令
在命令行下,可以通过执行system命令,调用bash环境,比如

system ls /data/ 查看data目录下的文件

3.1 Mysql 数据库管理

select查询命令  select *();
查看当前库
mysql> select database();

查看当前用户
mysql> select user();   

查看当前时间
mysql> select now();   
8.6.2.2 切换当前库  use databases;

    mysql> use mysql;

     创建数据库  Create Databas
    create Database Discuz  character set utf8
 create database if not exists db_name   如果不存在就创建,不报错

    # 查询数据库创建的历史命令
    show create database discus;

    查询字符集文件
    show character set;

    # 创建数据库并指定字符集
    create database discuz default character set gbk collate gbk_chinese_ci;
    create database discuz default character set utf8 collate utf8_general_ci;

     数据库重命名
    RENAME database olddbname TO newdbname

    查看数据库  Show Databases
    show databases;
    show databases like ‘my%’;

    查询数据库创建的历史命令
    show create database discus;

     删除数据库  Drop Database
 drop datebase [if exists] db_name;  
 注:删除无法恢复
 Drop database bbs; # 删除bbs数据库

3.2 Mysql 数据表操作

创建表:Create table tb_name (字段名 数据类型)
mysql> create table tutorials_tbl(
        ->    tutorial_id INT NOT NULL AUTO_INCREMENT,
        ->    tutorial_title VARCHAR(100) NOT NULL,
        ->    tutorial_author VARCHAR(40) NOT NULL,
        ->    submission_date DATE,
        ->    PRIMARY KEY ( tutorial_id )
-> );
+-----------------+--------------+------+-------+------------+----------------+
| Field           | Type         | Null |   Key  | Default    | Extra         |
+-----------------+--------------+------+--------+------------+----------------+
| torial_id       | int(11)       | NO   |  PRI  | NULL    | auto_increment   |
| tutorial_title    | varchar(100)  | NO   |       | NULL    |                |
| tutorial_author  | varchar(40)   | NO   |       | NULL    |                |
| submission_date | date         | YES  |       | NULL    |                |

设置主键:
create table passwd2 ( 
id int(10) auto_increment PRIMARY KEY,
name char(20),
sex char(20)
);

例:create table students(name char(20) null,age char(10) null,sex char(10) null);
insert into students values(‘zhonglaing‘,‘23‘,‘man‘);

*************************
查询表的建表语句
show create table studentG;
*************************
G 
send command to mysql server ,display result vertically 发送命令到mysql server,垂直显示结果

生产创建表语句
CREATE TABLE `subject_comment_manager` (
`subject_comment_manager_id` bigint(12) NOT NULL auto_increment COMMENT ‘主键‘,
`subject_type` tinyint(2) NOT NULL COMMENT ‘素材类型‘,
`subject_primary_key` varchar(255) NOT NULL COMMENT ‘索材的主键‘,
`subject_title` varchar(255) NOT NULL COMMENT ‘索材的名称‘,
`edit_user_nick` varchar(64) default NULL COMMENT ‘修改人‘,
`edit_user_time` timestamp  NULL default NULL COMMENT ‘修改的时间‘,
`edit_comment` varchar(255) default NULL COMMENT ‘修改的理由‘,
`state` tinyint(1) NOT NULL  default ‘1‘ COMMENT ‘0代表关闭,1代表正常‘,
PRIMARY KEY (`subject_comment_manager_id`),
KEY `IDX_PRIMARYKEY`(`subject_primary_key`(32)),
KEY `IDX_SUBJECT_TITLE` (`subject_title`(32)),
KEY `index_nick_type` (`edit_user_nick`(32),`subject_type`)
);

查看表: show tables

查看库中的表: show tables;
查年表中的结构: desc tabale_name;

删除表: Drop table tb_name
drop table [if exists] tb_name;
drop table bbs; # 删除bbs表

修改表:Alter table tb_name [ add|change|modify ]
alter table tb_name;
修改 modify 改属性 改数据类型
改变 change 改值 改名称
增加 add
删除 drop

增加:add

语法格式: alter table students add 字段名varchar(100) # 添加字段名 指定数据类型varchar
实例: alter talbe students add telphone int(20); # 增加telphone列,
alter talbe students add telphone int(20) first ; # 在第1列增加telphone列,
alter talbe students add telphone int(20) after name ; # 在name列后增加telphone列,

修改值:change
例: alter table students change “原字段1“ ”现字段2“ varchar(100) after name;
修改”原字段1”的字段名和类型,添加到Nmae字符之后
要指定源字段,新字段,新类型
alter table user change age ages varchar(100);

修改属性:modify
例: alter table users modify tel text(10); 
修改tel字段的字段类型  

删除列: drop

 例:alter table user drop id;

删除user表中的id列

清空表:delete from tables | truncate table
delete 是逻辑删除,一行一行删
truncate 物理删除,清空物理文件

清空表的内容
delect from jf_t1;

清空表的内容
truncate table user;

制一张表 create tables tb_name select from tb_name
复制一张表和数据:
create table new_table select
from old_table;

复制一张表不复制数据
create table new_table select * from old_table where 0 ;

只复制表结构到新表
CREATE TABLE 新表 SELECT * FROM 旧表 WHERE 1=2
或者
CREATE TABLE 新表 LIKE 旧表

复制表结构及数据到新表
CREATE TABLE 新表 SELECT * FROM 旧表

复制旧表的数据到新表(假设两个表结构一样)
INSERT INTO 新表 SELECT * FROM 旧表

复制旧表的数据到新表(假设两个表结构不一样)
INSERT INTO 新表(字段1,字段2,.......) SELECT 字段1,字段2,...... FROM 旧表

重命名表 rename table
Rename TABLE tb_name TO new_tb_name
? alter table rename tb_name to new_table 重命名表

表结构 desc table
mysql> desc mysql.user;
-----------------------+-----------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Host | char(60) | NO | PRI | | |
| User | char(16) | NO | PRI | | |
| Password | char(41) | NO | | | |
| Select_priv | enum(‘N‘,‘Y‘) | NO | | N | |

3.3 Mysql 数据管理

 插入数据:Insert into tb_name …  values …
?   指定字段插入:
insert  into  tb_name (col1,col2,...)values  (‘string‘,num,...);
插入数据 (字段名)  VALUES值 (‘字符串’, 数值1-9)
字符串要单引  数值不需要

    单行插入
    例: insert  into  tb_name (id,name)values  (‘1’,’zhongliang’)
    可同时插入多行数据

    多行插入
例: insert into student (name,sex) value (‘zhongliang‘.‘man’)(‘xiaoliang’,‘woman‘);
插入前先查询表的结果DESC tb_name  看哪些是必须插入值的
             # 未指定的字段代表是允许为null的,可以不在字段位写,按顺序写上不允许为空的字段

不指定字段插入

不指定字段插入,代表全部都插入值
name age sex telnet

例:insert into students values (‘zhongliang‘,20,‘m‘,249765270);

语句插入1000条
create database hd;
create table techer (name char(20),tel char(20));

for i in `seq 10000`;do mysql -e "use hd;insert into techer (name,tel) values (‘zhonglaing‘,‘123456789‘)";done

查询内容:select * from table; 

where条件:and or < >
order排序:
order by id asc # 按id正序排序
order by id desc # 按id倒序排序

显示表的所有字段
describe user;

select 字段  frome tb_name where 条件1 [and | or] 条件2

select count(*) from user;  统计多少行

select * from user limit 10; 看10行  # 在生产环境中不要查所有,应为当上千条数据时会卡死

select * from user where 列名>30;   #  查询某列的值大于30的
select * from user where 列名 like ‘%abc%’;   # 查询某列的值包含匹配abc字符的所有内容

显示user表的第一行内容
select * from user limit 1;
select * from user limit 1,3;  # 查看第1行第3行内容
select * from user where name=""  limit 10G;
select name from user where nam="";

内容匹配查询
select * from user name link "%zhong%";
select * from user name link "%zhong%" and name=xxx ;

排列显示,
select * from user where User=‘root‘ G;  

    多表查询

select 表1.列1 , 表2.列2 , 表3.列3 from 表1,表2,表3 where 条件1 and 条件2

select user.id,student.name,address.tel from user,student,address where

修改数据:Update tb_name Set 
 update tb_name set 列名=“新值”  where  列名=“value”;    # id

    例:update student set tel=249765270 where name=zhongliang;
             # 修改zhongliang用户的tel电话

    update mysql.user set host=‘localhost‘ where host=‘127.0.0.1‘ and user=‘root‘

    删除数据:Delete From tb_name where
    delete from tb_name where id=‘value‘;

     例:delete form student where tel=249765270

3.4Mysql 数据库备份还原

Xtranbackup  开源物理备份工具

备份分为逻辑备份和物理备份
逻辑备份:通过mysqldump备份过去
物理备份:通过将mysql目录的数据库文件拷贝过去

Mysqldump参数:
-A 备份所有库
-B 备份多个库 此参数使用后,自带create database语句,在恢复时,可以事先不建数据库就可忧复  如:mysqldump -uroot -p123456 </tmp/backup.sql
-x 锁表
-l  只读锁表
-C 压缩传输
--compact  去掉注释输出 用于调试
-d  备份表结构
-F  备份数据库时,切割blog日志,目的是防止备份数据与binlog重复,备份时记住binlog日志文件序号
--master-data=1    自动查找binlog日志位置节点 不需要手动入切割blog日志 与-F二选一    
=1 ;  在binlog中添加一条不带注释的change master的post节点和binlog文件名,用于在slave上导入时,能自动记录post点和binlog文件位置,用于同步之后的binlog文件

=2: 在binlog中添加一条带注释的change master的post节点和binlog文件名

 Mysql 全量备份与增量备份

全量备份:

    全量部份就是将数据库完整备份,mysql -uroot -p -A -B >/backup/mysql.sql

    innodb 引擎备份:
    mysqldump -uroot -p --default-character-set=gbk --single-transaction -F -B discuz | gzip    >/databackup/mysql.sql.gz

        innodb 引擎备份:
    mysqldump  -uroot -p --default-character-set=gbk --lock-all-tables -F -B discuz | gzip      >/databackup/mysql.sql.gz

企业场景全量和增量的频率是怎么做的呢?

  1. 中小公司,全量一般是每天一次,业务流量低谷执行全备,备份时要锁表
  2. 单台数据库,如何增量,用rsync(配合定时任务)把bin-log推送到远端备份服务器上
    例:rsync -avz mysql-bin* [email protected]::backup --password-file=/etc/rsync.passwd
  3. 大公司周备,每周六00点一次全备,下周日-下周六00点前都是增量
  4. 一主多从,会有一个从库做备份,延迟同步

    mysql的备份什么场景下使用?

  5. 迁移或升级数据库的时候
  6. 添加从库
  7. 主库勿删除时,需要备份还原
  8. 跨机房灾备,需要备份

    增量恢复全过程(针对前端可以暂停写入)

  9. 先对数据库进行锁表,防止新数据写入
  10. 找到全备和增备文件
    grep -i "change" /backup/mysql.sql 找到全备最后的binlog的pos点位置,根据位置,找到增量的binlog日志文件
  11. 如果前端不能锁主库,这时要马上刷新binlog mysqladmin -uroot -p flush-logs 生成新的Binlog文件,这样可以判
    断之后插入的数据会生成在新的binlog日志文件中
  12. 将需要增量恢复的binlog日志文件移动到新的目录,以防二次损坏
  13. 执行mysqlbinlog mysql-bin.0000014 >/databackup/binlog14.sql 将binlog日志生成sql语句
  14. vi /databackup/binlog14.sql 将勿操作语句删除,比如drop database之类的

    增量恢复全过程(针对前端不可以暂停写入) 不停库不推荐

    1. 立即断开从的sql_threed线程,防止从读取relay-log日志,
    2. 将主mysql的binlog进行分割 -F
    3. 将主mysql的最新全部和出故障前的binlog日志进行恢复到从(前提要把日志中出问题的语句先删除)
    4. 然后将从提升为主mysql
    5. 将原主mysql被切割的后面用户写入的新数据的binlog日志恢复到现新的主mysql库
    6. 缺点:可能导致后期写入的数据不能插入,因为在你恢复的时候,有人又写入数据,导致主键冲突
      最好的方案就是,在恢复最后写入数据时,暂停最短时间导入新数据。

    生产场景2:

    为了防止数据被勿删除,有些公司针对主从同步设置了某一台mysql从廷迟同步30-60分钟,这样做的目的是为了防止主数据库被执行勿删除时,从能保证数据完整并通过把主binlog增量部份的日志恢复到此从上,接替主的位置。

    生产场影mysql数据恢复思路?

    表重要的前题下:
  15. 停服务,挂维护页面 防止前端写入数据,保证数据一致性。
  16. 同时对故障的数据做一次备份,以防万一
  17. 恢复内存全量备份 根据post点位置,将相应的binlog日志恢复
  18. 启动测试

    Mysql备份数据库

        ?   备份所有数据库
    
            mysqldump -uroot -p  -B -A --events > all.sql    # 备份服务器中所有的库
    
            ?   备份mysql 使用root用户,密码123456 备份到/tmp/
            mysqldump -uroot -p123456  -B mysql  > /tmp/mysql2016.sql
    
            ?   数据库压缩备份 
            mysqldump  -uroot -p123456  discuz | gzip > backupfile.sql.gz
            解压:gzip -d backupfile.sql.gz
    
            ?   同时备份多个MySQL数据库 
            mysqldump -uroot -p123456 -B databasename1 databasename2 databasename3 > multibackupfile.sql
    
            ?   仅仅备份数据库结构 
            mysqldump –no-data –databases databasename1 databasename2 databasename3 > structurebackupfile.sql
    
            ?   跨主机备份
                     使用下面的命令可以将host1上的sourceDb复制到host2的targetDb,前提是host2主机上已经创建targetDb数据库:
    
            mysqldump -uroot -p sourceDb | mysql –uroot –p  --host=192.168.1.100 -C targetDb
                     -C指示主机间的数据传输使用数据压缩
                    目标主机必须gran授权允许源主机连接
    
                mysqldump: Got error: 1016: Can‘t open file: ‘./BBS/pre_home_feed.frm‘ (errno: 24) when using LOCK TABLES
                mysqldump -uroot -p123456 BBS --lock-tables=false > /data/bbs.sql
    
                mysqldump -uroot -p123456 -A -B --events --master-data=2 -x > /backup/all.mysql
    
            企业常规备份 myisam
            mysqldump -uroot -p123456 -A -B --master-data=2 -x dicuz|gzip >/backup/all.sql.gz
    
            企业常规备份 inodb
            mysqldump -uroot -p123456 -A -B --master-data=2 -x --single-transaction dicuz|gzip >/backup/all.sql.gz
    
            for myisam
            mysqldump --user=root --all-databases --flush-privileges --lock-all-tables --master-data=1 --flush-logs --triggers --routines --envents --hex-blob >/data/mysqlall.sql
    
            for innodb
            mysqldump --user=root --all-databases --flush-privileges --single-transaction --master-data=1 --flush-logs --triggers --routines --envents --hex-blob>/data/mysqlall.sql

    Mysql基于slave备份数据

        使用tar,copy,rsync来备份
        在slave的my.cnf增加log-slave-updates配置,使slave也产生binlog日志文件

    Mysql恢复数据库
    注意: mysql在恢复数据库的时候,最好像原数据库清除重新初始化,并重新change master,记得要重启数据库同步才会生效,

                恢复库
                mysql> mysql –uroot  zhongliang < /tmp/zhongliang.sql;
    
                恢复数据库 先创建数据库名,再恢复
    
                还原压缩的MySQL数据库 
                gunzip < backupfile.sql.gz | mysql -uusername -ppassword databasename

waiting to finalize termination
线程停止时发生的一个很简单的状态

以上是关于mysql常用sql语句的主要内容,如果未能解决你的问题,请参考以下文章

sql语句中嵌套时候用in 和=有啥区别

MySQL SQL常用语句

Mysql 常用 SQL 语句集锦

mysql常用sql语句

常用sql(mysql)语句

mysql数据库,排序的语句