MySQL数据库的基本操作-学习


在命令行下以root用户进MySQL数据库的命令如下:

mysql -h127.0.0.1 -P3306 -uroot -p

然后输入密码再敲入回车键进入MySQL控制台。每一条MySQL数据库查询语句均要以英文分号结尾回车查询(或\G)。

以下基础的MySQL命令中,设计了一个名为bash的数据库,一个cmd_info的表,表中包括一些列名。其中中括号[]内的表示可选参数。

列出mysql的所有数据库:
show databases;

使用bash数据库:
use bash;

列出bash数据库的所有数据表:
show tables [from bash];

列出bash数据库的所有数据表(提供比较详细的信息):
show table status [from bash];

列出数据表cmd_info所有的列(提供比较详细的信息,等价于:desc cmd_info):
show full columns from cmd_info [from bash];

show full fields from cmd_info [from bash];

查询数据表cmd_info的总记录条数:
select count(*) from cmd_info;

查询数据表cmd_info的所有数据:
select * from cmd_info;

查询数据表cmd_info的前10条数据:
select * from cmd_info limit 10;

列出数据表cmd_info的索引信息:
show index from cmd_info [from bash];

列出mysql的当前状态:
status;
show status;

列出mysql系统变量:
show variables;

显示正在运行命令的mysql用户清单:
show process list;

退出mysql控制台:
quit

获取当前用户的权限信息:
show grants [for root@localhost];


记录一些select的技巧,比如如何用 in、limit、concat、distinct 等MySQL关键字:

1、select语句可以用回车分隔

$sql="select * from article where id=1"
和 $sql="select * from article
where id=1",都可以得到正确的结果,但有时分开写或许能更明了一点,特别是当sql语句比较长时。

2、批量查询数据

可以用in来实现
$sql="select * from article where id in (1,3,5)"

3、使用concat连接查询的结果

$sql="select concat(id,"-",con) as res from article where id=1"
返回"1-article content"

4、使用locate

用法:select locate("hello","hello baby"); 存在返回1,不存在返回0

5、使用group by

以前一直没怎么搞明group by 和 order by,其实也满简单的,group by 是把相同的结果编为一组,比如:$sql="select city, count(*) from customer group by city";
这句话的意思就是从customer表里列出所有不重复的城市,及其数量(有点类似distinct)
group by 经常与 AVG(),MIN(),MAX(),SUM(),COUNT() 一起使用

6、使用having

having 允许有条件地聚合数据为组
$sql="select city,count(*),min(birth_day) from customer group by city having count(*)>10";
这句话是先按city归组,然后找出city地数量大于10的城市
btw:使用group by + having 速度有点慢
同时having子句包含的表达式必须在之前出现过

7、组合子句

where、group by、having、order by(如果这四个都要使用的话,一般按这个顺序排列)

8、使用distinct

distinct是去掉重复值用的
$sql="select distinct(city) from customer order by id desc";
这句话的意思就是从customer表中查询所有的不重复的city

9、使用limit

如果要显示某条记录之后的所有记录
$sql="select * from article limit 100,-1";

10、多表查询

$sql="select user_name from user u, member m
where u.id=m.id and
m.reg_date>=2006-12-28
order by u.id desc;"
注意:如果user和member两个表同时有user_name字段,会出现mysql错误(因为mysql不知道你到底要查询哪个表里的user_name),必须指明是哪个表的。

MySQL的limit查询优化

通过具体的案例来说明,这里是对同一张表在不同的地方取10条数据:

(1)offset比较小的时候

select * from user limit 10,10;
这条SQL语句多次运行,时间保持在0.0004-0.0005之间。

select * From user Where uid >=( select uid From user Order By uid limit 10,1 ) limit 10;
这条SQL语句多次运行,时间保持在0.0005-0.0006之间,主要是0.0006。

结论:偏移offset较小的时候,直接使用limit较优。这个显然是子查询的原因。

(2)offset大的时候

select * from user limit 10000,10;
这条SQL语句多次运行,时间保持在0.0187左右

select * From user Where uid >=( select uid From user Order By uid limit 10000,1 ) limit 10;
这条SQL语句多次运行,时间保持在0.0061左右,只有前者的1/3。可以预计offset越大,后者越优。

总结:使用limit语句时,当数据量偏移量较小的时候可以直接使用limit,当数据量偏移量较大的时候,我们可以适当的使用子查询来做相关的性能优化。

====

一些MySQL语句:

mysql> show variables like '%skip_networking%';

mysql> show variables like 'collation_%';

mysql> show variables like 'char_%';

use db_name;
status; #查看某个数据库的编码

show create database db_name; #查看某个数据库的编码
show [global] status;

show variables;

show engines;

show grants; #查看权限分配情况

show columns from db_name.tb_name; <=> desc db_name.tb_name
show create table db_name.tb_name\G #注意最后用的是"\G"而不是";"

在MySQL中需要删除表中特定的记录,可用 WHERE 子句来选择所要删除的记录。这类似于 SELECT 语句中的 WHERE 子句。

mysql> delete from pet where name="Whistler";

可以用下面的语句清空整个表:

mysql> delete from pet;

truncate命令的语法结构为:

TRUNCATE [TABLE] tbl_name;

这里简单的给出个示例,我想删除 friends 表中所有的记录,可以使用如下语句:

truncate table friends;

truncate 和 delete的效率问题:

如果想要删除表的所有数据,truncate语句要比 delete 语句快。因为 truncate 删除了表,然后根据表结构重新建立它,而 delete 删除的是记录,并没有尝试去修改表。这也是为什么当向一个使用 delete 清空的表插入数据时,MySQL 会记住前面产生的AUTOINCREMENT序列,并且继续利用它对AUTOINCREMENT字段编号。而truncate删除表后,表是从1开始为autoincrement字段编号。不过truncate命令快是快,却不像delete命令那样对事务处理是安全的。

====

show variables like "plugin%"; #查看插件库路径

select @@basedir;
/*
system_user() 系统用户名
user() 用户名
current_user 当前用户名
session_user()连接数据库的用户名
database() 数据库名
version() MYSQL数据库版本
load_file() MYSQL读取本地文件的函数
@@datadir 读取数据库路径
@@basedir MYSQL 安装路径
@@version_compile_os 操作系统
*/

select Host,User,Password from mysql.user;

select * from mysql.func;
参考链接:

=END=

, ,

《 “MySQL数据库的基本操作-学习” 》 有 7 条评论

  1. MySql 日常指导,及大表优化思路
    https://juejin.im/post/5b7d52afe51d453885030b91
    `
    除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑、部署、运维的各种复杂度,一般以整型值为主的表在千万级以下,字符串为主的表在五百万以下是没有太大问题的。
    而事实上很多时候 MySQL 单表的性能依然有不少优化空间,甚至能正常支撑千万级以上的数据量。

    单表优化
    字段
    索引
    查询SQL
    引擎
      MyISAM
      InnoDB
    系统调优参数
    升级硬件
    读写分离
    缓存
    表分区
      分区的好处是:
      分区的限制和缺点:
      分区的类型:
      分区适合的场景有:
    垂直拆分
      垂直拆分的优点是:
      缺点是:
    水平拆分
      水平拆分的优点是:
      缺点是:
      分片原则
    解决方案
      客户端架构
        客户端架构的优点是:
        缺点是:
      代理架构
        代理架构的优点是:
        缺点是:
      各方案比较
    兼容 MySQL 且可水平扩展的数据库
    NoSQL
    `

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注