INSERT [INTO] 表名 [(字段名1,...)] {VALUES | VALUE} ({expr | DEFAULT},...),(...),...

  • 说明:主键列是自动增长,但是在全列插入时需要占位,通常使用空值(0或者null) ; 字段默认值 default 来占位,插入成功后以实际数据为准

  • 全列插入:值的顺序与表结构字段的顺序完全一一对应

    此时 字段名列表不用填写

insert into 表名 values (...)
例:
insert into students values(0,’郭靖‘,1,'蒙古','2016-1-2');
  • 部分列插入:值的顺序与给出的列顺序对应

    此时需要根据实际的数据的特点 填写对应字段列表

insert into 表名 (列1,...) values(值1,...)
例:
insert into students(name,hometown,birthday) values('黄蓉','桃花岛','2016-3-2');
  • 上面的语句一次可以向表中插入一行数据,还可以一次性插入多行数据,这样可以减少与数据库的通信

  • 全列多行插入

insert into 表名 values(...),(...)...;
例:
insert into classes values(0,'python1'),(0,'python2');
  • 部分列多行插入

    insert into 表名(列1,...) values(值1,...),(值1,...)...;
    例:
    insert into students(name) values('杨康'),('杨过'),('小龙女');

2 数据修改

UPDATE 表名 SET 字段1名={expr1|DEFAULT} [,col2={expr2|default}] [where 条件判断]

update 表名 set 列1=值1,列2=值2... where 条件
例:
update students set gender=0,hometown='北京' where id=5;

3 数据删除

DELETE FROM 表名 [where 条件判断]

delete from 表名 where 条件
例:
delete from students where id=5;

抛出问题: 上面的操作称之为物理删除,一旦删除就不容易恢复。那么删除操作有没有一个类似于回收站一样的功能,能够让用户选择清空或者恢复删除的功能呢?

* 其实删除文件进入回收站的本质只是在操作系统的帮助下对文件加上了 某个标记,资源管理器中对含有这种标记的文件不会显示。当从回收站恢复的时候只是移除了加上的标记而已。
  • 逻辑删除,本质就是修改操作

update students set isdelete=1 where id=1;

4 数据查询

4.1 创建数据库、数据表

-- 创建数据库
.
create database python_test_1 charset=utf8;

-- 使用数据库
use python_test_1;

-- students表
create table students(
  id int unsigned primary key auto_increment not null,
  name varchar(20) default '',
  age tinyint unsigned default 0,
  height decimal(5,2),
  gender enum('男','女','中性','保密') default '保密',
  cls_id int unsigned default 0,
  is_delete bit default 0
);

-- classes表
create table classes (
  id int unsigned auto_increment primary key not null,
  name varchar(30) not null
);

4.2 准备数据

-- 向students表中插入数据
insert into students values
(0,'小明',18,180.00,2,1,0),
(0,'小月月',18,180.00,2,2,1),
(0,'彭于晏',29,185.00,1,1,0),
(0,'刘德华',59,175.00,1,2,1),
(0,'黄蓉',38,160.00,2,1,0),
(0,'凤姐',28,150.00,4,2,1),
(0,'王祖贤',18,172.00,2,1,1),
(0,'周杰伦',36,NULL,1,1,0),
(0,'程坤',27,181.00,1,2,0),
(0,'刘亦菲',25,166.00,2,2,0),
(0,'金星',33,162.00,3,3,1),
(0,'静香',12,180.00,2,4,0),
(0,'郭靖',12,170.00,1,4,0),
(0,'周杰',34,176.00,2,5,0);

-- 向classes表中插入数据
insert into classes values (0, "python_01期"), (0, "python_02期");

4.3基本查询

  • 查询所有字段

select * from 表名;
例:
select * from students;
select * from classes;
  • 查询指定字段

select 列1,列2,... from 表名;
例:
select name,age from students;

4.4 as关键字

  • 使用 as 给字段起别名

select id as 序号, name as 名字, gender as 性别 from students;
  • 可以通过 as 给表起别名

-- 如果是单表查询 可以省略表明
select id, name, gender from students;

-- 表名.字段名
select students.id,students.name,students.gender from students;

-- 可以通过 as 给表起别名
select s.id,s.name,s.gender from students as s;

注意: 在这里给表起别名看起来并没有什么意义 然而并不是 我们在后期学习 自连接 的时候 就必须要对表起别名。

4.5 消除重复行

  • 在select后面列前使用distinct可以消除重复的行

select distinct 列1,... from 表名;
例: 查询班级中学生的性别
select gender from students;

-- 看到了很多重复的数据 想要对其中重复的数据行进行去重的操作就可以使用 distinct
select distinct gender from students;

4.6 条件

为什么需要条件

  • 在前面update的时候咱们是不是就发现update后面需要跟上一个where?这是为甚呢?主要就是因为当进行操作的时候 如果没有条件就意味着所有数据都需要完成操作,update更新的就是全部数据。 显然这不是咱们想看到的。

使用where子句对表中的数据筛选,结果为true的行会出现在结果集中

  • 条件查询语法如下:

select * from 表名 where 条件;
例:
select * from students where id=1;
  • where后面支持多种运算符,进行条件的处理

    • 比较运算符

    • 逻辑运算符

    • 模糊查询

    • 范围查询

    • 空判断

4.7 比较运算符

  • 等于: =

  • 大于: >

  • 大于等于: >=

  • 小于: <

  • 小于等于: <=

  • 不等于: != 或 <>

例1:查询编号大于3的学生

select * from students where id > 3;

例2:查询编号不大于4的学生

select * from students where id <= 4;

例3:查询姓名不是“黄蓉”的学生

select * from students where name != '黄蓉';

例4:查询没被删除的学生

select * from students where is_delete=0;

4.8 逻辑运算符

  • and

  • or

  • not

例5:查询编号大于3的女同学

select * from students where id > 3 and gender=0;

例6:查询编号小于4或没被删除的学生

select * from students where id < 4 or is_delete=0;

优先级由高到低的顺序为:小括号,not,比较运算符,逻辑运算符

and比or先运算,如果同时出现并希望先算or,需要结合()使用

4.9 模糊查询

  • like

  • %表示任意多个任意字符

  • _表示一个任意字符

例7:查询姓黄的学生

select * from students where name like '黄%';

例8:查询姓黄并且“名”是一个字的学生

select * from students where name like '黄_';

例9:查询姓黄或叫靖的学生

select * from students where name like '黄%' or name like '%靖';

4.10 范围查询

  • in表示在一个非连续的范围内

例10:查询编号是1或3或8的学生

select * from students where id in(1,3,8);
  • between ... and ...表示在一个连续的范围内

例11:查询编号为3至8的学生

select * from students where id between 3 and 8;

例12:查询编号是3至8的男生

select * from students where (id between 3 and 8) and gender=1;

注意: between A and B在匹配数据的时候匹配的范围空间是 [A,B]

4.11 空判断

  • 注意:null与''是不同的

  • 判空is null

例13:查询没有填写身高的学生

select * from students where height is null;
  • 判非空is not null

例14:查询填写了身高的学生

select * from students where height is not null;

例15:查询填写了身高的男生

select * from students where height is not null and gender=1;

4.12 排序的使用

生活中需要的排序 以大家搜索百度为例。用户在百度上搜索 MySQL的特点, 作为一个网站往往需要把和用户最为需要的网页和数据发送给客户, 那么如何才能认定这个数据是用户最需要的呢? 百度就会把用户搜索的关键字和数据库中已经存在的网页进行关联性的分析,将关联度高的网页准备发送给用户浏览,但是问题来了 有很多关联性几乎一致的网页到底应该给用户优先推送哪个网页呢, 谁在前面谁在后面呢? 答案就是排序。先将所有的数据的关联程度进行排序,然后将关联程度一样的数据 根据 比如用户的点击量等属性进行排序。

排序查询语法:select * from 表名 order by 列1 asc|desc [,列2 asc|desc,...]

语法说明

* 将行数据按照列1进行排序,如果某些行列1的值相同时,则按照列2排序,以此类推
* 默认按照列值从小到大排列(asc)
* asc从小到大排列,即升序
* desc从大到小排序,即降序

例1:查询未删除男生信息,按学号降序

select * from students where gender=1 and is_delete=0 order by id desc;

例2:查询未删除学生信息,按名称升序

select * from students where is_delete=0 order by name;

例3:显示所有的学生信息,先按照年龄从大-->小排序,当年龄相同时 按照身高从高-->矮排序

select * from students  order by age desc,height desc;

4.13 分页的使用

为什么需要分页?

  • 接着百度给用户提供数据的例子。当排序经过数据分析之后,根据关联度和点击量等属性排序后,所有的数据的大小对于用户来讲是个天文数字并且用户也不一定需要这么大量的数据,所以这个时候就有一个想法能不能把这么多数据分成一页一页的数据,而 根据用户的需要将数据分为一页一页地传输给用户的技术就是分页

4.13.1 分页查询语法
select * from 表名 limit start=0,count

说明

  • 从start开始,获取count条数据

  • start默认值为0

  • 也就是当用户需要获取数据的前n条的时候可以直接写上 xxx limit n;

例1:查询前3行男生信息

select * from students where gender=1 limit 0,3;
4.14.2 页面分页数据库如何来处理?
  • 已知:每页显示m条数据,当前显示第n页

  • 求总页数:此段逻辑后面会在python项目中实现

    • 查询总条数p1

    • 使用p1除以m得到p2

    • 如果整除则p2为总数页

    • 如果不整除则p2+1为总页数

  • 获取第n页的数据的SQL语句求解思路

    • 第n页前有n-1页

    • 所在第n页前已经显示的数据的总量是(n-1)*m

    • 由于数据的下标从0开始 所以第n页前所有的网页的下标是0,1,...,(n-1)*m-1

    • 所以第n页的数据起始下标是(n-1)*m

  • 获取第n页数据的SQL语句

    select * from students where is_delete=0 limit (n-1)*m,m

4.15 聚合函数的使用

聚合函数是做什么的

聚合函数aggregation function又称为组函数。
默认情况下 聚合函数会对当前所在表当做一个组进行统计。

聚合函数有以下几个特点:
* 每个组函数接收一个参数(字段名或者表达式)
* 统计结果中默认忽略字段为NULL的记录 要想列值为NULL的行也参与组函数的计算,必须使用IFNULL函数对NULL值做转换。

* 不允许出现嵌套 比如sum(max(xx))
4.15.1 总数
  • count(*)表示计算总行数,括号中写星与列名,结果是相同的

例1:查询学生总数

select count(*) from students;
4.15.2 最大值
  • max(列)表示求此列的最大值

例2:查询女生的编号最大值

select max(id) from students where gender=2;
4.15.3 最小值
  • min(列)表示求此列的最小值

例3:查询未删除的学生最小编号

select min(id) from students where is_delete=0;
4.15.4 求和
  • sum(列)表示求此列的和

例4:查询男生的总年龄

select sum(age) from students where gender=1;

-- 平均年龄
select sum(age)/count(*) from students where gender=1;
4.15.5 平均值
  • avg(列)表示求此列的平均值

例5:查询未删除女生的编号平均值

select avg(id) from students where is_delete=0 and gender=2;

4.16 分组用法

什么是分组 所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理。

4.16.1 group by分组

使用特点

  1. group by的含义:将查询结果按照1个或多个字段进行分组,字段值相同的为一组

  2. group by可用于单个字段分组,也可用于多个字段分组

select * from students;
+----+-----------+------+--------+--------+--------+-----------+
| id | name      | age  | height | gender | cls_id | is_delete |
+----+-----------+------+--------+--------+--------+-----------+
|  1 | 小明      |   18 | 180.00 | 女     |      1 |           |
|  2 | 小月月    |   18 | 180.00 | 女     |      2 | •         |
|  3 | 彭于晏    |   29 | 185.00 | 男     |      1 |           |
|  4 | 刘德华    |   59 | 175.00 | 男     |      2 | •         |
|  5 | 黄蓉      |   38 | 160.00 | 女     |      1 |           |
|  6 | 凤姐      |   28 | 150.00 | 保密   |      2 | •         |
|  7 | 王祖贤    |   18 | 172.00 | 女     |      1 | •         |
|  8 | 周杰伦    |   36 |   NULL | 男     |      1 |           |
|  9 | 程坤      |   27 | 181.00 | 男     |      2 |           |
| 10 | 刘亦菲    |   25 | 166.00 | 女     |      2 |           |
| 11 | 金星      |   33 | 162.00 | 中性   |      3 | •         |
| 12 | 静香      |   12 | 180.00 | 女     |      4 |           |
| 13 | 周杰      |   34 | 176.00 | 女     |      5 |           |
| 14 | 郭靖      |   12 | 170.00 | 男     |      4 |           |
+----+-----------+------+--------+--------+--------+-----------+

select gender from students group by gender;
+--------+
| gender |
+--------+
| 男     |
| 女     |
| 中性   |
| 保密   |
+--------+

根据gender字段来分组,gender字段的全部值有4个'男','女','中性','保密',所以分为了4组

在现在MySQL默认情况下, select 后的字段只能出现在以下两种情况:

  • 在group by后出现过

  • 在聚合函数中出现

4.16.2 group by + group_concat()

group_concat(字段名)根据分组结果,使用group_concat()来放置每一个分组中某字段的集合

select gender from students group by gender;
+--------+
| gender |
+--------+
| 男     |
| 女     |
| 中性   |
| 保密   |
+--------+

select gender,group_concat(name) from students group by gender;
+--------+-----------------------------------------------------------+
| gender | group_concat(name)                                        |
+--------+-----------------------------------------------------------+
| 男     | 彭于晏,刘德华,周杰伦,程坤,郭靖                                 |
| 女     | 小明,小月月,黄蓉,王祖贤,刘亦菲,静香,周杰                        |
| 中性   | 金星                                                       |
| 保密   | 凤姐                                                       |
+--------+-----------------------------------------------------------+


select gender,group_concat(id) from students group by gender;
+--------+------------------+
| gender | group_concat(id) |
+--------+------------------+
| 男     | 3,4,8,9,14       |
| 女     | 1,2,5,7,10,12,13 |
| 中性   | 11               |
| 保密   | 6                |
+--------+------------------+
4.16.3 group by + 聚合函数

通过group_concat()的启发,我们既然可以统计出每个分组的某字段的值的集合,那么我们也可以通过集合函数来对这个值的集合做一些操作

聚合函数在和group by结合使用的时候 统计的对象是每一个分组。

select gender,group_concat(age) from students group by gender;
+--------+----------------------+
| gender | group_concat(age)    |
+--------+----------------------+
| 男     | 29,59,36,27,12       |
| 女     | 18,18,38,18,25,12,34 |
| 中性   | 33                   |
| 保密   | 28                   |
+--------+----------------------+


分别统计性别为男/女的人年龄平均值
select gender,avg(age) from students group by gender;
+--------+----------+
| gender | avg(age) |
+--------+----------+
| 男     |  32.6000 |
| 女     |  23.2857 |
| 中性   |  33.0000 |
| 保密   |  28.0000 |
+--------+----------+

分别统计性别为男/女的人的个数
select gender,count(*) from students group by gender;
+--------+----------+
| gender | count(*) |
+--------+----------+
| 男     |        5 |
| 女     |        7 |
| 中性   |        1 |
| 保密   |        1 |
+--------+----------+
4.16.4 group by + having

having 条件表达式:用来过滤分组结果

having作用和where类似,但having只能用于group by 而where是用来过滤表数据,

select gender,count(*) from students group by gender having count(*)>2;
+--------+----------+
| gender | count(*) |
+--------+----------+
| 男     |        5 |
| 女     |        7 |
+--------+----------+
4.16.5 group by + with rollup
  1. with rollup的作用是:在最后新增一行,来记录当前表中该字段对应的操作结果,一般是汇总结果。

select gender,count(*) from students group by gender with rollup;
+--------+----------+
| gender | count(*) |
+--------+----------+
| 男     |        5
| 女     |        7 |
| 中性   |        1 |
| 保密   |        1 |
| NULL   |       14 |
+--------+----------+


select gender,group_concat(age) from students group by gender with rollup;
+--------+-------------------------------------------+
| gender | group_concat(age)                         |
+--------+-------------------------------------------+
| 男     | 29,59,36,27,12                            |
| 女     | 18,18,38,18,25,12,34                      |
| 中性   | 33                                        |
| 保密   | 28                                        |
| NULL   | 29,59,36,27,12,18,18,38,18,25,12,34,33,28 |
+--------+-------------------------------------------+
4.16.6 总结
  • group by根据1个或多个字段对数据进行分组

  • group_concat函数作用就是将每个分组中的每个成员的某个字段拼接在一个字段中显示

  • 聚合函数在和分组结合使用的时候 统计的是每个分组

  • having只是对分组结果进行过滤

  • with rollup在分组结果最后新增一行完成汇总显示。

4.17 子查询

4.17.1 子查询概念

在一个 select 语句中,嵌入了另外一个 select 语句, 那么被嵌入的 select 语句称之为子查询语句

外部那个select语句则称为主查询

主查询和子查询的关系

  • 子查询是嵌入到主查询中

  • 子查询是辅助主查询的,要么充当条件,要么充当数据源

  • 子查询是可以独立存在的语句,是一条完整的 select 语句

4.17.2 分类
  • 标量子查询: 子查询返回的结果是一个数据(一行一列)

  • 列子查询: 返回的结果是一列(一列多行)

  • 行子查询: 返回的结果是一行(一行多列)

4.17.3 标量子查询
  1. 查询班级学生平均年龄

  2. 查询大于平均年龄的学生

查询班级学生的平均身高

select * from students where age > (select avg(age) from students);
4.17.4 列级子查询
  • 查询还有学生在班的所有班级名字

    1. 找出学生表中所有的班级 id

    2. 找出班级表中对应的名字

select name from classes where id in (select cls_id from students);
4.17.5 行级子查询
  • 需求: 查找班级年龄最大,身高最高的学生

  • 行元素: 将多个字段合成一个行元素,在行级子查询中会使用到行元素

select * from students where (height,age) = (select max(height),max(age) from students);
4.17.6 总结
  • 子查询分为三种 标量、行、列子查询

  • 标量子查询返回的结果一行一列

  • 列子查询使用格式: 主查询 where 条件 in (列子查询)

  • 行子查询使用格式: 主查询 where (字段1,2,...) = (行子查询)

mysql的数据操作的更多相关文章

  1. 数据库 MySQL 之 数据操作

    数据库 MySQL 之 数据操作 一.MySQL数据类型介绍 MySQL支持多种类型,大致可以分为四类:数值.字符串类型.日期/时间和其他类型. ①二进制类型 bit[(M)] 二进制位(101001 ...

  2. mysql 写数据操作几次硬盘?

    mysql 写数据步骤: 1:写入操作事物日志,持久化操作日志到磁盘,并且只是写在磁盘上一小块区域内的顺序io,不需要像随机io一样 在磁盘多个地方移动磁头 2:内存中事物日志持久化以后  ,写入的数 ...

  3. mysql之数据操作

    一 介绍 MySQL数据操作: DML 在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括 使用INSERT实现数据的插入 UPDATE实现数据的更新 使用DELETE实现 ...

  4. Database学习 - mysql 数据库 数据操作

    mysql数据操作 查询语法 select * | field1,field1 ... from 表名 where 条件 group by 字段 having 筛选 order by 字段 limit ...

  5. 第八章| 2. MySQL数据库|数据操作| 权限管理

    1.数据操作 SQL(结构化查询语言),可以操作关系型数据库 通过sql可以创建.修改账号并控制账号权限:  通过sql可以创建.修改数据库.表:  通过sql可以增删改查数据: 可以通过SQL语句中 ...

  6. MySQL 数据库 -- 数据操作

    数据的增删改 一 介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过 ...

  7. MySQL 简洁 数据操作 增删改查 记不住的 看这里把

    1.库操作====================== 1.创建 CREATE DATABASE DB2 charset utf8; 2.删除 DROP DATABASE db2; 3.使用(进入) ...

  8. mysql五:数据操作

    一 介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过SQL语句中的 ...

  9. mysql四:数据操作

    一 介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过SQL语句中的 ...

  10. Mysql(四):数据操作

    一 介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过SQL语句中的 ...

随机推荐

  1. 读python代码-学到的python函数-1

    1.with open(data_path,'r') as f: with open()是python用来打开本地文件的,他会在使用完毕后,自动关闭文件,无需手动书写close(). 三种打开模式: ...

  2. Centos7下git最新版本安装

    刚重新装了centos7最小版的系统,发现没有git,只好重新安装了,记录下以防忘记.(以下命令最好在root用户下执行,要么你有管理员权限也行,则需要在命令前加sudo) 安装方法有两种: 一.yu ...

  3. java线程基础知识整理

    目录 线程基本概念 1.java实现线程 2.线程的生命周期 3.线程常用的方法 3.1.sleep() 3.2.interrupt方法 3.3.stop方法 4.线程调度 4.1.常见的线程调度模型 ...

  4. 贪心算法Dijkstra

    Dijkstra 最短路径问题 : 给定一个带权有向图 G = (V, E, W),同时给定一个源点 u (u ∈ V),我们要找出从源点 u 出发到其它各点的最短路径距离,并得出这些最短路径的具体路 ...

  5. Spark详解(09) - Spark调优

    Spark详解(09) - Spark调优 Spark 性能调优 常规性能调优 常规性能调优一:最优资源配置 Spark性能调优的第一步,就是为任务分配更多的资源,在一定范围内,增加资源的分配与性能的 ...

  6. [C++]C++11:Function与Bind

    std::function 它是函数.函数对象.函数指针.和成员函数的包装器,可以容纳任何类型的函数对象,函数指针,引用函数,成员函数的指针. 以统一的方式处理函数.函数对象.函数指针.和成员函数. ...

  7. 《Effective C++》再次探索traits技法

    首先介绍C++标准程序库中的五种迭代器,关于这个可以看我的另一个笔记:http://blog.csdn.net/m0_37316917/article/details/70053513. 对于这五种分 ...

  8. Runloop的使用

    系统为我们提供了多种模式,下面列一些比较常遇到的: kCFRunLoopDefaultMode: App的默认 Mode,通常主线程是在这个 Mode 下运行的. UITrackingRunLoopM ...

  9. 音频音量调整中的ramp up & down

    在日常生活中不管是打电话还是听音乐,都会遇到音量不合适而去调整音量的情况.如果音量调整软件处理不好,就会听到pop noise.产生pop noise的原因是音量直接从当前值骤变到目标值,而不是缓慢的 ...

  10. 全志V3S 调试串口更改或关闭

    有时项目外设比较多,很容易造成串口不够用的情况. 最近就遇到了,新增加一个GPS模块串口的,串口现在外部只有原来的调试串口可以用,所以 尝试将调试口更改为普通串口. 经过网上看大神们的文章和自己摸索, ...