MySQL数据类型——数值类型

1.1.1 整型

整型

占用字节

范围

范围

tinyint

1

-27~27-1

-128~127

smallint

2

-215~215-1

-32768~32767

mediumint

3

-223~223-1

-8388608~8388607

int

4

-231~231-1     

-2147483648~2147483647

bigint

8

-263~263-1

 

多学一招:一个字节=8位    

帮助的位置:列类型——数值类型

1.1.2 显示宽度

显示宽度:最小的显示位数,比如int(11),最少用11位数字显示值。例如存放了“12”,则显示“00000000012”。

 

 

脚下留心:显示宽度必须结合zerofill才起作用。

 

插入测试数据

 

 

查询结果

 

 

 

脚下留心:显示宽度不决定显示范围,只是在数值不够指定位数的时候用0做前导。

1.1.3 无符号数(unsigned)

无符号数就是没有负数,无符号数的正数的范围是有符号数正数范围的2倍。

 MySQL数据类型——数值类型_第1张图片

 

测试:创建两个表

 MySQL数据类型——数值类型_第2张图片

 

 

 

 

1.1.4 浮点数

浮点数

占用字节

范围

float(单精度)

4

-3.4E+38~3.4E+38

double(双精度)

8

-1.8E+308~1.8E+308

浮点数的声明float(M,D),double(M,D)

M:总位数 D:小数位数

 

 

插入测试数据

 MySQL数据类型——数值类型_第3张图片

 

脚下留心:没有指定小数位数,默认小数位数是0

多学一招MySQL浮点数支持科学计数法

 MySQL数据类型——数值类型_第4张图片

 

5E2=5*1026E-2=6*10-2

脚下留心:浮点数的精度会丢失

mysql> create table t4(

    -> num1 float

    -> );

Query OK, 0 rows affected (0.01 sec)

 

mysql> insert into t4 values (99.999999999);

Query OK, 1 row affected (0.00 sec)

 

mysql> select * from t4;

+------+

| num1 |

+------+

|  100 |

+------+

1 row in set (0.00 sec)

1.1.1 定点数(小数)

语法decimal(M,D)

M的最大值是65,D的最大值是30,默认是(10,0)

 MySQL数据类型——数值类型_第5张图片

 

多学一招:定点数和浮点数都支持显示宽度、无符号数

 MySQL数据类型——数值类型_第6张图片

 

脚下留心:decimal是变长的,大致每9个数字用4个字节存储,整数和小数分开存储。定点数占用的资源可能会比浮点数大很多。

1.1 MySQL数据类型——字符型

数据类型

描述

char(L)

定长字符

varchar(L)

可变长度字符

tinytext

大段文本(大块数据)   28-1=255个字符

text

大段文本(大块数据)   216-1=65535个字符

mediumtext

224-1

longtext

232-1

1.1.1 char

1、 char(L):MySQL不回收多余的空间

2、 L的最大长度是255

 

 

1.1.2 varchar

1、 varchar(L):MySQL回收多余的空间

2、 L的理论最大长度是65535,但事实上达不到,因为有的字符是多字节字符,比如一个utf8的字符占用3个字节,65535/3大约保存2万多字符;如果是gbk,一个字符占两个字节,65535/2大约保存3万多个字符。

 

 

 

 

脚下留心:一个记录的所有字段(不包含大数据)的总长度不能超过65535个字节

 

 

1.2 MySQL数据类型——枚举(enum)

从集合中选择一个值作为数据(单选)

 

 

插入测试数据

 

 

MySQL管理枚举值是通过整型的数字来管理的,第一个值是1,第二个值是2,以此类推。

 MySQL数据类型——数值类型_第7张图片

 

既然枚举值以整数的形式存储,插入值的时候就可以直接插入整数

 

 

也可以通过整型数字来做查询

 

 

1.2.1 枚举优点

1、 限制值

2、 节省空间

3、 运行速度快(整数比字符串运行速度快)

思考题:已知枚举占用2个字节,请问最多可以有多个枚举值。

2个字节16位,可以保存216方个值(65536,0-65535),因为枚举值从1开始,所以最多可以有65535个枚举值。

1.3 MySQL数据类型——集合(set)

从集合中选择一些值作为数据(多选)

 

 

插入数据

 MySQL数据类型——数值类型_第8张图片

 

MySQL数据类型——数值类型_第9张图片

 

 MySQL数据类型——数值类型_第10张图片

 

 

 

多学一招:集合和枚举一样,在MySQL内部也是通过数字来管理的。MySQL为每个集合元素分配一个固定的值。分配方式从前往后依次是20,21,22

如果有多个选项值是单个选项的和

 

 

多学一招按位或和按位与

按位与所有的位都是1结果才是1

按位或只要有一位是1结果就是1

      

 

 

     

1.3.1 集合是一个按位或的关系

 MySQL数据类型——数值类型_第11张图片

 

思考题:一直集合占用8个字节,可以表示多少个选项?

8个字节是64个位,可以表示64个选项

1.4 MySQL数据类型——日期时间型

数据类型

描述

datetime

日期时间   占8个字节

date

日期        占四个字节

time

时间

year

年份,占用1个字节

timestamp

时间戳,占用4个字节

1.4.1 datetime  (日期时间)

格式:年-月-日  小时:分钟:秒

 

 

--插入数据

 MySQL数据类型——数值类型_第12张图片

 

1.4.2 timestamp  (时间戳)

 

 

插入数据

 MySQL数据类型——数值类型_第13张图片

 

脚下留心:datetime和timestamp在表现上是一样的,他们的区别在于:

Datetime从1到9999,而timestamp从1970年到2038年(原因是timestamp只占用了4个字节),2038年01月19日11:14:07秒后就超过了4个字节的长度。

1.4.3 date  只保存日期,不保存时间

 MySQL数据类型——数值类型_第14张图片

 

1.4.4 year

因为year占用1个字节,所以只能保存255个年份,范围是1901~2155

 MySQL数据类型——数值类型_第15张图片

 

1.4.5 time

可以表示时间,还可以表示时间间隔,范围是-838:59:59~838:59:59

 

 

插入数据

 

 

 

 

 

 

 

多学一招:time也支持以天的方式表示时间间隔

 

 

1.5 MySQL数据类型——boolean

MySQL不支持boolean型,true和false在数据库中对应的是1和0

 MySQL数据类型——数值类型_第16张图片

 

 

 

 

1.6 列属性——是否为空(null|not null)

用来约束字段的值是否为null

 

 

插入测试数据

 

 

1.7 列属性——默认值 (default)

如果一个字段没有插入值,自动插入一个默认值。

 

 

 

 

1.8 列属性——自动增长(auto_increment)

字段的值从1开始,每次递增1。特点字段中不会有重复的值,合适为记录生成一个唯一的id,主键常用。

 

 

插入测试数据

 

 

 

脚下留心:

1、 MySQL中,auto_increment列必须做主键

2、 auto_increment是从1开始增长的,所以定义的时候一般和unsigned一起使用(使用无符号整数)

3、 自动增长列一般用null插入

4、 自动增长列上的数据被删除,默认不再重复使用。

5、 delete from 清空数据后编号继续增长truncate table 清空表后编号从1开始增长.因为truncate table 是删除原来的表创建一个新表。

思考题:一个自动增长列最后一个记录的编号是10,再插入一条编号一定是11?

:不对,因为10后面的记录可能被删除过。

思考题:在一个自动增长列中,插入3条,删除2条,插入3条,删除2条,插入3条,删除2条,再插入编号是多少?

10,删除和不删除对结果不产生影响。

1.9 列属性——主键(primary key)

1、 主键:唯一标识表中记录的一个或一组列。

2、 主键特点:不能重复,不能为空

3、 一个表只能有一个主键,但是主键可以由多个字段组成。

学校编号

班级号

学号

姓名

成绩

1

1

1

tom

99

2

1

1

tom

88

1.9.1 主键的作用

1、 保证数据完整性

2、 加快查询速度

1.9.2 添加主键方法一:

mysql> create table stu(

    -> id int primary key,

    -> name varchar(20)

    -> );

Query OK, 0 rows affected (0.00 sec)

1.9.3 添加主键方法二:

mysql> create table stu(

    -> id int,

    -> name varchar(20),

    -> primary key(id)

    -> );

多学一招如果主键由多个字段组成

mysql> create table stu(

    -> id int,

    -> name varchar(20),

    -> primary key(id,name)

    -> );

1.9.4 添加主键方法三

通过更改表的语法添加主键

语法alter table 表名 add primary key(字段)

mysql> create table stu(

    -> id int,

    -> name varchar(20)

    -> );

Query OK, 0 rows affected (0.00 sec)

 

mysql> alter table stu add primary key (id);

Query OK, 0 rows affected (0.06 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

mysql> desc stu;

+-------+-------------+------+-----+---------+-------+

| Field | Type        | Null | Key | Default | Extra |

+-------+-------------+------+-----+---------+-------+

| id    | int(11)     | NO   | PRI | 0       |       |

| name  | varchar(20) | YES  |     | NULL    |       |

+-------+-------------+------+-----+---------+-------+

2 rows in set (0.06 sec)

添加多个列做主键

 MySQL数据类型——数值类型_第17张图片

 

1.9.5 删除主键

语法alter table 表名 drop primary key;

 

 

1.9.6 选择主键的原则

1、 最少性:尽量选择单个键做主键

2、 稳定性:尽量选择更新少的列做主键。

3、 能用数字做主键的就不要用字符串

1.10 列属性——唯一键(unique)

1、 不能重复可以为空

2、 一个表可以有多个唯一键

1.10.1 创建唯一键方法一:

mysql> create table stu(

    -> id int,

    -> name varchar(20) unique,

    -> stuadd varchar(20) unique

    -> );

Query OK, 0 rows affected (0.00 sec)

 

mysql> desc stu;

+--------+-------------+------+-----+---------+-------+

| Field  | Type        | Null | Key | Default | Extra |

+--------+-------------+------+-----+---------+-------+

| id     | int(11)     | YES  |     | NULL    |       |

| name   | varchar(20) | YES  | UNI | NULL    |       |

| stuadd | varchar(20) | YES  | UNI | NULL    |       |

+--------+-------------+------+-----+---------+-------+

1.10.2 创建唯一键方法二:

 MySQL数据类型——数值类型_第18张图片

 

1.10.3 创建唯一键的方法三

更改表的时候创建唯一键

语法:alter table 表名 add unique [key] [唯一键名](字段名)

 MySQL数据类型——数值类型_第19张图片

 

可以理解为添加一个字段。

 MySQL数据类型——数值类型_第20张图片

 

如果不给唯一键显式取名MySQL会自动给键取一个名字

1.10.4 创建组合唯一键

 MySQL数据类型——数值类型_第21张图片

 

1.10.5 查看唯一键的名字

 MySQL数据类型——数值类型_第22张图片

 

1.10.6 删除唯一键

通过唯一键的名字来删除

语法:alter table 表名 drop index 唯一键名

 

 

1.11 列属性——备注(comment)

为了程序员之间相互交流,可以给字段添加备注。

mysql> create table stu(

    -> id int auto_increment comment '主键',

    -> name varchar(20) not null comment '姓名',

    -> stuadd varchar(20) not null comment '地址',

    -> primary key(id)

    -> );

 

 

 

1.12 SQL注释

单行注释--或 #

多行注释/*    */

 

 

多行注释

 

 

1.13 数据完整性

 MySQL数据类型——数值类型_第23张图片

 

如果记录之间无法区分称为失去了实体完整性

如果字段的值不正确称为失去了域完整性

两个表的引用出现错误称为失去了引用完整性

1.13.1 保证实体完整性

1、 主键约束

2、 唯一约束

3、 自动增长列(标识列)

 

1.13.2 保证域完整性

1、 非空约束

2、 默认值约束

3、 数据类型约束

MySQL数据类型——数值类型_第24张图片

 

1.13.3 引用完整性

外键约束

1.13.4 保证自定义完整性

1、 存储过程

2、 函数

3、 触发器

1.14 外键(foreign key)

1、 外键:从表中的公共字段称为外键。外键约束用来保证引用完整性。

2、 公共字段名字可以不一样,但是属性必须一样

1.14.1 创建外键方法一:创建表的时候就创建外键

create table stuinfo(

stuno char(4) primary key,

name varchar(20) not null

);

create table stumarks(

id char(4) primary key,

score tinyint unsigned not null default 0,

foreign key (id) references stuinfo(stuno)

);

1.14.2 创建外键的方法二:修改表的时候创建外键

语法:alter table 从表 add [constraint 外键名] foreign key(公共字段) references 主表(公共字段)

constraint:约束     references:参照

create table stuinfo(

stuno char(4) primary key,

name varchar(20) not null

);

create table stumarks(

id char(4) primary key,

score tinyint unsigned not null default 0

);

 

--添加外键

alter table stumarks add foreign key(id) references stuinfo(stuno);

--添加外键的时候给外键取名

alter table stumarks add constraint `FK1` foreign key(id) references stuinfo(stuno);

提示:如果在某个字段上添加外键,该字段必须具有索引才行,如果该字段上有索引就用已经存在索引;如果没有MySQL会自动创建索引。

1.14.3 查看外键名

 MySQL数据类型——数值类型_第25张图片

 

1.14.4 删除外键

语法:alter table 表名 drop foreign key 外键约束名

 

 

1.14.5 外键约束中的主表和从表

1、 主表中没有的从表中不能插入

2、 从表中有的主表中不能删除

3、 先删从表,再删主表

1.15 外键操作

1、 严格限制:默认是严格显示,知识点参见主表和从表

2、 置空操作(set null):如果主表记录删除,从表对应的记录外键字段设为null。

3、 级联操作(cascade):如果主表更新,从表也更新

语法:foreign key(外键字段) references 主表(关联字段) [主表记录删除时动作] [主表记录更新时的动作]

一般来说:主表删除,从表置空,主表修改,从表级联

--主表

create table stuinfo(

stuno char(4) primary key,

name varchar(20) not null

);

--从表

create table stumarks(

id int unsigned auto_increment primary key,

stuno char(4),

score tinyint unsigned not null default 0,

foreign key(stuno) references stuinfo(stuno) on delete set null on update cascade   --删除时置空更新时级联

);

 

--测试

mysql> insert into stuinfo values ('1001','tom');

Query OK, 1 row affected (0.00 sec)

 

mysql> insert into stumarks values (null,'1001',88);

Query OK, 1 row affected (0.00 sec)

 

mysql> select * from stuinfo;

+-------+------+

| stuno | name |

+-------+------+

| 1001  | tom  |

+-------+------+

1 row in set (0.00 sec)

 

mysql> select * from stumarks;

+----+-------+-------+

| id | stuno | score |

+----+-------+-------+

|  1 | 1001  |    88 |

+----+-------+-------+

1 row in set (0.00 sec)

 

mysql> update stuinfo set stuno='1002' where stuno='1001';

Query OK, 1 row affected (0.01 sec)

Rows matched: 1  Changed: 1  Warnings: 0

 

mysql> select * from stuinfo;

+-------+------+

| stuno | name |

+-------+------+

| 1002  | tom  |

+-------+------+

1 row in set (0.00 sec)

 

mysql> select * from stumarks;

+----+-------+-------+

| id | stuno | score |

+----+-------+-------+

|  1 | 1002  |    88 |

+----+-------+-------+

1 row in set (0.00 sec)

 

mysql> delete from stuinfo where stuno='1002';

Query OK, 1 row affected (0.00 sec)

 

mysql> select * from stumarks;

+----+-------+-------+

| id | stuno | score |

+----+-------+-------+

|  1 | NULL  |    88 |

+----+-------+-------+

1 row in set (0.00 sec)

脚下留心:只用Innodb引擎才支持外接约束。

1.16 思考题

手机号码一般使用什么数据类型存储? Char

q QQ号 varchar

性别一般使用什么数据类型存储? char

年龄信息一般使用什么数据类型存储? tinyint

照片信息一般使用什么数据类型存储? binary

薪水一般使用什么数据类型存储? Decimal

学员姓名允许为空吗? 不允许

家庭地址允许为空吗? 不允许

电子邮件信息允许为空吗? 允许

考试成绩允许为空吗? 允许

在主键列输入的数值,允许为空吗? 不允许

一个表可以有多个主键吗? 不可以

在一个学校数据库中,如果一个学校内允许重名的学员,但是一个班级内不允许学员重名,可以组合班级和姓名两个字段一起来作为主键吗? 可以

标识列允许为字符数据类型吗? 不允许

表中没有合适的列作为主键怎么办? 添加一个自动增长列做主键

如果标识列A的初始值为1,增量为1,则输入三行数据以后,再删除两行,下次再输入数据行的时候,标识值从多少开始? 4开始

一个字段是用字符型还是数字型,就看字段的值是否有计算的可能。如果可能会计算则用数字,否则用字符型。

 

 

 

 

 

 

1.17 实体之间的关系(表与表之间的关系)

1.17.1 一对多:(1:N)主表中的一条记录对应从表中多条记录

 MySQL数据类型——数值类型_第26张图片

 

一个商品类别对应多个商品

一个班级对应多个学生

一个客户对应多个订单

脚下留心:主键和非主键建关系实现一对多

1.17.2 多对一 (N:1)(和一对多是一样的)

1.17.3 一对一 1:1)

 

 

脚下留心:主键和主键建关系实现一对一

应用:如果一记录字段很多,所有字段放在一个表中会影响效率,可以将多个字段分成常用字段和不常用字段两个表。

 MySQL数据类型——数值类型_第27张图片

 

1.17.4 多对多(N:M)

要实现多对多必须要有关系表

班级和讲师的关系

 MySQL数据类型——数值类型_第28张图片

 

科目和学生的关系

 MySQL数据类型——数值类型_第29张图片

 

1.1 数据库设计步骤

 MySQL数据类型——数值类型_第30张图片

 

1.17.5 项目需求

BBS论坛的基本功能:

1用户注册和登录,后台数据库需要存放用户的注册信息和在线状态信息;

2、用户发贴,后台数据库需要存放贴子相关信息,如贴子内容、标题等;

3、用户可以对发帖进行回复(跟帖);

4、论坛版块管理:后台数据库需要存放各个版块信息,如版主、版块名称、贴子数等;

1.17.6 标识实体(Entiry)

在项目需求中用到的实体标识出来。实体是名词。

1、 用户

2、 主帖

3、 跟帖

4、 板块

1.17.7 标识每个实体的属性(Attribute)

 MySQL数据类型——数值类型_第31张图片

 

1.17.8 标识实体之间的关系(Relationship)

标识两个表的关系(参照实体之间的关系)

1.17.9 绘制E-R图(实体关系图)

语法:

 MySQL数据类型——数值类型_第32张图片

 

例题

 MySQL数据类型——数值类型_第33张图片

 

 

1.17.10 E-R图实现如下

 MySQL数据类型——数值类型_第34张图片

 

1.17.11 E-R转成表

1、 一个实体就是一个表

2、 一个属性就是一个字段

3、 建立关系

脚下留心:如果在转换的过程中,没有一个属性可以住主键,就添加一个自动增长列做主键

1.18 数据规范化

第一范式:确保每列原子性(每个字段不可再分)

 MySQL数据类型——数值类型_第35张图片

 

脚下留心:如果要通过地址做统计或查询,就把地址分开,如果仅仅是一个地址字符串,没有统计或查询的需求,地址可以不拆分。

思考如下表结构是否合理

    

 

第二范式:非键字段必须依赖于键字段。(一个表只描述的一件事情)

 

MySQL数据类型——数值类型_第36张图片

 

 

 

第三范式:消除传递依赖

第三范式约束的是非主键字段部分。

MySQL数据类型——数值类型_第37张图片

 

脚下留心:必须满足低范式以后才能满足高范式,

思考题如何实现高考分数表

考试号

姓名

语文

数学

总分

满足第一范式

满足第二范式

不满足第三范式    语文+数学=总分,但实际中确实添加了“总分”字段,就是为了提高性能。

当规范化和性能发生冲突的时候我们要性能

1.18.1 例题

需求

1、公司承担多个工程项目,每一项工程有:工程号、工程名称、施工人员等

2、公司有多名职工,每一名职工有:职工号、姓名、性别、职务(工程师、技术员)等

3、公司按照工时和小时工资率支付工资,小时工资率由职工的职务决定(例如,技术员的小时工资率与工程师不同)

工资报表

 MySQL数据类型——数值类型_第38张图片

 

将工资报表转成数据表

 MySQL数据类型——数值类型_第39张图片

 

插入异常:有一个员工入职,还没有参加工程,但工程名称不能为空,必须给插入一个虚拟的工程名称

更新异常:员工从“技术员”升到“工程师”,但可能小时工资率没有更改。

删除异常:员工离职,将员工删除,员工删除后工程也删除了。

总结此表不能做数据表改都有问题

解决:

 MySQL数据类型——数值类型_第40张图片

 

项目工时表就是工程信息和员工的关系表

 MySQL数据类型——数值类型_第41张图片

MySQL数据类型——数值类型_第42张图片

 

 

1.19 运算符

1.19.1 算术运算符

+

-

*

/

%

脚下留心:MySQL的算术运算符没有++和--

1.19.2 关系运算符

>

>=

<

<=

=

!=或<>

脚下留心:MySQL的“=”既是等于也是赋值

1.19.3 逻辑运算符

and

or

not

1.20 查询语句

语法:select  [选项] 列名 from 表名 [where 条件] [group by 分组] [having 条件] [order by 排序] [limit 限制]

1.20.1 字段表达式列表

 

 

 

 

 

 

 

 

 

多学一招:as用来给字段去别名,as可以省略

 

 

 

1.20.2 from子句

from后面跟的是数据源,如果数据源有多张表,返回的是笛卡尔积。

--插入测试数据

create table stu_info(

       name varchar(10),

       sex char(1)

);

create table stu_marks(

       ch tinyint,

       math tinyint

);

insert into stu_info values ('tom','男'),('berry','女');

insert into stu_marks values (11,11),(22,22);

--测试from后面跟多个表

 MySQL数据类型——数值类型_第43张图片

 

--查询表的部分字段

 

 

--给表取别名

 MySQL数据类型——数值类型_第44张图片

 

--给字段取别名

 

 

1.20.3 dual表(伪表)

dual表是一个虚拟表,在有些特定的情况下不能省略from子句,但是又没有一个表,这时候就用伪表。dual表就是为了保证查询语句的完整性。

 

 

1.20.4 where子句

插入测试数据

create table stu

(

stuNo char(6) primary key,

stuName varchar(10) not null,

stuSex char(2) not null,

stuAge tinyint not null ,

stuSeat tinyint not null,

stuAddress varchar(10) not null,

ch tinyint,

math tinyint

);

insert into stu values ('s25301','张秋丽','男',18,1,'北京',80,null);

insert into stu values ('s25302','李文才','男',31,3,'上海',77,76);

insert into stu values ('s25303','李斯文','女',22,2,'北京',55,82);

insert into stu values ('s25304','欧阳俊雄','男',28,4,'天津',null,74);

insert into stu values ('s25305','诸葛丽丽','女',23,7,'河南',72,56);

insert into stu values ('s25318','争青小子','男',26,6,'天津',86,92);

insert into stu values ('s25319','梅超风','女',23,5,'河北',74,67);

在数据源中进行查询

--年龄超过20的女生

 

 

 

 

 

思考:既然查询得到的“结果集”的结构类似于一张表,那么可以在“结果集”上继续进行查询吗?

可以的,这就是子查询或高级查询。

1.20.5 in | not in  

把字段中内容与所列出的查询内容列表匹配的记录查询出来。

--查询“北京、上海”的学生

 

 

--用in语句实现

 

 

--查询不是“北京“上海”的学生

 

 

1.20.6 between and | not between and

在指定范围之间 | 不在指定范围之间

--查询年龄在20到30之间的学生

 

 

--用between and实现

 

 

--查询年龄不在20到30之间的学生

 

 

1.20.7 is null | is not null

--取出语文或数学缺考的学生

 

 

--取出没有缺考的学生

 

 

1.20.8 聚合函数

聚合函数

描述

sum()

求和

avg()

求平均值

max()

最大值

min()

最小值

count()

记录数

 

select sum(ch) as '语文总分', avg(ch) as '语文平均分',max(ch) as '语文最高分',min(ch) as '语文最低分',count(*) 总人数 from stu;

 

 

1.20.9 通配符

通配符

描述

_  (下划线)

表示任意一个字符

%

表示任意字符

1、’t_m’下列选项符合的条件的是( B,D)

Atm B:tom C:toom D:tam E:tmo

2、’%’ 下列选项符合的条件的是(A、B、C、D)

A:张三 B:张三丰 C:张牙舞爪  D:张   E:小张

3、’%诺基亚%’  下列选项符合的条件的是(A、B、C、D )

A:诺基亚2100   B :2100诺基亚  C:我的诺基亚质量很好 D:诺基亚

4、SELECT * FROM 数据表 WHERE 编号 LIKE '00_A5%C’  (D)

A、0890AC   B、007_A51C    C、00A54C   D、00AA5C

1.20.10 模糊查询 like)

 

 

1.20.11 分组查询  group by)

将查询的结果分组展示,分组的目的在于统计数据。

 MySQL数据类型——数值类型_第45张图片

 

 

脚下留心:一般来说,分组语句中的显示字段是聚合函数和分组字段名,如果用普通字段,只取分组字段的第一个值。

 

 

 

可以通过group_concat()函数将同一组的值连接起来

 

 

 

分组后的结果默认按照升序排列

 MySQL数据类型——数值类型_第46张图片

 

可以指定分组后的结果按降序排列

 MySQL数据类型——数值类型_第47张图片

 

多列分组

 

 

1.20.12 回溯统计

在分组统计的基础上再次进行相同的统计(with rollup)

 MySQL数据类型——数值类型_第48张图片

 

1.20.13 having条件

where和having的区别:

1、 where是对表的数据进行筛选

2、 having是对结果集的数据进行筛选having是对查询的结果再次进行筛选。

having设置了查询条件,条件字段必须在查询结果集中存在。

 MySQL数据类型——数值类型_第49张图片

MySQL数据类型——数值类型_第50张图片

 

 

思考:查找班级总人数超过3个人的性别

 

 

1.20.14 order by排序

排序有升序和降序asc | desc)

mysql> select * from stu order by stuage asc; --按年龄升序

 

mysql> select * from stu order by stuage;   -- 默认是升序

 

mysql> select * from stu order by stuage desc; --降序

多列排序:

mysql> select * from stu order by stuage desc,ch desc; --按年龄从大到小排列如果年龄一样大,按照语文成绩从大到小排列

 

select * from stu order by stuage,ch desc  --按年龄从小到大排列如果年龄一样大,按照语文成绩从大到小排列

 

select * from stu order by stuage,ch;  --按年龄从小到大排列如果年龄一样大,按照语文成绩从小到大排列

1.20.15 limit 限制

语法limit 起始位置,显示长度

起始位置可以省略,如果省略默认是0

 MySQL数据类型——数值类型_第51张图片

 

 

 

1.20.16 查询语句中的选项

查询语句中的选项有两个

1、 all:显示所有的记录(默认)

2、 distinct:去除相同的记录

  MySQL数据类型——数值类型_第52张图片

 

 MySQL数据类型——数值类型_第53张图片

 

 

 

 

1.21 insert…select语句

将一个表中的数据插入到另一个表中

mysql> create table user1(

    -> name varchar(20),

    -> sex char(1)

    -> );

Query OK, 0 rows affected (0.01 sec)

 

--将stu表中的stuname和stusex插入到user1表中

mysql> insert into user1 select stuname,stusex from stu;

Query OK, 7 rows affected (0.00 sec)

Records: 7  Duplicates: 0  Warnings: 0

1.22 on duplicate key update

如果插入一个已经存在的主键或不满足唯一约束的值就执行update操作。

 MySQL数据类型——数值类型_第54张图片

 

 

--测试   插入1 berry ,如果不能插入就执行更新

mysql> insert into stu1 values (1,'berry') on duplicate key update name='berry';

 

 

1.23 union

作用:将多条select语句纵向联合起来。

语法select 语句 union [选项] select 语句 union [选项] select 语句…

 MySQL数据类型——数值类型_第55张图片

 

1.23.1 union的选项

union的选项有两个

1、 all:显示两个表中的所有记录

2、 distinct:去掉两个表中相同的记录 (默认)

 MySQL数据类型——数值类型_第56张图片

 

 MySQL数据类型——数值类型_第57张图片

 

 

1.23.2 例题

1、 查找上海的男生和北京的女生

-- 方法一

select * from stu where (stuaddress='上海' and stusex='男') or (stuaddress='北京' and stusex='女');

--方法二

select * from stu where (stuaddress='上海' and stusex='男') union

select * from stu where (stuaddress='北京' and stusex='女');

 

 

 

结论:将复杂的条件简化成两个简单的条件

2、 将多个表的数据插入到一个表中

--创建雇员表

mysql> create table emp(

    -> id int unsigned auto_increment primary key,

    -> name varchar(20) not null,

    -> sex char(1) not null

    -> );

 

--插入数据

insert into emp (name,sex) select stuname,stusex from stu union all select name,sex from stu_info;

1.23.3 union的使用要求

1、 union两边的select语句的字段个数必须一致。

 

 

2、 字段名可以不一致,最终按第一个select语句的字段名。

 

 

3、 union两边的select语句中的字段的数据类型可以不一致

 

 

1.23.4 union与order by一起使用

1、 union两边select语句必须用括号括起来

2、 每条select语句必须配合limit才起作用

男生按年龄的降序排列,女生按年龄的升序排列

 MySQL数据类型——数值类型_第58张图片

 

转载于:https://www.cnblogs.com/wangyanzi/p/6115354.html

你可能感兴趣的:(MySQL数据类型——数值类型)