mysql > show databases; mysql > show create database db1; //更详细的查看库
使用库
1
mysql > use db1;
表操作
创建表
1
mysql > create tables 表名(字段 类型(修饰符))
查看表
1 2 3 4
查看所有表:mysql > show tables ; 查看表记录:mysql > show table status like '表名' ; 查看表结构:mysql > desc '表名' ; 查看表记录:mysql > select * from '表名' ;
修改表
1
修改表名:mysql > rename table '源表名' to '新表名' ;
字段记录操作
字段
1 2 3
添加字段:mysql > alter table '表名' add '字段' '修饰符'; 删除字段:mysql > alter table '表名' drop '字段' ; 修改字段:mysql > alter table '表名' change '旧字段' '新字段' '修饰符';
记录
1 2 3 4
添加记录:insert into '表名(记录,记录)' values (),(),(); :insert into '表名' values (),(),(); 修改记录:update '表名' set 字段='' where 字段=''; 删除记录:delete from '表名' where '字段'='' ;
简单查询:select * from '表名'; 避免重复:select distinct '字段' from '表名'; 条件查询:select 字段,字段 from 表名 where id<=5(条件); 四则运算查询:select id,dep_id,id*dep_id from company.employee5 where id<=5; 定义显示格式一:select id*dep_id as "id and dep_id's sum" from company.employee5 where id<=5; 定义显示格式:SELECT CONCAT(name, ' annual salary: ', salary*14) AS Annual_salary FROM employee5; //定义格式+四个运算,CONCAT是关键字 多条件:select '字段,字段‘ from '表名' WHERRE '条件一' AND '条件二'; 关键字between and: select '字段,字段' from '表名' where 字段 BETWEEN '条件一' AND '条件二';
---------- 排序查询: select '字段' from '表名' ORDER BY '排序字段';//字段后加DESC正序,ASC反序
限制查询的记录数: select '字段' from '表名' ORDER BY '字段,DESC|ACS' LIMIT '数字'; //数字有两种的是(5,从初始位置到第五个)(2,5,第三个开始,共显示五个)
使用集合的查询: select COUNT(*) from '表名'; select COUNT(*) FROM '表名' WHERE dep_id=101; select MAX(salary) FROM '表名'; select MIN(salary) FROM '表名'; select AVG(salary) FROM '表名'; select SUM(salary) FROM '表名'; select SUM(salary) FROM '表名' WHERE dep_id=101;
分组查询: select '字段' from '表名' group by 字段; //可参考下列面试题
模糊查询: select '字段' from '表名' LIKE '关键字';
正则表达式查询: select * from '表名' where '字段' REGEXP '关键字';
删库
1 2
删库:drop database '库名'; 删表:drop table '表名'
高级操作
连接数据库
1
# mysql -uroot -p -h10.18.44.209 -p3306
修改数据库密码
1 2 3 4 5 6 7 8 9 10 11
# vim /etc/my.cnf 追加 validate_password=off # systemctl restart mysqld 方法一: mysql > SET PASSWORD FOR user3@'localhost'='new_password'; mysql > flush privileges; 方法二: mysql > update mysql.user set password=password('newpassword') where user='root'; mysql > flush privileges; 方式三: mysql > set password for 'root'@'localhost'=password('newpassord');
CASE input_expression WHEN when_expression THEN result_expression [...n ] [ ELSE else_result_expression END
参数介绍
1 2 3 4 5 6 7 8 9 10 11
input_expression是使用简单 CASE 格式时所计算的表达式。Input_expression 是任何有效的 Microsoft SQL Server 表达式。 WHEN when_expression使用简单 CASE 格式时 input_expression 所比较的简单表达式。When_expression 是任意有效的 SQL Server 表达式。Input_expression 和每个 when_expression 的数据类型必须相同,或者是隐性转换。 占位符,表明可以使用多个 WHEN when_expression THEN result_expression 子句或 WHEN Boolean_expression THEN result_expression 子句。 THEN result_expression 当 input_expression = when_expression 取值为 TRUE,或者 Boolean_expression 取值 TRUE 时返回的表达式。 result expression 是任意有效的 SQL Server 表达式。 ELSE else_result_expression当比较运算取值不为 TRUE 时返回的表达式。如果省略此参数并且比较运算取值不为 TRUE,CASE 将返回 NULL 值。else_result_expression 是任意有效的 SQL Server 表达式。else_result_expression 和所有 result_expression 的数据类型必须相同,或者必须是隐性转换。
CASE WHEN Boolean_expression THEN result_expression [...n ] [ ELSE else_result_expression END
参数介绍:
1 2 3 4 5
WHEN Boolean_expression 使用 CASE 搜索格式时所计算的布尔表达式。Boolean_expression 是任意有效的布尔表达式。结果类型从 result_expressions 和可选 else_result_expression 的类型集合中返回最高的优先规则类型。有关更多信息,请参见数据类型的优先顺序。
CASE 搜索函数:返回结果值介绍: 按指定顺序为每个 WHEN 子句的 Boolean_expression 求值。返回第一个取值为 TRUE 的 Boolean_expression 的 result_expression。 如果没有取值为 TRUE 的 Boolean_expression,则当指定 ELSE 子句时 SQL Server 将返回 else_result_expression;若没有指定 ELSE 子句,则返回 NULL 值。
3)CASE WHEN例子介绍 1、仅带简单case的select语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14
select CASE good_type WHEN '0' THEN '食品类' WHEN '1' THEN '饮料类' WHEN '2' THEN '日用品' WHEN '3' THEN '鲜果类' END AS good_type_now, good_type,user_id,user_name FROM express.t_main_order
select CASE WHEN good_type<2 THEN'<2' WHEN good_type>=2AND good_type<3 THEN'>=2 && <3' ELSE'>=3'ENDAS good_now_type, good_type,user_id,user_name FROM t_main_order;
select CASE WHEN good_type<2 THEN'<2' WHEN good_type>=2AND good_type<3 THEN'>=2 && <3'ELSE'>=3' ENDAS good_now_type, count(*) AS num_count FROM t_main_order GROUPBY good_now_type ORDERBY num_count;
insert into `t1` (`id`, `name`, `score`) values('1','n1','59'); insert into `t1` (`id`, `name`, `score`) values('2','n2','66'); insert into `t1` (`id`, `name`, `score`) values('3','n3','78'); insert into `t1` (`id`, `name`, `score`) values('4','n1','48'); insert into `t1` (`id`, `name`, `score`) values('5','n3','85'); insert into `t1` (`id`, `name`, `score`) values('6','n5','51'); insert into `t1` (`id`, `name`, `score`) values('7','n4','98'); insert into `t1` (`id`, `name`, `score`) values('8','n5','53'); insert into `t1` (`id`, `name`, `score`) values('9','n2','67'); insert into `t1` (`id`, `name`, `score`) values('10','n4','88');
1 2 3
1. 单分数最高的人和单分数最低的人。 mysql> select name,score from t1 group by score desc limit 1; mysql> select name,score from t1 group by score ASC limit 1;
1 2 3 4 5 6 7 8 9 10
2. 两门分数加起来的第2至5名。 mysql> select name,sum(score) from t1 group by name order by sum(score) desc limit 1,4; +------+------------+ | name | sum(score) | +------+------------+ | n3 | 163 | | n2 | 133 | | n1 | 107 | | n5 | 104 | +------+------------+
1 2
3. 两门总分数在150分以下的人。 select name,sum(score) from t1 group by name having sum(score) < 150;
1 2 3
4. 两门平均分数介于60和80的人。 select name,avg(score) from t1 group by name having avg(score) between 60 and 80; select name,avg(score) from t1 group by name having avg(score) >60 and avg(score) <80;
1 2 3 4 5 6 7 8
5. 总分大于150分,平均分小于90分的人数。 mysql> select name,sum(score),avg(score) from t1 group by name having sum(score)>150 and avg(score)<90; +------+------------+------------+ | name | sum(score) | avg(score) | +------+------------+------------+ | n3 | 163 | 81.5 | +------+------------+------------+ 1 row in set (0.00 sec)
1 2
6. 总分大于150分,平均分小于90分的人数有几个。 select count(distinct name) from t1 group by name having sum(score) > 150 and avg(score) < 90;
在flush tables with read lock成功获得锁之前,必须等待所有语句执行完成(包括SELECT)。所以如果有个慢查询在执行,或者一个打开的事务,或者其他进程拿着表锁,flush tables with read lock就会被阻塞,直到所有的锁被释放。请看下面的例子:
mysql> show processlist; +----+------+-----------+------+------------+------+-------------------+----------------------------------------------------------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------+-----------+------+------------+------+-------------------+----------------------------------------------------------------------+ | 4 | root | localhost | test | Query | 80 | Sending data | select count(*) from t t1 join t t2 join t t3 join t t4 where t1.b=0 | | 5 | root | localhost | test | Query | 62 | Flushing tables | flush tables with read lock | | 6 | root | localhost | test | Field List | 35 | Waiting for table | | | 7 | root | localhost | test | Query | 0 | NULL | show processlist | +----+------+-----------+------+------------+------+-------------------+----------------------------------------------------------------------+ 4 rows in set (0.00 sec)
复制代码
flush data
切换完成后可以释放锁
unlock tables
1)在master执行:show processlist;
显示Master has sent all binlog to slave; waiting for binlog to be updated
2)在slave执行:show processlist;
显示Slave has read all relay log; waiting for the slave I/O thread to update it
mysql> show slave status \G;
检查IO及SQL线程是否正常,如果为NO表明同步不一致,需要重新将slave同步保持主从数据一致。
3)停止slave io线程
在slave执行:mysql> STOP SLAVE IO_THREAD
mysql> SHOW PROCESSLIST;
确保状态为:has read all relay log
以上都执行完成后可以把slave提升为master:
4)提升slave为master
Stop slave;
Reset master;
Reset slave all; 在5.6.3版本之后
Reset slave; 在5.6.3版本之前
查看slave是否只读模式:show variables like 'read_only';
只读模式需要修改my.cnf文件,注释read-only=1并重启mysql服务。
或者不重启使用命令关闭只读,但下次重启后失效:set global read_only=off;
mysql> show master status \G;
备注:reset slave all 命令会删除从库的 replication 参数,之后 show slave status\G 的信息返回为空。
5)将原来master变为slave
在新的master上创建同步用户:
grant replication slave on *.* repl@'IP of slave' identified by 'replpwd';
在新的slave上重置binlog:
Reset master;
change master to master_host='192.168.0.104', //Master 服务器Ip