Linux技术--mysql数据库基础操作
# 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数据库基础操作相关推荐
- linux下mysql数据库基础及客户端命令详解
linux下mysql数据库基础及客户端命令详解 1.mysql数据库存储引擎: SHOW ENGINES; #查看mysql支持的存储引擎 常见有如下两个存储引擎: MyISAM:每表三个文件: ...
- MySQL数据库基础操作
DDL:数据库表的操作语句,如:create.drop. DML:数据操作语句. -DQL:数据查询语句. DCL:数据控制语句,事务和权限相关的语句. DBA:数据库管理员. 一.数据库基础操作语句 ...
- MySQL数据库基础操作初步
文章目录 MySQL 数据库 〇.安装与配置 一.库管理 二.数据表设计 1.表结构设计思路 2.数据类型 ①.数字类型: ②.字符类型: ③.枚举类型 ④.日期时间类型 三.数据表管理 1.创建表并 ...
- Linux技术--mysql数据库增-删-改-查
# mysql 数据库 ## 数据库的操作 ### 五个单位 * 数据库服务器 Linux或者 windows * 数据库 * 数据表 * 数据字段 * 数据行 ### 连接数据库 ``` 1 ...
- Linux下MySql数据库常用操作
1.显示数据库 show databases; 2.选择数据库 use 数据库名; 3.显示数据库中的表 show tables; 4.显示数据表的结构 describe 表名; 5.显示表中记录 S ...
- 边记边学PHP-(十五)MySQL数据库基础操作2
四.使用可视化工具创建数据库 尽管使用命令行感觉更像我们程序猿,可是我还是比較喜欢使用workbench来创建数据库. 首先打开workbench , 一个比較友好的界面就打开了,哈哈.我还是比較喜欢 ...
- MySQL数据库基础操作(一)
基础操作命令 show databases; 显示当前用户下所有的数据库 drop databases test; 删除指定的数据库 create databases test; 创建数据库 use ...
- 测试工程师mysql数据库基础操作之DQL 数据查询篇
文章目录 基本使用 where 语句 普通比较运算符 between ... and ...,匹配指定范围 like,模糊匹配 is null,匹配空值 特殊比较运算符 逻辑运算符 单行函数 数字函数 ...
- Linux下Mysql数据库的基础操作
Linux下Mysql数据库的基础操作 一.Mysql数据介绍 二.数据库相关术语介绍 1.数据库相关名词 2.相关术语介绍 三.Mysql数据库的管理 1.创建数据库用户 2.查询用户状态 3.修改 ...
最新文章
- express运行原理
- jdbc 日期时间相关的类型
- AWS — 重塑混合云
- qt 串口发送char 数组乱码_串口的波特相差多大会误码
- css按钮居中_你不一定知道的CSS最小和最大(宽度/高度)知识点及优缺点
- mysql route mycat_mycat
- 服务器压力测试系列二:服务器监控工具tsar安装
- linux如何手动释放内存吗,Linux如何手动清理内存中cache信息
- java原生开发项目-快递e栈
- C++中STL容器利用迭代器删除元素小结
- Anki 批量编辑替换插件
- twitteR Unauthorized
- u盘中毒如何删除system volume information文件
- Maven:解决IDEA无法下载源码
- matlab 方差计算
- 孤尽31天-day02
- 关于CV_8U和CV_32F
- 计算面积的计算机软件,CAD计算面积的快捷键是什么?
- 在OpenCV里车牌识别的方法2
- 计算机安全权限不足或配置文件损坏,配置文件加载失败 - Windows Server | Microsoft Docs...
热门文章
- Android使用Fragment打造万能页面切换框架
- Google Earth Engine(GEE)——Landsat ETM+ to OLI 协调
- 旭日x3派个人配置总结(ubuntu server + xrdp)
- 投资人Tej Kohli将“风险慈善”理念注入3D打印仿生手臂
- QT:布局管理器消息盒子对话框
- Oracle sqlplus的set命令详细使用和设置
- Web Api 调用时出现405错误解决方案
- JAVA调用Excel公式和js判断选择计算有效集合
- 手指滑动控制系统全局音量的程序(中)
- Ubuntu换源操作+vim的下载