day04关于MySqL—Android小白的学习笔记

时间:2023-03-08 16:07:27

Mysql入门

1、 数据库基本知识(了解)

1.1、数据库介绍
1.1.1、什么是数据库?数据库的作用是什么?

数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作

想要存储并读取数据:

没有数据库:

1、新建一个文件夹用来存储文件;

2、把对应的数据以字符流的形式放入对应的文件中;

3、把文件以某种规律放入文件夹中;

4、 要查询对应数据时,需要将数据仓库所有文件以字符流形式获取并遍历,以取得对应数据的某些标识来取得数据;

有数据库:  

1、将数据 以数据库语言 交给数据库;

2、数据库得到数据后 存储在对应的数据表中;

3、要查询对应数据时,仅需要使用数据库语言即可得到对应数据。

开发中作为软件应用数据。

1.1.2、常见数据库有哪些?(jAVAEE)

l Oracle 大型收费 在java中应用较多

l SQL Server 微软 中大型收费

l Sybase 目前基本不用 powerdesinger

l Mysql 中小型 免费开源数据库(6版本以前免费)

l DB2 IBM 大型收费 IBM

各数据库简述:

l Oracle数据库:Oracle是殷墟(yīn Xu)出土的甲骨文(oracle bone inscriptions)的英文翻译的第一个单词,在英语里是“神谕”的意思,由Larry Ellison 和另两个编程人员在1977创办,他们开发了自己的拳头产品,在市场上大量销售,1979 年,Oracle公司引入了第一个商用SQL 关系数据库管理系统。Oracle公司是最早开发关系数据库的厂商之一,其产品支持最广泛的操作系统平台。目前Oracle关系数据库产品的市场占有率名列前茅。

l SQL Server数据库:1987 年,微软和 IBM合作开发完成OS/2,IBM 在其销售的OS/2 ExtendedEdition 系统中绑定了OS/2Database Manager,而微软产品线中尚缺少数据库产品。为此,微软将目光投向Sybase,同Sybase 签订了合作协议,使用Sybase的技术开发基于OS/2平台的关系型数据库。1989年,微软发布了SQL Server 1.0 版。

l Sybase数据库:  Sybase公司成立于1984年,公司名称“Sybase”取自“system”和 “database” 相结合的含义。Sybase公司的创始人之一Bob Epstein 是Ingres 大学版(与System/R同时期的关系数据库模型产品)的主要设计人员。公司的第一个关系数据库产品是1987年5月推出的Sybase SQLServer1.0。Sybase首先提出Client/Server 数据库体系结构的思想,并率先在Sybase SQLServer 中实现。

l MySQL数据:  mySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司。在2008年1月16号被Sun公司收购。而2009年,Sun公司又被Oracle公司收购。目前MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库

l DB2数据库:  作为关系数据库领域的开拓者和领航人,IBM在1997年完成了System R系统的原型,1980年开始提供集成的数据库服务器—— System/38,随后是SQL/DSforVSE和VM,其初始版本与SystemR研究原型密切相关。DB2 forMVSV1 在1983年推出。该版本的目标是提供这一新方案所承诺的简单性,数据不相关性和用户生产率。1988年DB2 for MVS 提供了强大的在线事务处理(OLTP)支持,1989 年和1993 年分别以远程工作单元和分布式工作单元实现了分布式数据库支持。最近推出的DB2 Universal Database 6.1则是通用数据库的典范,是第一个具备网上功能的多媒体关系数据库管理系统,支持包括Linux在内的一系列平台。

1.1.3、数据库类型

数据库发展历程如下所示:

Ø 没有数据库,使用磁盘文件存储数据;

Ø 层次结构模型数据库;

Ø 网状结构模型数据库;

Ø 关系结构模型数据库,使用二维表格来存储数据;

Ø 关系-对象模型数据库;(NOSQL)

l 关系型数据库(SQL)

关系数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。

我们今天要学习的MySQL就是关系结构模型数据库管理系统,简称关系型数据库管理系统

l 非关系型数据库(NOSQL)

1.1.4、DBMS
1.1.4.1、什么是DBMS?

DBMS(Database Management System)叫做 数据库管理系统。

Windows 计算机管理系统

是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。

day04关于MySqL—Android小白的学习笔记

1.1.4.2、DBMS的作用

l 数据定义(建立数据库结构及约束)

l 数据操作(用户实现对数据的追加、删除、更新、查询等操作)

l 数据库的运行管理

l 数据组织、存储与管理。

l 数据库的保护、维护

l 通信

相当于仓库的管家或Windows操作系统(不用汇编语言)

1.1.4.3、数据的存储方式

我们通常将数据库管理系统称为数据库,当我们安装了数据库(数据库服务器),就可以在数据库服务器中创建数据库,每个数据库中还可以包含多张表

day04关于MySqL—Android小白的学习笔记

通过上述图我们知道了数据库与表之间的关系,那么我们的数据又是怎样存储在数据库中。

day04关于MySqL—Android小白的学习笔记

数据库中的表就是一个多行多列的表格。在创建表时,需要指定表的列数,以及列名称,列类型等信息。而不用指定表格的行数,行数是没有上限的。

表中的列我们称之为字段,表中的行我们称之为记录。

那么用我们熟悉的java程序来与关系型数据对比,就会发现以下对应关系。

类-------表

类中属性-------表中的字段

对象--------记录。

1.2.4.2、退出mysql服务

1. 输入exit

2. 输入quit

3. 直接窗口 ×号关闭

或者直接ctrl+c

1.3、Mysql数据库root密码重置

1) 停止mysql服务器 运行输入services.msc 停止mysql服务

2) 在cmd下 输入 mysqld --skip-grant-tables 启动服务器 光标不动 (不要关闭该窗口)

3) 新打开cmd 输入mysql -u root -p 不需要密码 

use mysql;

update user set password=password('1234') WHERE User='root';

4) 关闭两个cmd窗口 在任务管理器结束mysqld 进程

5) 在服务管理页面 重启mysql 服务

密码修改完成

1、 数据库操作(重点)

2.1、SQL介绍
2.1.1、什么是SQL?作用是什么?

结构化查询语言(Structured Query Language)简称SQL,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统

SQL语言就是给DBMS下命令的语言

2.1.2、SQL的分类

SQL一共分成四类,如下所示:

Ø 数据定义语言:简称DDL(Data Definition Language),用来定义数据库对象:数据库,表,列等,例如创建、删除、修改:数据库、表结构等;数据库或者数据表结构的操作

Ø 数据操作语言:简称DML(Data Manipulation Language),用来对数据库中表的记录进行更新,例如:增、删、改表记录;表数据的增删改

Ø 数据控制语言:简称DCL(Data Control Language),用来定义数据库的访问权限和安全级别,及创建用户;

Ø 数据查询语言:简称DQL(Data Query Language),用来查询数据库中表的记录。查询表数据

大家可能会对DDL和DML分的不太清楚,DDL是对数据库或表的结构进行操作,而DML是对表的记录进行操作(增、删、改)。以上四个分类,我们以后最常用的就是DDL、DML、DQL,其中,DQL是难点。

2.1.3、SQL的语法

SQL的语法有以下要求:

l SQL语句可以单行或多行书写,必须以分号结尾;

l 可使用空格和缩进来增强语句的可读性;

l MySQL数据库的SQL语句不区分大小(默认),一般建议使用大写,例如:SELECT * FROM user。(因为大写可读性太差,一般开发人员会以小写测试,正式放在代码上都用大写)

2.2、数据库的库结构的操作(DDL)
2.2.1、创建数据库

1.使用默认的字符集与校对 

create database 数据库名;

2.可以指定数据库字符

create database 数据库名  CHARACTER  set gbk;

练习:

创建一个名称为mydb1的数据库。

create database mydb1;

创建一个使用utf8字符集的mydb2数据库。

create database mydb2 character set utf8;

2.2.2、查看数据库

查看当前数据库服务器下所有数据库

show databases;

查看数据库字符集的语句

show create database 数据库名;

练习:

查看当前数据库服务器中的所有数据库

show databases;

查看前面创建的mydb2数据库的定义信息

show create database mydb2;

2.2.3、修改数据库

修改数据库操作我们很少使用,了解一下语法就可以。

修改数据库的编码集

alter database 数据库名称  character set 编码

练习:

查看服务器中的数据库,并把其中某一个库的字符集修改为utf8;

show create database mydb2;

alter database mydb2 character set utf8 collate utf8_general_ci;

2.2.4、删除数据库

删除数据库

drop database 数据库名

练习:

删除前面创建的mydb1数据

2.2.5、其他关于库的操作

1.切换数据库

use 数据库名称

2.查看当前所使用的事数据库

select database();

2.3、数据库的表结构操作(DDL)
2.3.1、数据表中字段类型

MySQL与Java一样,也有数据类型,MySQL中的数据类型主要应用在列上。我们在定义表的时候对每一列的定义有列名和列类型。这个列类型就是我们今天要讲的数据类型。

在java中常见的数据类型

基本类型: 

整型  byte short int long

浮点  float  double

布尔  boolean

字符  char

引用类型

字符串  String

日期  Date 

2.3.1.1、Java---mysql整型对比:

JAVA

MYSQL

byte

TINYINT

short

SMALLINT

int

INT

long

BIGINT

2.3.1.2、Java---mysql浮点型对比:

JAVA

MYSQL

float

float

double

double

BigDecimal

Decimal

Decimal,它也是浮点类型,一般用于货币   例如:decimal(5,2) 长度为5,小数点后保留两位。

boolean----bool boolean 一般情况下直接使用数值类型来描述,直接使用int或字符串

2.3.1.3、Java---mysql布尔型对比:

JAVA

MYSQL

boolean

bool

Mysql中没有布尔类型。没有真正意义上的true和false

官方:Bool中,0被视为假。非0视为真。

在将来,将根据标准SQL引入完全布尔类型的处理。

开发:

一般用字符串 存  true  false

Int       0false   1---》trues

2.3.1.4、Java---mysql字符及字符串对比:(重点)

JAVA

MYSQL

Char

Char/varchar

String

Char/varchar

在mysql 中字符与字符串是一样的,均可以用用Char和Varchar来存储。

Char和Varchar的区别:

Char

Varchar

char创建时可以指定长度,也可以不指定,默认为1

Varchar创建时必须指定长度,否则报错

char是一个固定长度字符串,指定长度后,

如果字符串小于指定长度,那么在存储时尾部填充空格以达到指定长度,然后再保存。(检索时,检索到的char值会删除尾部空格)。

超出指定长度无法存储

Varchar是一个可变长度字符串,指定长度后,

如果字符串小于指定长度,那么存储时正常存储,尾部不填充空格。

超出指定长度无法存储

Char检索效率极高,但占用空间大。

Varchar检索效率极低,但因为不填充空格,对空间占用较小。

根据实际情况,偏向查询效率用char,偏向空间占用小用varchar

2.3.1.5、Java---mysql日期对比:

在jdk API中有这样的类 

java.util.Date

JAVA

MYSQL

java.sql.Date

Date  

只能保存年月日 2015-07-07

默认为NULL

如果强行保存年月日时分秒,时分秒不会保存。

例如:保存2015-07-07 15:49:55

Date类型只会存入2015-07-07

java.sql.Time

Time  

只能保存时分秒 15:49:55

默认为NULL

如果强行保存年月日时分秒,年月日不会保存。

例如:保存2015-07-07 15:49:55

time类型只会存入15:49:55

java.sql.TimeStamp

Timestamp  

它代表的是一个时间戳

2015-07-07 15:49:55。

如果不设置值,或者直接添加null,默认为当前系统时间。

(时间戳有效日期 1970-01-01 00:00:00  ~  2037-12-31 23:59:59)

DateTime

保存格式为2015-07-07 15:49:55。

默认为NULL。

Timestamp和DateTime区别:

1、Timestamp默认值为当前系统日期,DateTime默认值为null

2、Timestamp有效日期为1970-01-01 00:00:00  ~  2037-12-31 23:59:59,超过该范畴无法保存;DateTime无限制

2.3.1.6、MySQL中的大数据类型:

SQL语法中:

l Blob-----表示二进制  

Tinyblob(255)   blob(65536)  mediumblob(16m)   longblob(4g)

l text----大文本类型  在oracle中它叫做Clob

Tinytext(255)  text(65536)  mediumtext(16m)  longtext(4g)

2.3.1.7、MySQL中的常用数据类型:

类型

描述

int

整型,和java中的int类型一样;

double

浮点型,例如double(5,2)表示该列存放的数据最多是5位,而且其中必须有2位小数,它的最大值是:999.99;

decimal

浮点型,用于保存对准确精度有重要要求的值,例如与金钱有关的数据。

char

固定长度字符串类型,如果没有指定长度,默认长度是1,如果存储的字符没有达到指定长度,mysql将会在其后面用空格补足到指定长度;

varchar

可变长度字符串类型,它的长度可以由我们自己指定,它能保存数据长度的最大值是65535,如果存储的字符没有达到指定的长度,不会补足到指定长度;

tinytext

可变长度字符串类型,其存储范围是28-1B;

text

也是可变长度字符串类型,其存储范围是216-1B;

mediumtext

也是可变长度字符串类型,其存储范围是224-1B;

longtext

也是可变长度字符串类型,其存储范围是232-1B;

tinyblob

是可变长度二进制类型,其存储范围是28-1B;

blob

是可变长度二进制类型,其存储范围是216-1B;

mediumblob

也是可变长度二进制类型,其存储范围是224-1B;

longblob

也是可变长度二进制类型,其存储范围是232-1B;

date

日期类型,格式为yyyy-MM-dd,只有年月日,没有时分秒;

time

时间类型,格式为hh:mm:ss,只有时分秒,没有年月日;

timestamp

时间戳类型,格式为:yyyy-MM:dd hh:mm:ss,年月日,时分秒都有。

2.3.1.8、练习

创建一个用户表

id 整型

username 字符串 长度20 

password 字符串 长度20 

gender 字符串 长度10

email 字符串 长度50

telephone 字符串 长度 20

introduce 字符串 长度100

activecode 字符串 长度50

state 整型 

role 字符串 长度10 

registTime  时间戳 

实现代码:

create table user(

id int,

username varchar(20),

password varchar(20),

gender varchar(10),

email varchar(50),

telephone varchar(20),

introduce varchar(100),

activecode varchar(50),

state int,

role varchar(10),

registTime timestamp

);

2.3.2、创建数据表

1.创建表---使用默认的字符集与校对

create table 表名(

字段1 类型,

字段2 类型,

.....

);

2.创建表--指定字符集与校对

create table 表名(

字段1 类型,

字段2 类型,

.....

) character set 字符集;

表名后面的内容需要使用“()”括起来,里面的内容是表结构,由列名和列类型组成,列名与列类型之间用空格隔开,每一列之间用逗号隔开,最后一列后面不需要加逗号,语句结束后需要加“;”。

2.3.3、创建数据表约束(重要)

它是用于限定表中字段。

我们在mysql课程中会介绍5种约束(注意:数据库中一共有六种约束,而mysql只支持五种) 在SQL中支持的约束:

l 主键约束

l 非空约束

l 唯一约束

l 默认约束

l Check约束(mysql不支持)

2.3.3.1、主键约束

主键是用于标识当前记录的字段唯一。

它的特点是非空,唯一。

在开发中一般情况下主键是不具备任何意义,只是用于标识当前记录。

创建主键:

1. 在创建表时,在字段后面加上  primary key.

创建单一主键:

create table tablename(

id int primary key,

.......

)

2. 也可以表创建的最后来指定主键

创建联合主键: create table tablename(

id int,

name varchar(20),

primary key(id,name)

)

删除主键:alter table tablename drop primary key ;

一个表最多一个主键

2.3.3.2、唯一约束

当前列的值不为重复. 后面加unique  

例如:username varchar(20) unique

注:NULL值不参与唯一性判断

删除:alter table 表名 drop index 字段名

2.3.3.3、非空约束

当前列的值不能为空。 后面加 not null

例如:username varchar(20) not null

2.3.3.4、默认值约束

为当前列设置默认值。后面加 default 值

例如:utype varchar(20) default "vip"

忽略当前列不填,就会触发默认值约束

2.3.3.5、主键自动增长

为唯一的主键值设置自动增长策略。

在后面加auto_increment

注意:

l 必须是整型,必须为唯一。(主键约束或者唯一约束)

l 当手动成功添加主键值时,如果手动添加的值大于自动值,那么自动值设定为手动值,如果手动值小于自动值,自动值不改变。

忽略主键或者主动设置null值,都会触发主键自动增长策略

扩展:

mysql : auto_increment 自动增长

sqlserver: identity(1,1)

oracle:sequence序列

2.3.3.6、练习

2.3.4、查看数据表

l 查看表结构

desc 表名;

l 查看当前数据库下所有表

show tables;

l .查看表的字符编码集

show create table 表名;

2.3.5、修改数据表(结构)

l 修改表的结构

语法格式:alter table 表名 关键字 ….;

关键字有以下几个:

1.add----添加列操作   alter table 表名  add 列名 类型;

2.modify--修改列的类型 alter table 表名  modify 列名  类型;

3.drop --删除列  alter table 表名  drop 列名.

4.change—更改列名及类型  alter table 表名 change 旧列名  新列名  类型;

l 修改表的名称

rename table 旧表名 to 新表名;

l 修改表的字符编码集

alter table 表名 character set 字符集;

练习

在上面员工表的基本上增加一个image列。

alter table user add image blob;

修改job列,使其长度为60。

alter table user modify job varchar(60);

删除gender列。

alter table user drop gender;

表名改为employe。

rename table employee to employe;

修改表的字符集为utf8

alter table employee character set utf8;

列名name修改为username

alter table employee change column name username varchar(20);

alter table employee change name username varchar(20);

2.3.6、删除数据表

drop table 表名;

2.4、数据库的表数据操作(DML)
2.4.1、插入表数据(INSERT)
2.4.1.1、格式

l 指定列名:

insert into 表名(列名1,列名2) values(列值1, 列值2);

忽略某些字段不写。

可以自定义字段插入顺序

表名后面是当前表中部分字段名称

l 不指定列名:

insert into 表名 values(列值1, 列值2, ...);

l 没有给出要插入的列,那么表示顺序插入所有列;

l 值的个数必须是该表的列的个数一一对应;

2.4.1.2、插入操作注意事项

l 插入的数据应与字段的数据类型相同

l 数据的大小应该在列的长度范围内

l 在values中列出的字段名必须和字段值一一对应

l .除了数值类型外,其它的字段类型的值必须使用单引号引起。

l 如果要插入空值,可以忽略不写,或者插入 null.

l 注意:对于自动增长的列在操作时,直接插入null值即可.

l 对于Timestamp类型,直接插入null值即可插入当前系统时间。

2.4.2.1、格式

一般格式:

update 表名 set 字段1名称=值 ,字段2名称=值,...;

注:以上会将所有记录中的字段值都进行修改。开发中一般不使用。而实际开发中的修改操作都是有条件修改

有条件修改:

update 表名set 字段1名称=值 ,字段2名称=值,...where 条件.

2.4.2.2、练习

练习:修改user表中信息

1. 所有人的password修改为”456”

2. 将名字叫tom的用户email修改为tom@itcast.cn

3. 将tom的gender修改为”female”,并且introduce修改为”good girl”

实现代码:

1、

update user set password='456';

2、

update user set email='tom@itcast.cn' where username='tom';

3、

update user set gender='female',introduce='good girl' where username='tom';

2.4.3、删除表数据(DELETE)
2.4.3.1、格式

一般格式:

delete from 表名.

注:以上会将所有记录都删除。开发中一般都是有条件删除

有条件删除:

delete from 表名 where 条件.

2.4.3.2、删除操作注意事项

思考:

关于以下几种删除操作的区别:

drop table 表名

delete from 表名

truncate表名

drop table 表名 --------删除表结构。

delete from 表名  ----------删除表记录(逐条)

truncate表名  ---------删除表结构,并重新创建表结构

笔试题:

Delete和truncate的区别:

1、 delete是逐条删除,条目较多时效率低下

truncate是删除了表结构后重新创建,对于条目较多时效率较高。

2、 delete是dml语句,数据可以找回。(通过事务回滚)

truncate和drop 是ddl语句,数据删除后无法找回。(无法事务回滚)

3、 delete语句不会将auto_increment初始化。

Truncate会将auto_increment初始化。

2.4.4、编码问题

下面我们向user表中插入一条记录

insert into user(username,password) values(‘张三’,’123’);

当执行这条sql时,会报错

ERROR 1366 (HY000): Incorrect string value: '\xD5\xC5\xC8\xFD' for column 'username' at row 1

原因:

因为mysql的客户端编码的问题我们的是utf8,而系统的cmd窗口编码是gbk

解决方案(临时解决方案):

修改mysql客户端编码就可以。

show variables like 'character%'; 查看所有mysql的编码

day04关于MySqL—Android小白的学习笔记

在图中与客户端有关的编码设置:

client connetion result 和客户端相关 、

database server system 和服务器端相关 

将客户端编码修改为gbk.

set character_set_results=gbk; / set names gbk;

以上操作,只针对当前窗口有效果,如果关闭了服务器,失效。

如果想要永久修改,通过以下方式:

在mysql安装目录下有my.ini文件

default-character-set=gbk 客户端编码设置

character-set-server=utf8 服务器端编码设置

注意:修改完成配置文件,重启服务

2.4.5、查询表数据(SELECT)
2.4.5.1、格式
2.4.5.1.1、查询所有字段数据

select * from 表名;

注意:使用"*"在练习,学习过程中可以使用,在实际开发中,不建议使用。会严重消耗性能及阅读不方便

2.4.5.1.2、查询指定字段

select 字段1,字段2,...from 表名;

2.4.5.1.3、去掉重复记录

select distinct 字段 from 表名;

distinct它的作用是去除重复.

2.4.5.1.4、使用别名

字段名 as 别名

使用as 别名可以给表中的字段,表设置别名。

不对表中结构进行修改。

as可以省略

2.4.5.1.5、查询中的列运算

字段+四则运算符号+运算数

例如: sal+100

对表中数据本身无影响

2.4.5.1.6、ifnull函数 (滤空函数)

在对数值类型的列做运算的时候,如果做运算的列的值为null的时,运算结果都为null,为了解决这个问题可以使用ifnull函数

Ifnull(需要过滤的字段名,需要把null替换成什么)

滤空函数并不会对表数据产生影响,只会操作展示效果

例如:ifnull(sal,0)  意思是如果字段sal某一条记录为null,那么将其作为0返回

2.4.5.2、where子句

我们在开发中,使用select操作,一般都是有条件查询,那以我们介绍一下关于where子句的使用

2.4.5.2.1、格式

select 字段  from 表名  where 条件;

2.4.5.2.2、where子句条件种类

1、比较运算符

>= 

<= 

!=   可以用    <>   替代

2、逻辑运算符

and  条件交集

or   条件并集

not  条件取反

Not 效率极低

3、between…and…

区间取值

相当于>= and <=

注意:between小值 and大值

select * from pro where id>=2 and id<=9;

select * from pro where id between 2 and 9;

上下两句完全等价的

4、in

可以比较多个值

相当于 or or or ……

select * from pro where id=1 or id=3 or id=5 or id=7 or id=9;

select * from pro where id in(1,3,5,7,9);

上下两句效果完全等价,效率  in   比较高的

5、null值操作

is null; 判断为空

is not null; 判断不为空(not 字段 is null)

数据库中null值不能使用=号比较

6、like

模糊查询

通配符使用:

1.% 匹配所有(0~多个任意字符)

2._ 匹配一个任意字符

2.4.5.2.3、练习

1. 查询所有计算机类商品信息

2. 查询出商品价格大于90的商品信息

3. 查询出商品总价大于10000的商品信息

4. 查询出价格在100-200之间的商品信息

5. 查询出商品价格是65,100或190的商品信息

6. 查询出商品的名称中包含java的商品信息。

7. 查询出书名是两个字的商品信息

8. 查询出商品价格不为null商品信息

代码实现:

1、 SELECT * FROM products WHERE category="计算机";

2、 SELECT * FROM products WHERE price>90;

3、 SELECT * FROM products WHERE (price*pnum)>10000

4、 SELECT * FROM products WHERE price>=100 AND price<=200;

SELECT * FROM products WHERE price BETWEEN 100 AND 200;

5、 SELECT * FROM products WHERE price=65 OR price=100 OR price=190;

SELECT * FROM products WHERE price IN(65,100,190);

6、 SELECT * FROM products WHERE NAME LIKE "%java%";

7、 SELECT * FROM products WHERE NAME LIKE "__";

8、 SELECT * FROM products WHERE price IS NOT NULL;

SELECT * FROM products WHERE NOT price IS NULL;

2.4.5.3、order by 排序
2.4.5.3.1、格式

在开发中,我们从数据库中查询出的数据经常需要根据某些字段进行排序,可以使用order by关键字,后面跟的就是要排序的列

格式:

order by 字段名asc 升序 (默认)

order by 字段名desc 降序

多个字段排序:

order by 字段名1 desc,字段名2  asc.

按照字段1降序,如果字段1值相等,把相等数据则按照字段2进行升序排序

注:order by 子句是select的最后的一个子句。

2.4.5.3.2、练习

1. 查询出所有商品,并根据价格进行升序排序

2. 查询出所有商品,根据数量进行升序排列,如果数量相同,根据价格进行降序排列

代码实现:

1、SELECT * FROM products ORDER BY price ASC;

2、SELECT * FROM products ORDER BY pnum ASC, price DESC;

2.4.5.4、分组函数(聚合函数)

分组函数又名 聚合函数、聚集函数

之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个单一的值;另外聚合函数会忽略空值。

今天我们学习如下五个聚合函数:

用分组函数时,null不参与分组函数运算,必须要和ifnull函数联合使用

l count:统计指定列不为NULL的记录行数;

l sum:计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;如果是NULL,那么忽略;

l max:计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算(字符串排序无意义);如果是NULL,那么忽略;

l min:计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算(字符串排序无意义);如果是NULL,那么忽略;

l avg:计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;如果值为NULL,那么忽略;

sum,max,min,avg均用来对数值类型进行运算,开发中不会对非数值类型进行此类运算

思考练习:

1. 统计商品表*有多少条记录

SELECT COUNT(*) FROM products;

2. 统计商品表中价格大于50的有多少条记录

SELECT COUNT(*) FROM products WHERE price>50;

3. 统计所有商品的总数

SELECT SUM(pnum) FROM products;

4. 统计所有商品的总价值

SELECT SUM(pnum*price) FROM products;

SELECT SUM(pnum*IFNULL(price,0)) FROM products

5. 统计所有商品的平均价格

SELECT SUM(pnum*price)/SUM(pnum) FROM products;

6. 统计出记录中price的平均值

SELECT AVG(price) FROM products;

7. 统计出商品表中price最大与最小值

SELECT MAX(price),MIN(price) FROM products;

SELECT MAX(price),MIN(IFNULL(price,0)) FROM products;

2.4.5.5、分组查询

分组查询是指 在查询时对 数据记录 根据某一字段 进行组别划分,字段值相同划分成一组。

2.4.5.5.1、格式

group by 字段名

将查询出来的记录按照 指定字段 进行 分组,字段值相同的划分成为一组。

2.4.5.5.2、having子句

对分组后的数据进行筛选过滤,类似于where

group by 字段名 having 条件;