# mysql

* 查询    多表联合查询  
* 更新  
* 删除   
* DCL  
* mysql 高级应用   
* 优化

## 查询

```
1.select * from 表名;
2.select id,username from 表名;
3.select id,usdername from 表名 where id>5 and id<8;
4.select id,username from 表名 order by age desc,id asc;
5.select id,username from 表名 order by age desc,id asc limit 5;
```

### 查询 - 结果集 区间选择  limit 3,3 从下标为3的位置开始取3条

```
分页   
第一页 从 0 开始 取 3条  
第二页 从 3 开始 取 3条 
第三页 从 6 开始 取 3条

SELECT id,username FROM money limit 6,3;
1 0 3
2 3 3
3 6 3
```

### 统计函数

| 函数  | 说明                                     |
| ----- | ---------------------------------------- |
| sum   | 求和  select SUM(balance) from money;    |
| count | 统计总数 select COUNT(id) from money;    |
| max   | 求最大值 SELECT MAX(age) from money;     |
| min   | 求最小值 SELECT MIN(balance) from money; |
| avg   | 求平均值 SELECT AVG(balance) from money; |
|       |                                          |

> https://blog.csdn.net/u011409644/article/details/73611102

### 分组统计

```
mysql> select * from money group by province;  #每个省份 出来 一个  
+----+--------------+----------+-----------+-----+-----+
| id | username     | balance  | province  | age | sex |
+----+--------------+----------+-----------+-----+-----+
|  8 | 魏缨络       |  7777.13 | 上海      |  29 |   1 |
|  3 | 王思聪       | 99999.99 | 北京      |  30 |   0 |
|  6 | 范冰冰       | 77777.31 | 山东      |  40 |   1 |
|  4 | 刘强东       | 99999.66 | 江苏      |  40 |   0 |
|  5 | 抹茶妹妹     | 77777.66 | 浙江      |  30 |   1 |
|  1 | 泽林兄       | 88888.12 | 辽宁      |  19 |   0 |
|  2 | 秋林兄       | 66666.45 | 黑龙江    |  18 |   0 |
+----+--------------+----------+-----------+-----+-----+
7 rows in set (0.00 sec)

mysql> select * from money group by province with rollup;  了解  
+----+--------------+----------+-----------+-----+-----+
| id | username     | balance  | province  | age | sex |
+----+--------------+----------+-----------+-----+-----+
|  8 | 魏缨络       |  7777.13 | 上海      |  29 |   1 |
|  3 | 王思聪       | 99999.99 | 北京      |  30 |   0 |
|  6 | 范冰冰       | 77777.31 | 山东      |  40 |   1 |
|  4 | 刘强东       | 99999.66 | 江苏      |  40 |   0 |
|  5 | 抹茶妹妹     | 77777.66 | 浙江      |  30 |   1 |
|  1 | 泽林兄       | 88888.12 | 辽宁      |  19 |   0 |
|  2 | 秋林兄       | 66666.45 | 黑龙江    |  18 |   0 |
|  2 | 秋林兄       | 66666.45 | NULL      |  18 |   0 |
+----+--------------+----------+-----------+-----+-----+
8 rows in set (0.00 sec)
在上面一条sql语句的基础上 统计总数 多了一行

mysql> select count(province),province from money group by province;#统计省份数量以后然后进行分组显示  
+-----------------+-----------+
| count(province) | province  |
+-----------------+-----------+
|               2 | 上海      |
|               2 | 北京      |
|               2 | 山东      |
|               1 | 江苏      |
|               2 | 浙江      |
|               1 | 辽宁      |
|               1 | 黑龙江    |
+-----------------+-----------+
7 rows in set (0.00 sec)

在分组的基础上统计

mysql> select count(province),province from money group by province with rollup; #了解  
+-----------------+-----------+
| count(province) | province  |
+-----------------+-----------+
|               2 | 上海      |
|               2 | 北京      |
|               2 | 山东      |
|               1 | 江苏      |
|               2 | 浙江      |
|               1 | 辽宁      |
|               1 | 黑龙江    |
|              11 | NULL      |
+-----------------+-----------+
8 rows in set (0.00 sec)

11 是对上面结果的统计

```

### 对统计结果再过滤

```
mysql> select count(province) as result,province from money group by province having result>1;
+--------+----------+
| result | province |
+--------+----------+
|      2 | 上海     |
|      2 | 北京     |
|      2 | 山东     |
|      2 | 浙江     |
+--------+----------+
4 rows in set (0.00 sec)

mysql> select count(province) as result,province from money group by province having result=1;
+--------+-----------+
| result | province  |
+--------+-----------+
|      1 | 江苏      |
|      1 | 辽宁      |
|      1 | 黑龙江    |
+--------+-----------+
3 rows in set (0.00 sec)

```

### sql 语句整体使用总结

```
select 
[字段1 as 别名,统计函数()],[字段2]
from 表名 
where 条件  
group by 分组  
having 过滤条件 
order by 字段  
limit 数量 或者 区间

mysql> select id,username as 用户名,province as 省 from money where id>1 and balance >8888 group by province order by id desc limit 3;
+----+--------------+--------+
| id | 用户名       | 省     |
+----+--------------+--------+
|  9 | 薛之谦       | 上海   |
|  6 | 范冰冰       | 山东   |
|  5 | 抹茶妹妹     | 浙江   |
+----+--------------+--------+
3 rows in set (0.00 sec)

```

### 重点  多表联合查询

* 内连接 
* 外连接 
* 子查询

```
mysql> create table if not exists user(id int(11) unsigned not null primary key auto_increment,username varchar(64) not null,paissword char(64) not null)engine=myisam default charset=utf8;
Query OK, 0 rows affected (0.00 sec)

mysql> create table if not exists order_goods(oid int(11) unsigned not null primary key auto_increment,uid int(11) not null,goodsname varchar(64) not null,buytime timestamp)engine=innodb default charset=utf8;
Query OK, 0 rows affected (0.13 sec)

```

#### 内连接

```mysql
第一种写法:
SELECT 
    u.username as 用户名,
    u.id,o.uid,
    o.goodsname as 商品名称 
FROM 
    user u,
    order_goods o 
where 
    u.id=o.uid;

+--------------+----+-----+-----------------+
| 用户名       | id | uid | 商品名称        |
+--------------+----+-----+-----------------+
| 刘强东       |  1 |   1 | 抹茶            |
| 抹茶妹妹     |  2 |   2 | 帽子            |
| 云翔兄       |  3 |   3 | 小肚肚          |
| 李晨         |  6 |   6 | 苹果三件套      |
| 岳云鹏       |  9 |   9 | 锤子手机        |
| 张继科       |  8 |   8 | 娃娃            |
+--------------+----+-----+-----------------+
6 rows in set (0.00 sec)

第二种写法   inner join  on

select 表1.字段[as 别名],表n.字段 from 表1 inner join 表n on 条件;

mysql> select user.id as 用户id,user.username as 用户名,order_goods.goodsname as 商品名称 from user inner join order_goods on user.id=order_goods.uid;
+----------+--------------+-----------------+
| 用户id   | 用户名       | 商品名称        |
+----------+--------------+-----------------+
|        1 | 刘强东       | 抹茶            |
|        2 | 抹茶妹妹     | 帽子            |
|        3 | 云翔兄       | 小肚肚          |
|        6 | 李晨         | 苹果三件套      |
|        9 | 岳云鹏       | 锤子手机        |
|        8 | 张继科       | 娃娃            |
+----------+--------------+-----------------+
6 rows in set (0.00 sec)

```

#### 外连接

* 左连接  左边表为准  
* 右连接

```
select 表1.字段[as 别名],表n.字段 from 表1 left join 表n on 条件;
mysql> select user.username as 用户名,order_goods.goodsname as 商品名称 from user left join order_goods on user.id=order_goods.uuid;
+--------------+-----------------+
| 用户名       | 商品名称        |
+--------------+-----------------+
| 刘强东       | 抹茶            |
| 抹茶妹妹     | 帽子            |
| 云翔兄       | 小肚肚          |   因为 以左边表为准  会把用户所有信息查出来  买的和没有买的 全显示
| 李晨         | 苹果三件套      |
| 岳云鹏       | 锤子手机        |
| 张继科       | 娃娃            |
| 范冰冰       | NULL            |
| 景甜         | NULL            |
| 周立泼       | NULL            |
+--------------+-----------------+
9 rows in set (0.00 sec)

select 表1.字段[as 别名],表n.字段 from 表1 right join 表n on 条件;
mysql> select user.username as 用户名,order_goods.goodsname as 商品名称 from user right join order_goods on user.id=order_goods..uid;
+--------------+-----------------+
| 用户名       | 商品名称        |
+--------------+-----------------+
| 刘强东       | 抹茶            |
| 抹茶妹妹     | 帽子            |  以右边 表为准  显示订单信息   
| 云翔兄       | 小肚肚          |
| 李晨         | 苹果三件套      |
| 岳云鹏       | 锤子手机        |
| 张继科       | 娃娃            |
+--------------+-----------------+
6 rows in set (0.00 sec)

```

#### 子查询  in

```
mysql> select uid from order_goods;  //看看 谁买了东西 
+-----+
| uid |
+-----+
|   1 |
|   2 |
|   3 |
|   6 |
|   9 |
|   8 |
+-----+
6 rows in set (0.00 sec)

mysql> select * from user where id in(1,2,3,6,9,8); 然后 带着上面的结果 查看 详细信息  
+----+--------------+----------+
| id | username     | password |
+----+--------------+----------+
|  1 | 刘强东       | 123321   |
|  2 | 抹茶妹妹     | 123123   |
|  3 | 云翔兄       | 1234331  |
|  6 | 李晨         | 123432   |
|  8 | 张继科       | 122222   |
|  9 | 岳云鹏       | 12222    |
+----+--------------+----------+
6 rows in set (0.00 sec)

上面的整合  : 
mysql> select username as '用户名' from user where id in(select uid from order_goods);
+--------------+
| 用户名       |
+--------------+
| 刘强东       |
| 抹茶妹妹     |
| 云翔兄       |
| 李晨         |
| 岳云鹏       |
| 张继科       |
+--------------+
6 rows in set (0.00 sec)

```

#### 联合查询  将结果合并在一起显示

union

union all

```
mysql> select id from user union select uid from order_goods;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  6 |
|  7 |
|  8 |
|  9 |
| 10 |
+----+
9 rows in set (0.00 sec)

mysql> select id from user union all select uid from order_goods;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  6 |
|  7 |
|  8 |
|  9 |
| 10 |
|  1 |
|  2 |
|  3 |
|  6 |
|  9 |
|  8 |
+----+
15 rows in set (0.00 sec)

综上  union 将  union all 中的结果 去除重复记录

```

## 数据更新    update

```
update 表名 set 字段1=值1,字段2=值2,字段3=值3 where 条件;

update money set balance=100,sex=1 where id>2 and id<5;
update money set balance=balance-100  where id>2 and id<5;
```

#### 两个表的记录同时更新

```
mysql> update money m,user u set m.balance=m.balance*u.age where m.id=u.id;
Query OK, 9 rows affected (0.00 sec)
Rows matched: 9  Changed: 9  Warnings: 0

```

### 删除记录 delete

```
delete from 表名 where 条件;

mysql> delete from test;  不加where 条件表示 清空所有数据库  
Query OK, 1 row affected (0.00 sec)

注意: delete from 表名  清空的时候 再插入数据 id从原来的 往后累加

mysql> delete from money where username='王思聪' or id=10;
Query OK, 2 rows affected (0.17 sec)

truncate table 表名;
清空表内容   下一次插入 id 还是从1 开始   
```

## DCL语句

#### 创建数据库用户

```
grant all on *.* to root@'%' identified by '你的数据库密码' with grant option;
授权 可以远程  用 root 连接到 数据库服务器

all 代表的是权限   update select insert delete  all  
*.*  第一个 * 代表所有的数据库   第二个* 代表所有的表  
root 代表用户

% 代表所有的  ip地址   
identified by  跟 密码

flush privileges;

mysql> grant select,insert on python1806.money to 'zelinx'@'localhost' identified by '123321';
Query OK, 0 rows affected, 1 warning (0.07 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

移除权限  --------------------------------------------------

revoke 权限 on 数据库.数据表 from 用户@'主机地址'

mysql> revoke insert on python1806.money from 'zelinx'@'localhost';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

```

## mysql 主从

> 如何减轻 数据的压力   方案  读写分离   实线方案:主从复制

| IP地址       | 角色            |
| ------------ | --------------- |
| 10.11.53.95  | master  主   写 |
| 10.11.53.172 | slave    从  读 |

> 准备工作  都安装好mysql 
>
> 关闭防火墙  sudo ufw disable

1.到主服务器上进行配置

```
 sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf 
 
 85 server-id               = 95  #IP地址的最后一位
 86 log_bin                 = /var/log/mysql/mysql-bin.log #binlog日志的存放路径 
 87 expire_logs_days        = 10
 88 max_binlog_size   = 100M
 89 binlog_do_db            = kangbazi #同步的数据库  名称   
 90 binlog_ignore_db        = mysql  #忽略的数据库名称   
 
 mysql 是每个数据库 特有的  好比身份证号  不能进行同步

```

2.到从服务器上进行配置

```
 84 server-id               = 172 #ip地址最后一位  
 85 #log_bin                        = /var/log/mysql/mysql-bin.log 
 86 expire_logs_days        = 10
 87 max_binlog_size   = 100M
 90 replicate_do_db         = kangbazi #同步的数据库
 91 replicate_ignore_db     = mysql #忽略的数据库

```

3.主从创建一模一样的数据库 及表结构

```
mysql> create database kangbazi;

mysql> show databases;

mysql> use kangbazi;

mysql> create table if not exists user(id int(11) unsigned not null primary key auto_increment,username varchar(64) not null)engine=innodb default charset=utf8;

```

4.到主数据库上 设置一个专门用来同步权限的账户

```
mysql> create user 'user'@'X.X.X.X' identified by 'password';

mysql> grant replication slave on *.* to 'qulinx'@'%' identified by '654321';

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |     1176 | kangbazi     | mysql            |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

先不要关闭窗口  先不要重启 mysql  
```

5.到从服务器上进行配置

```
? change master to

mysql> change master to
    -> MASTER_HOST='10.11.53.95',
    -> MASTER_USER='qulinx',
    -> MASTER_PASSWORD='654321',
    -> MASTER_PORT=3306,
    -> MASTER_LOG_FILE='mysql-bin.000001',
    -> MASTER_LOG_POS=1176,
    -> MASTER_CONNECT_RETRY=10;

开启从服务器
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

查看从服务器的状态
mysql> show slave status\G

Slave_IO_Running: Yes
 Slave_SQL_Running: Yes

看到 说明成功  
```

## 表结构  表数据的复制

```
mysql> create table t1 like user;  #复制表结构  
mysql> insert into t1 select * from user; #复制内容 
```

## mysql 视图

```
select * from t1 where id>2 and id <10; #经常查询这个范围的 内容
每次这么查询 很耗资源  
解决方案  把这个区间的内容  放到临时表中 下一次直接来这个表中 拿

? view 
mysql> create view v_t1 as select * from t1 where id>2 and id<10;

mysql> show tables;
+-----------------+
| Tables_in_day17 |
+-----------------+
| t1              |    |
| v_t1            |  多了一个临时表  
+-----------------+
6 rows in set (0.00 sec)

mysql> select * from v_t1;

因为 v_t1 是依托于 t1 表存在  删除t1表  临时表 v_t1 也不能用

恢复表t1  v_t1 也恢复

drop view v_t1;
mysql> show create view v_t1\G 显示查看的过程 
```

## mysql 内置函数

```
字符串函数   
mysql> select concat("kangbazi","1806") as 名字;
+--------------+
| 名字         |
+--------------+
| kangbazi1806 |
+--------------+

mysql> select ucase('mysql');
mysql> select lcase('MYSQL');
select length("我很怕你啊"); 一个汉字占三个 
mysql> select ltrim(" 为什么啊");#去除左侧空格
mysql> select rtrim("   因为我怕老婆啊        ");去除右侧空格
mysql> select repeat('linux',3);
+-------------------+
| repeat('linux',3) |
+-------------------+
| linuxlinuxlinux   |
+-------------------+
mysql> select replace("java是世界上最好的语言","java","python");
将java 替换成 Python

mysql> select substr("python is so coole",2,4); 从下标为2开始截取4个    
#mysql 下标从1开始   
mysql> select concat(space(20),"kangbazi");

数学函数  
mysql> select bin(10); 将10转成2进制 
select ceiling(10.1);#11
select floor(10.1)#10
mysql> select rand(); 随机数

日期函数

mysql> select now(); 当前时间  
select week(now());#返回当前时间是第几周   35
select year(now()); #2018
mysql> select datediff("2018-9-5","2019-10-5"); 计算两个日期之间的差额 
```

## 预处理 防sql注入 用到 预处理

```
select * from money where id>2;
select * from money where id>10;
select * from money where id>?;

mysql> prepare yuchuli from "select * from t1 where id>?";
mysql> set @a=2;
mysql> execute yuchuli using @a;

以上就是相当于 执行 select * from t1 where id>2; 
```

## mysql 存储

> 在开发过程中 经常需要批量往数据库中插入记录 
>
> 存储就好比是  存储代码段  也就是函数  实线批量插入

```
\d  //  #更改结束符  以 //结束

mysql> create procedure inserts() begin set @i=1; while  @i<=1000 do insert into t3(name) values(concat('user',@i)); set @i=@i+1; end while; end//

\d ; #改回;结束符

类似于函数  不调用不执行

show procedure status;

mysql> show create procedure inserts\G  显示存储创建过程

call inserts; #调用存储过程  
```

Linux技术--mysql数据库基础操作相关推荐

  1. linux下mysql数据库基础及客户端命令详解

    linux下mysql数据库基础及客户端命令详解 1.mysql数据库存储引擎: SHOW ENGINES;   #查看mysql支持的存储引擎 常见有如下两个存储引擎: MyISAM:每表三个文件: ...

  2. MySQL数据库基础操作

    DDL:数据库表的操作语句,如:create.drop. DML:数据操作语句. -DQL:数据查询语句. DCL:数据控制语句,事务和权限相关的语句. DBA:数据库管理员. 一.数据库基础操作语句 ...

  3. MySQL数据库基础操作初步

    文章目录 MySQL 数据库 〇.安装与配置 一.库管理 二.数据表设计 1.表结构设计思路 2.数据类型 ①.数字类型: ②.字符类型: ③.枚举类型 ④.日期时间类型 三.数据表管理 1.创建表并 ...

  4. Linux技术--mysql数据库增-删-改-查

    # mysql 数据库 ## 数据库的操作 ### 五个单位 * 数据库服务器   Linux或者 windows  * 数据库  * 数据表 * 数据字段 * 数据行 ### 连接数据库 ``` 1 ...

  5. Linux下MySql数据库常用操作

    1.显示数据库 show databases; 2.选择数据库 use 数据库名; 3.显示数据库中的表 show tables; 4.显示数据表的结构 describe 表名; 5.显示表中记录 S ...

  6. 边记边学PHP-(十五)MySQL数据库基础操作2

    四.使用可视化工具创建数据库 尽管使用命令行感觉更像我们程序猿,可是我还是比較喜欢使用workbench来创建数据库. 首先打开workbench , 一个比較友好的界面就打开了,哈哈.我还是比較喜欢 ...

  7. MySQL数据库基础操作(一)

    基础操作命令 show databases; 显示当前用户下所有的数据库 drop databases test; 删除指定的数据库 create databases test; 创建数据库 use ...

  8. 测试工程师mysql数据库基础操作之DQL 数据查询篇

    文章目录 基本使用 where 语句 普通比较运算符 between ... and ...,匹配指定范围 like,模糊匹配 is null,匹配空值 特殊比较运算符 逻辑运算符 单行函数 数字函数 ...

  9. Linux下Mysql数据库的基础操作

    Linux下Mysql数据库的基础操作 一.Mysql数据介绍 二.数据库相关术语介绍 1.数据库相关名词 2.相关术语介绍 三.Mysql数据库的管理 1.创建数据库用户 2.查询用户状态 3.修改 ...

最新文章

  1. express运行原理
  2. jdbc 日期时间相关的类型
  3. AWS — 重塑混合云
  4. qt 串口发送char 数组乱码_串口的波特相差多大会误码
  5. css按钮居中_你不一定知道的CSS最小和最大(宽度/高度)知识点及优缺点
  6. mysql route mycat_mycat
  7. 服务器压力测试系列二:服务器监控工具tsar安装
  8. linux如何手动释放内存吗,Linux如何手动清理内存中cache信息
  9. java原生开发项目-快递e栈
  10. C++中STL容器利用迭代器删除元素小结
  11. Anki 批量编辑替换插件
  12. twitteR Unauthorized
  13. u盘中毒如何删除system volume information文件
  14. Maven:解决IDEA无法下载源码
  15. matlab 方差计算
  16. 孤尽31天-day02
  17. 关于CV_8U和CV_32F
  18. 计算面积的计算机软件,CAD计算面积的快捷键是什么?
  19. 在OpenCV里车牌识别的方法2
  20. 计算机安全权限不足或配置文件损坏,配置文件加载失败 - Windows Server | Microsoft Docs...

热门文章

  1. Android使用Fragment打造万能页面切换框架
  2. Google Earth Engine(GEE)——Landsat ETM+ to OLI 协调
  3. 旭日x3派个人配置总结(ubuntu server + xrdp)
  4. 投资人Tej Kohli将“风险慈善”理念注入3D打印仿生手臂
  5. QT:布局管理器消息盒子对话框
  6. Oracle sqlplus的set命令详细使用和设置
  7. Web Api 调用时出现405错误解决方案
  8. JAVA调用Excel公式和js判断选择计算有效集合
  9. 手指滑动控制系统全局音量的程序(中)
  10. Ubuntu换源操作+vim的下载