Mysql Day Five

数据的高级操作

  1.主键冲突

    在数据插入的时候,假设主键对应的值已经存在,插入会失败

-- 解决方式1:当主键冲突时进行更新操作
-- insert into 表名 values (值列表) on duplicate key update 字段=值;
desc m_primary;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| name   | varchar(10) | NO   | PRI | NULL    |       |
| number | int(11)     | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
select * from m_primary;
+-------+--------+
| name  | number |
+-------+--------+
| name1 |      1 |
| name2 |      2 |
+-------+--------+

insert into m_primary values ("name1",3);
ERROR 1062 (23000): Duplicate entry 'name1' for key 'PRIMARY'
insert into m_primary values ("name1",3)
on duplicate key
update number=3;

select * from m_primary;
+-------+--------+
| name  | number |
+-------+--------+
| name1 |      3 |
| name2 |      2 |
+-------+--------+
2 rows in set (0.00 sec)

-- 解决方式2:当主键冲突时进行替换操作
-- replace into 表名 values (值列表)
replace into m_privary values("name1",1);
select * from m_primary;
+-------+--------+
| name  | number |
+-------+--------+
| name1 |      1 |
| name2 |      2 |
+-------+--------+

  2.蠕虫复制

-- 从已有表复制表结构
-- create table 表名 like 数据库.表名  (只复制表结构不复制表数据)
desc m_primary;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| name   | varchar(10) | NO   | PRI | NULL    |       |
| number | int(11)     | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
 select * from m_primary;
+-------+--------+
| name  | number |
+-------+--------+
| name1 |      1 |
| name2 |      2 |
+-------+--------+

create table m_copy like test.m_primary;
desc m_copy;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| name   | varchar(10) | NO   | PRI | NULL    |       |
| number | int(11)     | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+

select * from m_copy;
Empty set (0.00 sec)

-- 数据复制
-- insert into 表名 select 字段名 from 数据表;
insert into m_copy select * from m_primary;
select * from m_copy;
+-------+--------+
| name  | number |
+-------+--------+
| name1 |      1 |
| name2 |      2 |
+-------+--------+

  3.更新数据

-- 基本语法:update 表名  set 字段 = 值;
-- 限制更新:update 表名  set 字段 = 值 where 字段=值 limit 数值;

  4.删除数据

-- 清空表,重置自增长
-- truncate table;
select * from m_copy1;
+----+-------+
| id | name  |
+----+-------+
|  1 | name1 |
+----+-------+
show create table m_copy1;
------+
| Table   | Create Table                                                                                                                                        ----------------------------------------+
| m_copy1 | CREATE TABLE `m_copy1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` char(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 |
+---------------------------------------+

truncate m_copy1;

show create table m_copy1;
+-----------------------------+
| Table   | Create Table                                                                                                                                               |
+---------+-------------------+
| m_copy1 | CREATE TABLE `m_copy1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` char(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-----------------------------+

  5.查询数据

-- 查询完整语句
-- select [select 选项] 字段列表[字段别名] /* from 数据源 [where 条件子句 ][group by 子句] [having 子句] [order by 子句] [limit 子句]
-- select选项:对查到的数据结果进行处理方式
--            all :保留所有结果
--            distinct :去重,将重复的数据从结果中去掉
-- 字段别名: 字段名 as 别名
select * from m_copy1;
+----+-------+
| id | name  |
+----+-------+
|  2 | name2 |
|  3 | name3 |
|  4 | name4 |
+----+-------+

select distinct id,name as n from m_copy1 ;
+----+-------+
| id | n     |
+----+-------+
|  2 | name2 |
|  3 | name3 |
|  4 | name4 |
+----+-------+

-- 数据源
-- 单表数据源:select * from 表名;
-- 多表数据源:select * from 表名1,表名2;(交叉连接)
-- 子查询语句:select * from (select * from 表名 as 新表名)

-- 条件查询where 子句
-- 判断条件:运算符:<,>,>=,!=,like,between(是闭区间),and,in,not in  or  &&  ||  !=
-- where是唯一一个直接从磁盘取数据的时候就来时判断条件,从磁盘取出一条记录,判断为真则放入内存
select distinct * from m_copy1 where name="name2";
+----+-------+
| id | name  |
+----+-------+
|  2 | name2 |
+----+-------+

-- group by 分组:根据字段进行分组
-- group by 字段名;分组是为了统计 
-- count() :统计分组后每组记录  count(字段):不会统计字段中为空的地方
-- max(): 统计每组总最大数
-- min(): 统计每组中最小值
-- avg(): 统计平均值
-- sun(): 统计和
select sex,count(*),max(number),min(number),sum(number) from m_copy group by sex desc;
+-------+----------+-------------+-------------+-------------+
| sex   | count(*) | max(number) | min(number) | sum(number) |
+-------+----------+-------------+-------------+-------------+
| women |        2 |           2 |           1 |           3 |
| man   |        2 |           4 |           3 |           7 |
+-------+----------+-------------+-------------+-------------+

-- 多字段分组
select * from m_copy order by class;
+------+-------+-------+-------+
| id   | name  | sex   | class |
+------+-------+-------+-------+
|    5 | name5 | women |     1 |
|    6 | name6 | women |     1 |
|   13 | name5 | man   |     1 |
|   14 | name6 | man   |     1 |
|    3 | name3 | women |     2 |
|    4 | name4 | man   |     2 |
|   11 | name3 | women |     2 |
|   12 | name4 | man   |     2 |
|    7 | name7 | women |     3 |
|    8 | name8 | women |     3 |
|   15 | name7 | man   |     3 |
|   16 | name8 | man   |     3 |
|    1 | name1 | women |     4 |
|    2 | name2 | man   |     4 |
|    9 | name1 | man   |     4 |
|   10 | name2 | man   |     4 |
+------+-------+-------+-------+
select class,sex,count(*) from m_copy group by class,sex;
+-------+-------+----------+
| class | sex   | count(*) |
+-------+-------+----------+
|     4 | women |        1 |
|     4 | man   |        3 |
|     2 | women |        2 |
|     2 | man   |        2 |
|     1 | women |        2 |
|     3 | women |        2 |
|     1 | man   |        2 |
|     3 | man   |        2 |
+-------+-------+----------+
select class,sex,count(*),group_concat(name,id) from m_copy group by class,sex;
+-------+-------+----------+-----------------------+
| class | sex   | count(*) | group_concat(name,id) |
+-------+-------+----------+-----------------------+
|     1 | man   |        2 | name513,name614       |
|     1 | women |        2 | name55,name66         |
|     2 | man   |        2 | name44,name412        |
|     2 | women |        2 | name33,name311        |
|     3 | man   |        2 | name715,name816       |
|     3 | women |        2 | name77,name88         |
|     4 | man   |        3 | name22,name19,name210 |
|     4 | women |        1 | name11                |
+-------+-------+----------+-----------------------+

-- 回溯统计  with rollup
select class,sex,count(*) from m_copy group by class;
+-------+-------+----------+
| class | sex   | count(*) |
+-------+-------+----------+
|     4 | women |        4 |
|     2 | women |        4 |
|     1 | women |        4 |
|     3 | women |        4 |
+-------+-------+----------+
select class,sex,count(*) from m_copy group by class with rollup;
+-------+-------+----------+
| class | sex   | count(*) |
+-------+-------+----------+
|     1 | women |        4 |
|     2 | women |        4 |
|     3 | women |        4 |
|     4 | women |        4 |
|  NULL | women |       16 |
+-------+-------+----------+


--having 子句:与where子句一样,进行条件判断;分组之后的结果having子句进行处理
select class,sex,count(*) from m_copy group by class,sex having count(*)>2;
+-------+-------+----------+
| class | sex   | count(*) |
+-------+-------+----------+
|     4 | man   |        3 |
|     3 | women |        3 |
+-------+-------+----------+

-- order by 根据某个字段进行升序和降序排序
-- asc 升序  desc 降序
select * from m_copy order by class;
+------+-------+-------+-------+
| id   | name  | sex   | class |
+------+-------+-------+-------+
|    5 | name5 | women |     1 |
|    6 | name6 | women |     1 |
|   13 | name5 | man   |     1 |
|   14 | name6 | man   |     1 |
|    3 | name3 | women |     2 |
|    4 | name4 | man   |     2 |
|   11 | name3 | women |     2 |
|   12 | name4 | man   |     2 |
|    7 | name7 | women |     3 |
|    8 | name8 | women |     3 |
|   15 | name7 | man   |     3 |
|   16 | name8 | women |     3 |
|    1 | name1 | women |     4 |
|    2 | name2 | man   |     4 |
|    9 | name1 | man   |     4 |
|   10 | name2 | man   |     4 |
+------+-------+-------+-------+
select * from m_copy order by class,sex,id asc;
+------+-------+-------+-------+
| id   | name  | sex   | class |
+------+-------+-------+-------+
|   13 | name5 | man   |     1 |
|   14 | name6 | man   |     1 |
|    5 | name5 | women |     1 |
|    6 | name6 | women |     1 |
|    4 | name4 | man   |     2 |
|   12 | name4 | man   |     2 |
|    3 | name3 | women |     2 |
|   11 | name3 | women |     2 |
|   15 | name7 | man   |     3 |
|    7 | name7 | women |     3 |
|    8 | name8 | women |     3 |
|   16 | name8 | women |     3 |
|    2 | name2 | man   |     4 |
|    9 | name1 | man   |     4 |
|   10 | name2 | man   |     4 |
|    1 | name1 | women |     4 |
+------+-------+-------+-------+

-- limit 子句
-- limit 数据量
-- limit 起始位置,数据量(用于分页)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值