MySql基础 命令行下的操作

首先使用 mysql -uroot -p命令进入mysql命令行模式

所有语句以分号结束

然后输入root密码回车确认。

root@a1b1c1:/var/www/html/htdocs# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2834
Server version: 5.7.15-0ubuntu0.16.04.1 (Ubuntu)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql<

show databases; //查看所有的数据库

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| phpmyadmin |
| qdm163387537_db |
| sys |
| wp |
+--------------------+
7 rows in set (0.00 sec)

use database: //选择具体的某个数据库

mysql> use wp
Database changed

show tables; // 查看数据库中所有的表

mysql> show tables ;
+---------------------------+
| Tables_in_wp |
+---------------------------+
| wp_bp_activity |
| wp_bp_activity_meta |
| wp_bp_friends |
| wp_bp_groups |
| wp_bp_groups_groupmeta |
| wp_bp_groups_members |
| wp_bp_messages_messages |
| wp_bp_messages_meta |
| wp_bp_messages_notices |
| wp_bp_messages_recipients |
| wp_bp_notifications |

update table set filed=value where filed=value;//执行简单的CRUD操作

mysql> update wp_options set option_value='http://paas.coderstory.cn' where option_id=2 ;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

其他好像没什么了 基本操作和sqlserver一样的 然后扯淡下mysql独有的

1.limit 类似于 top 参数 用于取查询结果的前几行
当limit给定2个参数时,又变成了分页函数 比如 limit 5,10 那么取查询结果第6行开始的数据,共10行
当然 如果偏移量比较大的时候(比如;limit 99999,10) 那么最好先查询出第100000行的数据 然后 where操作进行排序
这样性能比较好

2.神奇的show函数

你想要的结构类型的数据 都能show出来
比如 show databses ;show tables ;show columns
或者复合的 比如 show tables from database
SHOW STATUS 显示mysql服务的一些信息
SHOW PROCESSLIST︰ 显示当前mysql查询进程
SHOW VARIABLES 显示mysql的一些变量信息
SHOW INDEX FROM table[FROM database] 显示表的索引设置

3.实现OVER开窗函数的功能(分组后排序再取每个分组的前几条)
mysql是不支持开窗函数的,但有时候我们又必须用到 那么 要怎么实现呢?

第一个方法是使用group_concat函数 排序并合并分组后所需的数据,然后用substring_index切割得到第一个数据

user_id money create_time
1 100 1420520010
1 50 1420520000
2 200 1420520030
2 100 1420520020

select t.user_id, substring_index(group_concat( t.money order by t.create_time desc ),',',1) lastest_money from (select ord.user_id, ord.money, ord.create_time from orders ord where ord.user_id > 0 and create_time > 0 order by user_id asc , create_time desc) t group by user_id ;

第二种方法是关联自身排序

比如现在一张主表,存在如下字段

STATES,VERSION,CREATE_TIME,VERSION

关联表 sys_typemember sys_typemember的ID对应主表的TYPE字段

STATES,VERSION, CREATE_TIME ,TAG
1 1 2016-09-09 18:26 A
1 2 2016-09-09 18:26 A
1 3 2016-09-09 18:26 A
0 4 2016-09-09 18:26 A

VERSION是版本号,STATES是启用状态,CREATE_TIME是创建时间,TAG是类型。
险遭我要筛选所有启用状态的数据,病通过类型分组,取所有分组中版本号最大的数据,

SELECT
a1.*,
sys_typemember.member_name AS typename
FROM
(select * from coustom_deployment where STATES=1 ) a1
JOIN (
SELECT
a.VERSION,
a.TAG
FROM
coustom_deployment a
JOIN (select * from coustom_deployment where STATES=1 ) b ON a.TAG = b.TAG
AND a.VERSION &amp;lt;= b.VERSION
GROUP BY
a.TAG,
a.VERSION
HAVING
count(b.VERSION) = 1
) b1 ON a1.TAG = b1.TAG
AND a1.VERSION = b1.VERSION
JOIN sys_typemember ON a1.type = sys_typemember.ID
WHERE
sys_typemember.GROUP_ID = 1
ORDER BY
a1.create_time desc

这个Sql 首先对数据库进行赛选 satets为1的数据才是有效的 select * from coustom_deployment where STATES=1

然后 是一个子查询 这个子查询关联自身这张表,通过TAG字段关联
此时会产生很多无效的。

比如现在有如下数据

查询的结果包含了前三条数据的交叉合集(产生3*3行数据)
然后我们对这个关联设定一个条件 a.VERSION <= b.VERSION
然后通过TAG和VERSION分组

分组后 每个a表中的版本 和b表中同个TAB不同的VERSION数据产生几个交叉合计的组

然后 其中的一个分组 a.version 是这个分组中 version值最大的

通过a.VERSION <= b.VERSION再次删选 这个分组只剩下一条数据 a的version最大值和b的version最小值

最后having counr=1 找出这个分组数据