MySql
- 一.数据库,数据表的基本操作
- 1.数据库的基本操作
- 2. 数据表的基本操作
- 2.1 数据库的数据类型
- 2.1.1 整数类型
- 2.1.2 浮点数类型和定点数类型
- 2.1.3 字符串类型
- 2.1.4 日期与时间类型
- 2.2 数据表的基本操作
- 2.2.1 创建一个数据表
- 2.2.2 查看数据表
- 2.2.3 查看表的基本信息的MySQL指令
- 2.2.4 查看数据表结构的MySQL指令
- 2.2.5 修改数据表(不做重点)
- 2.2.6 删除数据表
- 2.3 数据表的插入
- 2.3.1 为表中所有字段插入数据
- 2.3.2 为表中指定字段插入数据
- 2.3.3 同时插入多条记录
- 2.4 数据表的约束
- 2.4.1 主键约束
- (1) 第一种主键约束(常用)
- (2) 第二种主键约束
- (3) 自增主键
- 2.4.2 非空约束
- 2.4.3 默认值约束
- 2.4.4 唯一性约束
- 2.4.5 外键约束
- 2.4 更新(修改)数据
- 2.4.1 UPDATE基本语法
- 2.4.2 UPDATE更新部分数据
- 2.4.3 UPDATE更新全部数据
- 2.5 删除数据
- 2.5.1 DELETE基本语法
- 2.5.2 DELETE删除部分数据
- 2.5.3 DELETE删除全部数据
- 2.5.4 TRUNCATE和DETELE的区别
- 3. MySQL数据表的简单查询.
- 3.1 全列查询
- 3.2 指定列查询
- 3.3 查询字段为表达式
- 3.4 别名
- 3.5 去重:DISTINCT
- 3.6 排序:ORDER BY
- 3.7 条件查询:WHERE
- 1. 基本查询
- 2. 逻辑查询
- 3. 范围查询
- 4.模糊查询:LIKE
- 5.NULL 的查询:IS [NOT] NULL
- 3.8 分页查询:LIMIT
- 4. 函数
- 1.聚合函数
- 1.1 count()
- 1.2 max()
- 1.3 min()
- 1.4 sum()
- 1.5 avg()
一.数据库,数据表的基本操作
1.数据库的基本操作
MySQL安装完成后,要想将数据存储到数据库的表中,首先要创建一个数据库。创 建数据库就是在数据库系统中划分一块空间存储数据,语法如下:
create database 数据库名称;
创建一个名为Demo1的数据库:
create database Demo1;
创建结果:
说明:
如果数据库中已经有了这个库,则不进行创建!
创建数据库后查看该数据库基本信息MySQL命令:
show create database Demo1;
运行后的结果为:
此时数据库默认的字符集编码为latinl
,但是由于这个字符集编码不支持中文,所以我们可以通过下面的指令修改该数据据库的字符集:
将数据库的字符集修改为 utf8 MySQL命令:
alter database Demo1 character set utf8;
此时如果我们想要插入的是中文字符串也是不会报错的!(后面讲到)
- 说明:MySQL的utf8编码不是真正的utf8,没有包含某些复杂的中文字符。MySQL真正的utf8是使用utf8mb4,建议大家都使用utf8mb4
运行结果:
查询出MySQL中所有的数据库MySQL命令:
show databases;
运行结果:
此时左下角的14就说明我们的数据库有14个.
切换数据库 MySQL命令:
use 数据库名;
我们选中刚才创建的Demo1数据库.
use Demo1;
运行结果:
查看当前使用的数据库 MySQL命令:
select database();
运行结果:
数据库的删除操作:
drop database 数据库名;
运行结果展示:
此时数据库表中已经没有Demo1这个数据库了,并且下面的数字也由14变为了13.
数据库删除以后,内部看不到对应的数据库,里边的表和数据全部被删除
总结一下数据库基本操作的注意事项:
(1) 每个sqL语句都需要用 ’ ; ’ 结尾.
(2) show databases; sql语句之间,每个关键字需要用空格隔开.
(3) 注意!在查看数据库时,用的是databases
而不是 database
切记最后的 s 不要弄混!
(4) 在创建数据库时可以直接指定字符集,此时需要的操作就是create database 数据库名 charset 字符集名称
通过关键字 charset 来实现!
(5) 数据库的命名规则: 数字,下划线,字母构成,名字不能是 SQL 关键字,并且数据库名字不能只包含数字!!!
(6) 对于删除数据库的操作一定要谨慎谨慎再谨慎, 除了谨慎还是TM的谨慎!!
2. 数据表的基本操作
2.1 数据库的数据类型
由于我们创建数据表需要指定类型,所以我们这里优先讲解一下类型:
2.1.1 整数类型
根据数值取值范围的不同MySQL 中的常见的整数类型可分为4种,分别是TINYINT、SMALLINT、INT和 BIGINT。下图列举了 MySQL不同整数类型所对应的字节大小和取值范围而最常用的为INT类型的,
数据类型 | 大小 | 无符号取值范围 | 有符号取值范围 | 对应java类型 |
---|---|---|---|---|
TINYINT | 1 | 0~255 | -128~127 | Byte |
SMALLINT | 2 | ~65535 | -32768~32768 | Short |
INT | 4 | 0~4294967295 | -2147483648~ 2147483648 | Integer |
BIGINT | 8 | 0~18446744073709551615 | -9223372036854775808~9223372036854775808 | Long |
2.1.2 浮点数类型和定点数类型
在MySQL数据库中使用浮点数和定点数来存储小数。浮点数的类型有两种:单精度浮点数类型(FLOAT)和双精度浮点数类型(DOUBLE)。而定点数类型只有一种即DECIMAL类型。下图列举了 MySQL中浮点数和定点数类型所对应的字节大小及其取值范围:
数据类型 | 大小 | 说明 | 对应java类型 |
---|---|---|---|
FLOAT(M,D) | 4字节 | 单精度,M指定长度,D指定小数位数。会发生精度丢失 | Float |
DOUBLE | 8个字节 | Double | |
DECIMAL(M,D) | M/D最大值+2 | 双精度,M指定长度,D表示小数点位数。精确数值 | BigDecimal |
NUMERIC(M,D) | M/D最大值+2 | 和DECIMAL一样 | BigDecimal |
从上图可以看出DECIMAL类型的取值范围与DOUBLE类型相同。但是,请注意:DECIMAL类型的有效取值范围是由M和D决定的。其中,M表示的是数据的长 度,D表示的是小数点后的长度。比如,将数据类型为DECIMAL(3,1)的数据10.12 插人数据库后显示的结果为10.1.
声明:
decimal 是使用了类似于字符串的方式保存的,更精准存储,单存储空间更大,计算速度更慢了.
总结:DECIMAL(精度高,占用内存大效率慢)
2.1.3 字符串类型
在MySQL中常用CHAR 和 VARCHAR 表示字符串。两者不同的是:VARCHAR存储可变长度的字符串。
当数据为CHAR(M)类型时,不管插入值的长度是实际是多少它所占用的存储空间都是M个字节;而VARCHAR(M)所对应的数据所占用的字节数为实际长度加1
插入值 | CHAR(3) | 存储需求 | VARCHAR(3) | 存储需求 |
---|---|---|---|---|
‘’ | ‘’ | 3个字节 | ‘’ | 1个字节 |
‘a’ | ‘a’ | 3个字节 | ‘a’ | 2个字节 |
‘ab’ | ‘ab’ | 3个字节 | ‘ab’ | 3个字节 |
‘abc’ | ‘abc’ | 3个字节 | ‘abc’ | 4个字节 |
‘abcd’ | ERROR | ERROR | ERROR | ERROR |
如下图:
只能最多插入三个字符,且占用内存一直是3个字节.
当我插入”abcd”时就会报错,所以不管时CHAR 或者 VARCHAR 都不能超过指定的字符个数,但是他们的区别就是CHAR始终占用的内存为指定的字节个数,但是VARCHAR是变长字节,会根据你输入的字符串大小自动分配字节个数(字符串长度不超过指定长度)
所以以后我们如果涉及到字符串这个类型,常使用varchar就好!
2.1.4 日期与时间类型
MySQL提供的表示日期和时间的数据类型分别是 :YEAR、DATE、TIME、DATETIME 和 TIMESTAMP。下图列举了日期和时间数据类型所对应的字节数、取值范围、日期格式以及零值:
数据类型 | 字节数 | 取值范围 | 日期格式 | 零值 |
---|---|---|---|---|
YEAR | 1 | 1901~2155 | YYYY | 0000 |
DATE | 4 | 1000-01-01~9999-12-31 | YYYY-MM-DD | 0000-00-00 |
TIME | 3 | -838:59:59~ 838:59:59 | HH:MM:SS | 00:00:00 |
DATETIME | 8 | 1000-01-01 00:00:00~9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 0000-00-00 00:00:00 |
TIMESTAMP | 4 | 1970-01-01 00:00:01~2038-01-19 03:14:07 | YYYY-MM-DD HH:MM:SS | 0000-00-00 00:00:00 |
2.2 数据表的基本操作
在我们创建好数据库之后,如果想要对该数据库进行操作,需要先选中该数据库,因为我们的数据表是在数据库的里面执行的!
选择数据库的语句则是;
USE 数据库名字;
今天时间是3_11,那么我创建的数据库名字就为3_11 , 接下来对该数据库进行操作,所以我们需要选择该数据库,也就是 use 3_11;
2.2.1 创建一个数据表
使用MySQL语句创建一个名为Student的表,该表由学生名字,年纪,班级,构成.
我们先了解一下创建一个数据表的基本语法:
create table 表名(字段1 字段数据类型,字段2 字段数据类型....)
切记:这个和我们经常写的java 和 c 不太一样,这个是名字在前,类型在后的,可能大家在写函数的时候习惯了例如 swap(int a,int b)这种写法,但是在数据库中就需要 swap(a int ,b int)这样的写法了.
那我们开始实现上面的任务;
我们先要了解学生的名字什么类型,年龄,班级都分别是什么类型,再去根据这些类型来建表.
我们可以大概了解到,名字是由字符串构成的,所以我们可以将类型设置为varchar(10),因为一般的名字都不会超过10个字,记住!在数据库中(一个汉字 = 一个字符!!!) 那么年龄我们可以设置为int,因为年龄都是整数的,班级的话我们也可以设置为字符串类型,例如(“高三四班”),此时类型确认了,我们上手实践!
create table student (name varchar(10),age int,class varchar(20));
此时我们就创建成功一个Student的表,接下来我们可以查看这个数据表.
2.2.2 查看数据表
MySQL语法如下:
show tables;
运行结果如下:
此时在我们的数据库中就有一个student的表了.
2.2.3 查看表的基本信息的MySQL指令
show create table student;
运行结果,此时他会将表的基本类型都列出来
2.2.4 查看数据表结构的MySQL指令
desc student;
运行结果:
2.2.5 修改数据表(不做重点)
有时,希望对表中的某些信息进行修改,例如:修改表名、修改字段名、修改字段 数据类型…等等。在MySQL中使用alter table修改数据表.
MySQL语句为:
alter table student rename to stu;
修改字段名(列名)的MySQL指令:
alter table stu change name sname varchar(10);
运行结果:
修改字段数据类型 MySQL命令:
alter table stu modify sname int;
运行结果:
增加字段 MySQL命令:
alter table stu add address varchar(50);
运行结果:
总结:这些操作在真正的数据库中很少遇见,几乎都是在创建数据表时都已经指定了这些类型,不会再进行修改了,如果非要修改的话,切记三思!!!危险系数很大很大!!!
2.2.6 删除数据表
删除数据表的MySQL语句:
drop table 表名;
我们删除stu这个表举例:
drop table stu;
运行结果:
2.3 数据表的插入
由于后续会需要打印数据表中的数据来判断插入是否成功,所以我们先记住这个sql语句:
select * from 表名;
这样就可以将表中的数据全部打印出来了.
在MySQL通过INSERT语句向数据表中插入数据。在此,我们先准备一张学生表,该学生表具备的字段有(学生ID,姓名,年龄)代码如下:
create student (Student_ID int,name varchar(20),age int);
运行结果(此时我们创建好了一个表):
2.3.1 为表中所有字段插入数据
每个字段与其值是严格一一对应的。也就是说:每个值、值的顺序、值的类型必须与对应的字段相匹配。但是,各字段也无须与其在表中定义的顺序一致,它们只要与 VALUES中值的顺序一致即可。
语法如下:
INSERT INTO VALUES (值 1,值 2,...);
示例: 用MySQL语句向学生表插入一个学生的数据;
insert into student values(666666,'李四',22);
但是需要注意的是,此时插入的数据的类型的顺序一定是和你在创建这个表的字段类型的顺序一致的.如下图:
需要注意的事项:
2.3.2 为表中指定字段插入数据
INSERT INTO 表名(字段名1,字段名2,...) VALUES (值 1,值 2,...);
插入数据的方法基本和给表中所有字段插入数据一样,只是需要插入的字段由你自己指定,例如我们有的学生还不清楚自己的准确年龄,所以我们可以通过指定字段先插入它的学生ID和他的名字:
insert into student (student_ID ,name) values(123456,"雅雅");
运行结果:
2.3.3 同时插入多条记录
语法如下:
INSERT INTO 表名 [(字段名1,字段名2,...)]VALUES (值 1,值 2,…),(值 1,值 2,…),...;
在该方式中:(字段名1,字段名2,…)是可选的,它用于指定插人的字段名;(值 1,值 2,…),(值 1,值 2,…)表示要插人的记录,该记录可有多条并且每条记录之间用逗号隔开。
示例:对学生表进行学生信息的多组插入
insert into student (student_ID ,name ,age) values(123123,'张三',18),(666666,'李四',22),(456789,'王五',23);
2.4 数据表的约束
为防止错误的数据被插入到数据表,MySQL中定义了一些维护数据库完整性的规则;这些规则常称为表的约束。常见约束如下:
约束条件 | 说明 |
---|---|
PRIMARY KEY | 主键约束,用于唯一标识对应的记录 |
FOREIGE KEY | 外键约束 |
NOT NULL | 非空约束 |
UNIQUE | 唯一性约束 |
DEFAULT | 默认值约束,用于设置字段的默认值 |
以上五种约束条件针对表中字段进行限制从而保证数据表中数据的正确性和唯一性。换句话说,表的约束实际上就是表中数据的限制条件。
2.4.1 主键约束
主键约束用于唯一的表示表中的每一行,被标识为主键的数据在表中是唯一的且值不能为空,这点类似于我们每个人都有一个身份证号,并且这个身份证号唯一!
(1) 第一种主键约束(常用)
我们想要创建一个年级表,该表只有两个属性,一个是表示年级的ID,一个是表示该ID对应的年级是几年级.
主键约束的MySQL语句如下:
字段名 字段类型 primary key;
我们通过第一个主键约束的方法创建一个年级表:
我们的年级ID是唯一的,所以年级ID我们可以设置为主键.
(2) 第二种主键约束
MySQL语句:
(字段名 字段类型,字段名 字段类型...,primary key(需要主键约束的字段名))
下面用插入数据给大家证明一下什么是被主键约束后的效果:
还有一个小细节:就是被主键约束后的字段是不能为空的,上述图片没有画出来,但是大家可以自己查看.
我们再进行一个对比,对比一个没有被主键约束的年纪表是什么样的:
总结:被主键约束后的字段,只能出现一次,一定不能重复出现.
(3) 自增主键
对于整数类型的主键,常配搭自增长auto_increment
来使用。插入数据对应字段不给值时,使用最大值+1
MySQL 语法:
-- 主键是 NOT NULL 和 UNIQUE 的结合,可以不用 NOT NULL字段名 字段类型 PRIMARY KEY auto_increment;
我们再来对比一下没有被自增主键约束的学生表.
2.4.2 非空约束
非空约束即 NOT NULL指的是字段的值不能为空,基本的语法格式如下所示:
字段名 数据类型 NOT NULL;
示例:
依旧是上面的年级表举例:
这个是name字段被非空约束的.
对比没有被非空约束的:
2.4.3 默认值约束
默认值约束即DEFAULT用于给数据表中的字段指定默认值,即当在表中插入一条新记录时若未给该字段赋值,那么,数据库系统会自动为这个字段插人默认值;其基本的语法格式如下所示:
字段名 数据类型 DEFAULT 默认值;
此时我们还是按照上面的年级表举例;
2.4.4 唯一性约束
唯一性约束即UNIQUE用于保证数据表中字段的唯一性,即表中字段的值不能重复出现,其基本的语法格式如下所示
字段名 数据类型 UNIQUE;
示例:
create table grade(ID int UNIQUE,name varchar(20));
结果展示:
有人可能会问: 这个主键和这个唯一性约束有什么区别:
PRIMARY KEY | UNIQUE | |
---|---|---|
可以为空 | NO | YES |
只能存在一个 | YES | NO |
我们也可以理解为:
一个表只能有一个主键,但是可以有好多个UNIQUE,而且UNIQUE可以为NULL
值,如员工的电话号码一般就用UNIQUE,因为电话号码肯定是唯一的,但是有的员工可能没有电话。
主键肯定是唯一的,但唯一的不一定是主键;
不要总把UNIQUE索引和UNIQUE约束混为一谈
1、primary key = unique + not null
2、唯一约束和主键一样都是约束的范畴,而且都可以作为外键的参考,不同的是,一张表只能有一个主键
3、主键和唯一约束的创建需要依靠索引,如果在创建主键或唯一约束的时候没有已经建好的索引可以使用的话,MySQL会自动建立一个唯一的索引。
2.4.5 外键约束
外键用于关联其他表的主键或唯一键,语法:
foreign key (字段名) references 主表(列)
我们来形容一下什么是外键约束,我们创建一个年级表:
我们再来思考一下:如果我有一个学生类,我这个学生类可不可以通过某些东西和这个年级关联.
前提讲过了,我们可以通过外键约束,使两个表产生关联,但是外键约束的前提是,外键用于关联其他表的主键或唯一键,那么我们可以和年级表的ID关联一起.代码如下:
下面图片是两个表的结构:
外键约束需要注意的事项:
1.子表添加元素时,如果父表没有匹配的项则添加失败.
2.父表删除时如果子表有匹配的项删除失败
总结:
借鉴别人的
外键的使用需要满足下列的条件: 1. 两张表必须都是InnoDB表,并且它们没有临时表。 2. 建立外键关系的对应列必须具有相似的InnoDB内部数据类型。 3. 建立外键关系的对应列必须建立了索引。 4. 假如显式的给出了CONSTRAINT symbol,那symbol在数据库中必须是唯一的。假如没有显式的给出,InnoDB会自动的创建。 如果子表试图创建一个在父表中不存在的外键值,InnoDB会拒绝任何INSERT或UPDATE操作。如果父表试图UPDATE或者DELETE任何子表中存在或匹配的外键值,最终动作取决于外键约束定义中的ON UPDATE和ON DELETE选项。InnoDB支持5种不同的动作,如果没有指定ON DELETE或者ON UPDATE,默认的动作为RESTRICT: 1. CASCADE: 从父表中删除或更新对应的行,同时自动的删除或更新自表中匹配的行。ON DELETE CANSCADE和ON UPDATE CANSCADE都被InnoDB所支持。 2. SET NULL: 从父表中删除或更新对应的行,同时将子表中的外键列设为空。注意,这些在外键列没有被设为NOT NULL时才有效。ON DELETE SET NULL和ON UPDATE SET SET NULL都被InnoDB所支持。 3. NO ACTION: InnoDB拒绝删除或者更新父表。 4. RESTRICT: 拒绝删除或者更新父表。指定RESTRICT(或者NO ACTION)和忽略ON DELETE或者ON UPDATE选项的效果是一样的。 5. SET DEFAULT: InnoDB目前不支持。 外键约束使用最多的两种情况无外乎: 1)父表更新时子表也更新,父表删除时如果子表有匹配的项,删除失败; 2)父表更新时子表也更新,父表删除时子表匹配的项也删除。————————————————版权声明:本文为CSDN博主「空白_回忆」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/qq_26291823/article/details/51940487
2.4 更新(修改)数据
在MySQL通过UPDATE语句更新数据表中的数据。在此,我们将就用上面中的student学生表.
2.4.1 UPDATE基本语法
UPDATE 表名 SET 字段名1=值1[,字段名2 =值2,…] [WHERE 条件表达式];
在该语法中:字段名1、字段名2…用于指定要更新的字段名称;值1、值 2…用于表示字段的新数据;WHERE 条件表达式 是可选的,它用于指定更新数据需要满足的条件
2.4.2 UPDATE更新部分数据
update student set name = '雅雅' where name = '小明';
2.4.3 UPDATE更新全部数据
update student set name = "猪猪侠";(单引号双引号都可以)
运行结果:
2.5 删除数据
我们依旧是通过上面的student举例.
2.5.1 DELETE基本语法
在该语法中:表名用于指定要执行删除操作的表. [WHERE 条件表达式]为可选参数用于指定删除的条件。
DELETE FROM 表名 [WHERE 条件表达式];
2.5.2 DELETE删除部分数据
示例:删除ID为4的学生的信息
测试结果:
2.5.3 DELETE删除全部数据
删除student表中的所有记录 MySQL命令:
delete from student;
运行结果:
2.5.4 TRUNCATE和DETELE的区别
TRUNCATE和DETELE都能实现删除表中的所有数据的功能,但两者也是有区别的:
1、DELETE
语句后可跟WHERE
子句,可通过指定WHERE
子句中的条件表达式只删除满足条件的部分记录;但是,TRUNCATE语句只能用于删除表中的所有记录。
2、使用TRUNCATE语句删除表中的数据后,再次向表中添加记录时自动增加字段的默认初始值重新由1开始;使用DELETE语句删除表中所有记录后,再次向表中添加记录时自动增加字段的值为删除时该字段的最大值加1
3、DELETE
语句是DML
语句,TRUNCATE
语句通常被认为是DDL
语句
3. MySQL数据表的简单查询.
3.1 全列查询
--- 通常不建议使用全列查询--- 1.查询的列越多,意味着需要传输的数据量越大--- 2.可能会影响到索引的使用select * from 表名;
我们用全列查询,对student这个表进行查询.
3.2 指定列查询
--- 指定列的顺序不需要按定义表的顺序来SELECT id, name, english FROM exam_result;
还是通过student表实验;
3.3 查询字段为表达式
-- 表达式不包含字段SELECT id, name, 10 FROM exam_result;-- 表达式包含一个字段SELECT id, name, english + 10 FROM exam_result;-- 表达式包含多个字段SELECT id, name, chinese + math + english FROM exam_result;
(1) 表达式不包含字段
(2) 表达式包含一个字段
(3)表达式包含多个字段
3.4 别名
为查询结果中的列指定别名,表示返回的结果集中,以别名作为该列的名称,语法:
select 字段(可以是表达式) as 别名 from 表名;
-- 结果集中,表头的列名=别名SELECT id, name, chinese + math + english as 别名 FROM exam_result
运行结果:
3.5 去重:DISTINCT
使用DISTINCT关键字对某列数据进行去重.
3.6 排序:ORDER BY
-- ASC 为升序(从小到大)-- DESC 为降序(从大到小)-- 默认为 ASCselect * from 表名 order by 字段名 desc(降序);
我们对数学成绩进行排序.
1. 没有 ORDER BY 子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序
2. NULL 数据排序,视为比任何值都小,升序出现在最上面,降序出现在最下面.
3. 使用表达式及别名排序:
小练习:查询同学的总成绩排序.
需要注意的是:
这个写法也是允许的.
4. 可以对多个字段进行排序,排序优先级随书写顺序
我们看下图:
代码如下;
select * from 表名 order by 字段名 升序(降序),字段名(升序)降序...---注意逗号隔开就行.
3.7 条件查询:WHERE
比较运算符:
运算符 | 说明 |
---|---|
>,>=,<,<= | 大于,大于等于,小于,小于等于 |
= | 等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL |
等于,NULL 安全,例如 NULL NULL 的结果是 TRUE(1) | |
!=, | 不等于 |
BETWEEN a0 AND a1 | 范围匹配,[a0, a1],如果 a0 <= value <= a1,返回 TRUE(1) |
IN (option, …) | 如果是 option 中的任意一个,返回 TRUE(1) |
IS NULL | 是 NULL |
IS NOT NULL | 不是 NULL |
LIKE | 模糊匹配。% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符 |
逻辑运算符:
运算符 | 说明 |
---|---|
AND | 多个条件必须都为 TRUE(1),结果才是 TRUE(1) |
OR | 任意一个条件为 TRUE(1), 结果为 TRUE(1) |
NOT | 条件为 TRUE(1),结果为 FALSE(0) |
注:
- WHERE条件可以使用表达式,但不能使用别名。
- AND的优先级高于OR,在同时使用时,需要使用小括号()包裹优先执行的部分
1. 基本查询
– 查询英语不及格的同学及英语成绩 ( < 60 )
select name, english from exam_result where english<60;
– 查询语文成绩好于英语成绩的同学
select * from exam_result where english<chinese;
– 查询总分在 200 分以下的同学
mysql> select name, chinese+math+english as sum from exam_result where english+chinese+math<200;
2. 逻辑查询
– 查询语文成绩大于80分,且英语成绩大于80分的同学
mysql> select * from exam_result where chinese>80 and english>80;
– 查询语文成绩大于80分,或英语成绩大于80分的同学
mysql> select * from exam_result where chinese>80 or english>80;
–观察and和or的优先级
3. 范围查询
1. BETWEEN…and…
查询语文成绩在[70,90]之间的学生.
注意:这个关键字的查询是闭区间查询,如上,查找的是>=70 && <=90的值
select chinese,name from
我们也可以用用逻辑语句实现.
mysql> select chinese,name from exam_result where chinese >= 70 and chinese <=90;
2.IN
查询数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩
SELECT name, math FROM exam_result WHERE math IN (58, 59, 98, 99);
使用 OR 也可以实现
SELECT name, math FROM exam_result WHERE math = 58 OR math = 59 OR math = 98 OR math = 99;
4.模糊查询:LIKE
% 匹配任意多个(包括 0 个)字符
SELECT name FROM exam_result WHERE name LIKE '孙%';-- 匹配到孙悟空、孙权
这里我们在插入一个孙大娘,看看上述代码能不能查询到.
由此我们可以知道,%这个符号代表0个或多个字符.
所以我们如果想要查找名字中包含’孙’这个字的同学,可以直接用’%孙%’
如果想要找’孙’字结尾的同学的名字,便可以通过’%孙’来查找.
‘_’匹配严格的一个任意字符
mysql> SELECT name FROM exam_result WHERE name LIKE '孙_';
5.NULL 的查询:IS [NOT] NULL
在MySQL中,使用 IS NULL关键字判断字段的值是否为空值。请注意:空值NULL不同于0,也不同于空字符串.
我们可以看到这里有很多NULL,那么我们将这些值为NULL的名字查找出来.
-- 查找语文成绩为NULL的同学mysql> select name from exam_result where chinese is NULL;
-- 查找语文成绩不为NULL的同学mysql> select name from exam_result where chinese is not NULL;
3.8 分页查询:LIMIT
大家平时接触到的书,都是一页一页的,比如一页多少行,如果满足这个行数之后就将后续的内容写在下一页.其实我们的分页查询也是这个意思,我们可以指定一页有多少组数据,
MySQL分页查询语法:
-- 起始下标为 0-- 从 0 开始,筛选 n 条结果SELECT ... FROM 表名 [WHERE ...] [ORDER BY ...] LIMIT n;-- 从 s 开始,筛选 n 条结果SELECT ... FROM 表名 [WHERE ...] [ORDER BY ...] LIMIT s, n;-- 从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用SELECT ... FROM 表名 [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;
小知识:关键字LIMIT和我们学的极限符号lim特别相似,所以我们可以通过lim联想到分页查询的limit.
练习:我们通过每组3数据为1页,分别显示1,2,3,页.
我们需要注意的是,分页查询的offset
是从0开始计数的,就和我们数组的下标一样,从0开始.(即使该页不足指定的数据个数也不会有影响)
小练习: 查找总分排名第三的同学
MySQL语法如下:
select * from exam_result order by chinese+math+english desc limit 1 offset 2;
4. 函数
1.聚合函数
在开发中,我们常常有类似的需求:统计某个字段的最大值、最小值、 平均值等等。为此,MySQL中提供了聚合函数来实现这些功能。所谓聚合,就是将多行汇总成一行;其实,所有的聚合函数均如此——输入多行,输出一行。聚合函数具有自动滤空的功能,若某一个值为NULL,那么会自动将其过滤使其不参与运算。
聚合函数使用规则:
只有SELECT子句和HAVING子句、ORDER BY子句中能够使用聚合函数。例如,在WHERE子句中使用聚合函数是错误的。
接下来,我们学习常用聚合函数。
1.1 count()
统计表中数据的行数或者统计指定列其值不为NULL的数据个数
查询有多少该表中有多少人.
代码如下:
select count(*) from 表名 [where 条件];
我们用刚才的成绩表举例:
mysql> select count(*) from exam_result;
当然,我们的NULL是不进行计数的,如下:
1.2 max()
计算指定列的最大值,如果指定列是字符串类型则使用字符串排序运算.
查询该表中语文成绩最好的学生.
MySQL语句:
mysql> select max(chinese) from exam_result ;
1.3 min()
计算指定列的最小值,如果指定列是字符串类型则使用字符串排序运算.
查询该表中语文成绩最差的学生.
MySQL语句:
mysql> select min(chinese) from exam_result ;
1.4 sum()
计算指定列的数值和,如果指定列类型不是数值类型则计算结果为0.
查找所有同学的语文成绩之和.
select sum(chinese) from exam_result ;
运行结果如下:
1.5 avg()
计算指定列的平均值,如果指定列类型不是数值类型则计算结果为
查询该成绩表中语文成绩的平均数 MySQL命令:
select avg(chinese) from exam_result;
运行结果如下;