MySQL基础
目录
- MySQL基础
-
- [一、 MySQL的结构](#一、 MySQL的结构)
- [二、 管理数据库](#二、 管理数据库)
- 三、表的概念
- 四、字段的数据类型
-
- [4.1 整型](#4.1 整型)
- [4.2 浮点型(float和double)](#4.2 浮点型(float和double))
- [4.3 定点数](#4.3 定点数)
- [4.4 字符串](#4.4 字符串)
- [4.5 二进制数据](#4.5 二进制数据)
- [4.6 日期时间类型](#4.6 日期时间类型)
- 五、管理表
-
- [5.1 查看当前数据库的所有表](#5.1 查看当前数据库的所有表)
- [5.2 创建表](#5.2 创建表)
- [5.3 修改表](#5.3 修改表)
- [5.4 删除表](#5.4 删除表)
- [5.5 查看表结构](#5.5 查看表结构)
- [5.6 当然,也可以使用工具管理表,学习课程推荐[在这里(时长:8'47'')](https://www.bilibili.com/video/BV1e64y117iM/?p=18\&vd_source=af535a87de5ddfde1f3bdd19bbbc73b9)(更简便---但是上面咱们列出来的SQL语言也要知道)](#5.6 当然,也可以使用工具管理表,学习课程推荐在这里(时长:8'47'')(更简便---但是上面咱们列出来的SQL语言也要知道))
- 六、管理数据(从这开始是重点内容)
-
- [6.1 查询表的所有数据](#6.1 查询表的所有数据)
- [6.2 给表插入数据](#6.2 给表插入数据)
- 6.3主键-自动增长及字段-默认值设置
- [6.4 修改数据](#6.4 修改数据)
- [6.4 删除表](#6.4 删除表)
- [七、 查询数据(重点)](#七、 查询数据(重点))
-
- [7.1 简单查询](#7.1 简单查询)
- [7.2 条件查询](#7.2 条件查询)
-
- [7.2.1 比较条件](#7.2.1 比较条件)
- [7.2.2 逻辑条件](#7.2.2 逻辑条件)
- [7.2.3 判空条件](#7.2.3 判空条件)
- [7.2.4 模糊条件](#7.2.4 模糊条件)
- [7.3 聚合查询](#7.3 聚合查询)
- [7.4 排序查询](#7.4 排序查询)
- [7.5 分页查询](#7.5 分页查询)
- [7.6 分组查询](#7.6 分组查询)
- [7.7 sql中完成if判断](#7.7 sql中完成if判断)
-
- [7.7.1 case流程控制函数](#7.7.1 case流程控制函数)
- [7.7.2 IF()函数](#7.7.2 IF()函数)
- [7.7.3 字符串的集合操作ELT()](#7.7.3 字符串的集合操作ELT())
- 八、附源码
一、 MySQL的结构
先有数据库 --> 再有表 -->再有数据(行 --> 列)
MySQL可以创建多个数据库,一个库可以创建多张表,一张表有多行数据,一行数据有多个列(字段)
二、 管理数据库
注意:mysql的关键字不区分大小写
1)查询所有的数据库
sql
show databases;
2)创建数据库
格式:
sql
create database 数据库名 default character set 字符编码 collate 字符编码校验规则;
示例:
sql
create database demo default character set utf8 collateutf8_general_ci;
方法二(使用工具,删除数据库等操作也同理):右键
3)修改数据库的字符编码
格式:
sql
alter database 数据库名 default character set 字符编码;
例:
alter database demo default character set gbk;
4)删除数据库
格式:
sql
drop database 数据库名;
示例:
sql
drop database demo;
5)切换操作的数据库
格式:
sql
use 数据库名;
示例:
sql
use demo;
①. 先创建两个库:demo、demo1;
②. 各自创建一个表(这里创建的abc表);
demo1同理
③. 表里添加数据(demo:0;demo1: 111);
三、表的概念
如果要把公司的所有员工都存到数据库:
1.需创建一个表来保存员工信息,给表一个名字---emp,且这个表名在当前的数据库下表名是唯一的 ,一般表名的命名要见名知义,首选英文名称 ;
2.给表定义要存什么 ,员工是一个概念,对于要存员工的什么(信息)进行进一步的分解 ,根据实际情况来分解---id、姓名、性别、年龄;
3.表存数据是以行的形式来存储,一个行数据就一个完整的概念 ,对于该emp表来说,它的一行数据就一个员工 ;
4.在步骤2,我们又知道员工的整体概念被分解一个个单独信息(id,姓名,性别,年龄),这些就被称为一行的多个列,正是这些多个列的信息构成一行完整的数据;
5.被分解一个个单独信息,我们称之为字段(属性) ;
6.表名---字段名的关系,具体到我们现在的员工表的例子,就是员工有哪些字段(属性),这样就通过表名---字段名这样的形式,就把员工给描述清楚了;
7.字段名和表名也是一样,最好有含义,首选英文名称;
四、字段的数据类型
4.1 整型
存整数的
4.2 浮点型(float和double)
- 存小数,使用的时候看需要多大的精度(有效数字)
- 浮点型是存储近似值,不适合用来存储必须精确的数值,例如金钱
4.3 定点数
存储精确的数值
m代表有效数字的位数,在1~65之间。
d代表小数位,在0~30之间,但是同时需要d<m。
注:浮点型在数据库中存放的是近似值,而定点类型在数据库中存放的是精确值
4.4 字符串
4.5 二进制数据
- 保存图片、压缩包、视频
- 这些如果保存到数据库,先把这些转成二进制的数据,再保存到数据库
- 这个不太常用,因为我们现在有其他更好的方式来存储这些大的文件
4.6 日期时间类型
注:
TIMESTAMP和DATETIME的不同点:
1、两者的存储方式不一样
对于TIMESTAMP,它把客户端插入的时间从当前时区转化为UTC(世界标准时间)进行存储。查询时,将其又转化为客户端当前时区进行返回。而对于DATETIME,不做任何改变,基本上是原样输入和输出。
2、两者所能存储的时间范围不一样
timestamp 所能存储的时间范围为:'1970-01-01 00:00:01.000000' 到 '2038-01-1903:14:07.999999'。
datetime所能存储的时间范围为:'1000-01-01 00:00:00.000000' 到 '9999-12-3123:59:59.999999'。
总结:TIMESTAMP和DATETIME除了存储范围和存储方式不一样,没有太大区别。当然,对于跨时区的业务,TIMESTAMP更为合适。
五、管理表
注意:mysql的关键字不区分大小写
5.1 查看当前数据库的所有表
sql
#查看当前操作的数据库有哪些表
show tables;
5.2 创建表
格式:
mysql
CREATE TABLE 表名 (
字段名 字段类型 NOT NULL AUTO_INCREMENT, //主键的值不能是null
字段名 字段类型 ,
...
字段名 字段类型 ,
PRIMARY KEY (字段名)
) ;
** 示例 :**
sql
#创建学生表
create table student(
id int(10) not null,
name varchar(100),
age int(2),
primary key(id)
);
5.3 修改表
1)给表添加一个字段
格式:
mysql
alter table 表名 add column 字段名 字段类型;
示例:
sql
alter table student add column classes varchar(10);
已设字段:
再点击设计表:
2)给表添加多个字段
格式:
sql
alter table 表名 add 字段名 字段类型,add 字段名 字段类型,...,add 字段名 字段类型;
示例:
sql
alter table student add a int,add b int,add c int;
点击设计表-->点击保存-->可见a,b,c字段:
3)修改字段数据类型
格式:
sql
alter table 表名 modify column 字段名 字段类型;
示例:
sql
alter table student modify column a varchar(4);
点击设计表-->点击保存-->
4)修改字段的名称
格式:
sql
alter table 表名 change column 原字段名 新字段名 字段的数据类型;
示例:
sql
alter table student change column a a1 int;
点击-运行已选择的-->
点击设计表-->点击保存-->
5)删除表的一到多个字段
格式:
sql
alter table 表名 drop column 字段名;
alter table 表名 drop column 字段名,...,drop column 字段名;
示例:
sql
alter table student drop column a1;
alter table student drop column b,drop column c;
点击-运行已选择的-->
点击设计表-->点击保存-->
6)修改表名
格式:
sql
alter table 原表名 rename to 新表名;
示例:
sql
alter table student rename to stu;
点击-运行已选择的-->
刷新可见表名改为了stu:
5.4 删除表
格式:
sql
drop table 表名;
示例:
sql
drop table stu;
点击-运行已选择的-->
刷新后不见stu表了:
5.5 查看表结构
格式:
sql
describe 表名;
示例:
sql
describe student;
点击-运行已选择的-->
5.6 当然,也可以使用工具管理表,学习课程推荐在这里(时长:8'47'')(更简便---但是上面咱们列出来的SQL语言也要知道)
六、管理数据(从这开始是重点内容)
6.1 查询表的所有数据
格式:
sql
select * from 表名;
示例(这里又新建了一张student表):
sql
select * from student;
点击-运行已选择的-->
6.2 给表插入数据
1)单条全量插入数据,注意 ''
(一组单引号)代表字符串,在给所有字段插入数据时,要根据表结构的字段顺序---设计表中的顺序---给值
** 格式:**
sql
insert into 表名 values (字段1的值,字段2的值,...,字段n的值);
示例:
sql
insert into student values (1,'张三',14,'男');
2)单条指定字段插入数据
格式:
sql
insert into 表名 (字段1,字段2,...,字段n) values (字段1的值,字段2的值,...,字段n的值);
sql
insert into 表名 (字段1,字段3,字段5) values (字段1的值,字段3的值,字段5的值);
示例:
sql
insert into student (id,name,age) values (2,'李四',15);
sql
insert into student (name,age,id) values ('王五',16,3);
注:插入的值要和前面指定的字段的顺序保存一致
3)批量插入数据
格式:
sql
insert into 表名 values
(字段1的值,字段2的值,...,字段n的值),
(字段1的值,字段2的值,...,字段n的值),
...
(字段1的值,字段2的值,...,字段n的值);
示例:
sql
insert into student values (4,'lucy',14,'一班'),(5,'小明',15,'二班'),(6,'小红',16,'一班');
注:在插入数据时,如果某一个字段是自动递增的,可以不用插入这个字段的值,而由数据库自己计算填充
6.3主键-自动增长及字段-默认值设置
格式:
sql
主键字段名 字段类型 not null auto_increment,#主键-自动增长auto_increment
sql
字段名 字段类型 default '这里写要设置的默认值',#字段默认值设置default--
示例:
sql
-- 创建新表student1
create table student1(
id int(10) not null auto_increment,#主键-自动增长auto_increment
name varchar(100) default '不知道',#字段默认值设置default--
primary key(id)
);
-- 批量插入数据
-- 主键自动递增
insert into student1 (name) values ('lucy'),('小明'),('小红');
-- 表的字段有默认值,则不给其值的话-就自动填默认值
insert into student1 (id) values (4),(5);
-- 查看表的所有数据
select * from student1;
6.4 修改数据
1)修改一到多个指定字段的所有行的值
格式:
sql
update 表名 set 字段名 = 值,字段名 = 值,...,字段名 = 值;
示例:
把表的当前所有行的classes
字段的值改成二班
:
sql
update student set classes = '二班';
2)按条件修改指定字段的值
格式:
sql
update 表名 set 字段名 = 值 where 字段名 = 值;
示例:
把id
为2
的学生的班级修改为一班
sql
update student set classes = '一班' where id = 2;
3)按条件修改一到多个指定字段的所有行的值
-
这种查询是前面2种查询的结合使用
-
按条件改表某一行的某几个字段,注意不加where条件会改变当前所有行的数据
格式:
sql
update 表名 set 字段名 = 值,字段名 = 值,...,字段名 = 值 where 字段名 = 值;
示例:
把id为3
的学生的姓名改为张三
,年龄改为12
,班级改为一班
sql
update student set name = '张三',age = 12,classes = '一班' where id = 3;
6.4 删除表
删除表都是按行删除
1)按条件删除
格式:
sql
delete from 表名 where 字段名 = 值;
示例:
删除学生表中id为2的对应行数据
sql
delete from student where id = 2;
删除学生表中姓名为张三
的对应行数据(如果有多个叫,就是删除多行)
sql
delete from student where name = '张三';
2)整体删除,删除表当前的所有行数据
格式:
sql
delete from 表名;
示例:
删除学生表的所有行数据
sql
delete from student;
注:
如果表中有字段是字段递增类型的,使用delete删除全表后,自动递增的起始点保留。例如,一个表的id已经自动递增到了10,那么使用delete删除全表后,再次insert插入数据时,id是从10继续往后递增,而不会从0开始计算。
如果想要让自动递增也回归初始状态,需要把表drop掉,然后重新建表。
另外,如果表中有字段是字段递增类型的时候,删除中间的某条数据,不会影响递增的累加。例如,一个表的id已经自动递增到了10,那么使用delete删除id为3的那行数据,再次insert插入数据时,id是从10继续往后递增,中间缺失的3就缺失了,除非你在insert的时候指定插入的id字段的值为3。
七、 查询数据(重点)
7.1 简单查询
1)查询所有列
格式:
sql
select * from 表名;
示例:
sql
select * from student;
2)查询指定的列
格式:
sql
select 字段,字段,...,字段 from 表名;
示例:
sql
select name,classes from student;
3)给查询的指定列取一个别名
格式:
sql
select 字段名 别名,字段名 别名 from 表名;
示例:
sql
select name '姓名',classes '班级' from student;
注:取别名在多表联合查询时可能会用,例如表a有一个字段叫name,表b有一个字段叫name,我们就可以通过设置别名来区分这两个name
4)合并列查询
例如,我们想做把班级和姓名放在一个列中查询,展示的时候是类似二班-张三
这种的
sql
select CONCAT(classes,'-',name) '班级-姓名' from student;
合并查询可以做算数查询 ,例如查询mysql
和hadoop
的总成绩
sql
select name '姓名',(mysql + hadoop) '总成绩' from student;
5)查询时添加常量列
就是直接查询一个普通的字符串,这个字符串在查询中就会作为一个常量在结果集中展示
sql
select name, age, (mysql + hadoop) '总成绩', classes, '光明小学' from student;
sql
select '常量' from student;
6)去除某个列重复数据
使用distinct ,注意在使用的时候去重的列(字段)要单独查询,不要和其他列一起查询
格式:
sql
select distinct 字段名 from 表名;
示例:
查询学生的所有的年龄,查询时去除重复的年龄
sql
select distinct age from student;
7.2 条件查询
基本格式:
sql
select 字段,字段,...,字段 from 表名 where 查询条件;
7.2.1 比较条件
符号 | 含义 |
---|---|
= | 等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
!= | 不等于 |
between and | 在a和b两个值之间,包含a和b |
1)查询所有年龄大于14岁的学生的姓名,班级,年龄
sql
select name,classes,age from student where age > 14;
2)查询所有年龄大于等于14岁的学生的姓名,年龄,班级
sql
select name,classes,age from student where age >= 14;
3)查询所有年龄小于14岁的学生的姓名,年龄,班级
sql
select name,classes,age from student where age < 14;
4)查询所有年龄小于等于14岁的学生的姓名,年龄,班级
sql
select name,classes,age from student where age <= 14;
5)查询所有hadoop成绩在80到90之间的学生(包含80和90)
sql
select * from student where hadoop between 80 and 90;
7.2.2 逻辑条件
符号 | 含义 |
---|---|
and | 并且 |
or | 或者 |
1)查询二班的hadoop
成绩在95分以上的学生,这里查询要使用and
sql
select * from student where classes = '二班' and hadoop > 95;
2)查询二班
的mysql
和hadoop
成绩在95分以上的男学生
sql
select * from student where classes = '二班' and hadoop > 95 and mysql > 95;
3)查询mysql的成绩在85分以上或者hadoop成绩在95分以上的学生
sql
select * from student where mysql > 85 or hadoop > 95;
4)查询mysql的成绩在85分以上或者haddop成绩在95分以上或者id为4的学生
sql
select * from student where mysql > 85 or hadoop > 95 or id = 4;
5)比较条件和逻辑条件混合使用
查询二班hadoop成绩在95分以上或者一班mysql成绩在85分以上的学生
sql
select * from student where (classes = '二班' and hadoop > 95) or (classes = '一班' and mysql > 85);
7.2.3 判空条件
符号 | 含义 |
---|---|
='' |
是空字符串'' |
is nul | 是null值 |
is not null | 不是null值 |
<> | 不是,非 |
<>'' |
不是空字符串'' ,也不是null值 |
1)查询name是''
的数据
sql
SELECT * from student where name = '';
显然,此表中没有name是
''
的数据
2)查询name是null的数据
sql
SELECT * from student where name is null;
显然,此表中没有name是null的数据
3)查询name不是null的数据,is not null
单纯的指的是值不是null
sql
SELECT * from student where name is not null;
4)查询name不等于''
的数据,这个里面包含不等于null,也就是说<> ''
代表的意思是不是''
也不是null
sql
SELECT * from student where name <> '';
5)不等于--<>
,还可以用来判断别的值
例如:
查询所有姓名不是张三的学生
sql
SELECT * from student where name <> '张三';
查询所有年龄不是14的学生
sql
SELECT * from student where age <> 14;
7.2.4 模糊条件
字段类型为字符串时,查询字段值是否包含某些子串
例如:查询姓张的学生都有哪些,这个需要模糊查询
符号 | 含义 |
---|---|
like | 包含 |
not like | 不包含 |
模糊查询like
主要是用来查询字符串,配合_
或者%
一起使用
-
_
是匹配0到1个字符 -
%
是匹配0到多个字符
1)查询name中含有一个张
字的学生
sql
select * from student where name like '%张%';
2)查询姓张的学生,就是名字以张开头就行
sql
SELECT * from student where name like '张%';
3)查询姓张的学生中,名字是三个字的
sql
SELECT * from student where name like '张__';
显然,此表中没有名字是三个字的姓张的学生
4)查询三个字的名字,张在中间的学生
sql
SELECT * from student where name like '_张_';
显然,此表中没有名字是三个字的张在中间的学生
5)查询除了姓张的以外的学生
sql
SELECT * from student where name not like '张%';
7.3 聚合查询
函数 | 含义 |
---|---|
sum | 求和 |
avg | 求平均数 |
max | 最大值 |
min | 最小值 |
count | 计数 |
1)查询二班学生hadoop的总分之和,使用sum(字段名),这个是用来给值是数字的列做求和的函数
sql
select sum(hadoop) '二班hadoop总分' from student where classes = '二班';
2)求一班mysql的平均成绩,平均数是avg(字段名),这个是用来给值是数字的列做求平均数的函数
sql
select AVG(mysql) from student where classes = '一班';
3)查询所有的学生中最大的年龄是多少
sql
select max(age) from student;
注意一个问题,聚合查询,就是需要计算哪个列的数据就只查询哪个列
4)查询id最小的值是多少
sql
select min(id) from student;
5)查询一班有多少个学生,使用count()
,括号里面可以直接用*,或者某字段,或者常量
sql
select count(*) from student where classes = '一班';
sql
select count(id) from student where classes = '一班';
sql
select count(1) from student where classes = '一班';
注:在之前的 MySQL版本,使用count(*)效率低,这个问题在MySQL8中已经不存在
7.4 排序查询
排序 | 含义 |
---|---|
order by 字段 | 正序 |
order by 字段 asc | 正序,正序可以省略asc |
order by 字段 desc | 倒序 |
排序查询使用order by 字段 desc,字段desc,...,字段desc,想要以哪个字段排序就order by谁
1)正序查询是order by 字段 或者order by字段 asc
sql
select * from student order by age;
sql
select * from student order by age asc;
2)有班级的学生按照年龄倒序排列,倒序排序使用orderby 字段 desc
sql
select * from student where classes is not null order by age desc;
3)可以排序多个字段,并且正序倒序可以混合使用
根据年龄正序排序,如果年龄相同则根据id正序排序
sql
select * from student order by age,id;
sql
select * from student order by age asc,id asc;
根据年龄正序排序,如果年龄相同则根据班级倒序排序,如果班级也相同则根据id正序排序
sql
select * from student order by age,classes desc,id;
5)如果where条件和order by同时使用,order by放在where条件的后面
sql
select * from student where classes is not null order by age;
7.5 分页查询
分页查询,就是在已查询得到的结果集中,截取其中一部分。
格式:
-
limit 偏移量,步长
-
limit 步长,这种写法是默认偏移量的值是0
名词解释:
偏移量,查询的起始位置到起始第一行数据的差的行数。如果偏移量的值是0,就是从第1行开始查询。
步长,就是当前查询的条数。
例如:
分页查询学生表,从第1行开始,查询3条数据
sql
select * from student limit 0,3;
sql
select * from student limit 3;
分页查询学生表,从第3行开始,查询4条数据
sql
select * from student limit 2,4;
如果我们现在有个查询,包含条件where、分页limit,和排序,先where然后order by,然后是limit
sql
select * from student where classes is not null order by age limit 1,3;
7.6 分组查询
按照指定 的一个或多个字段分组查询(主要用于统计数据),分组查询多数时候与聚合查询一起使用
格式:
sql
group by 字段
1)查询表中,一班和二班都是多少人(就是根据班级分组查询)
sql
select classes,count( classes) from student group by classes;
考虑到班级可能存在null值的情况
sql
select classes,count( classes) from student where classes is not null group by classes;
4)在做完分组之后,可以在分组上做聚合查询,聚合查询结果是每个分组的自己的结果
查询每个的班级的学生总数和hadoop成绩的最高分
sql
select classes,count(classes) '学生数',max(hadoop) '班级hadoop最高分' from student where classes is not null group by classes;
5)可以根据多个字段来分组
例如:统计每个班的男女生都是多少人
- 我们可以在group by class之后在加入一个字段sex做更细致的分组,就变成group by class,sex
- 意思就是先按照班级分组,然后在每个班级组的内部再按照性别分组
- 最后得到的结果就是精细到班级的性别的分组
- 这个时候我们再使用聚合查询的时候实际上是在做每个班级内部的性别分组基础上做聚合查询
sql
select class,count(class) '班级中每个性别数',sex,count(sex),max(hadoop) from student where classes is not null group by classes,sex;
6)对分组查询的聚合函数结果加筛选条件
示例1:查询班级人数大于1个人的班级
-
首先,先按照班级做分组查询,并且对每个班级的人数进行计数
-
然后,再按照计数看大于1的计数,使用having count(class) > 1筛选
sql
select classes,count(classes) from student where classes is not null group by classes having count(classes) > 1;
示例2:查询hadoop的最高分大于90分的班级有哪些
-
做班级分组查询,并且在分组的基础上对hadoop做max查询
-
用having 筛选max中大于90的数据
sql
select classes,max(hadoop) from student where classes is not null group by classes having max(hadoop) > 90;
注意:
- 分组查询一般是与聚合查询结合使用,针对每个分组去做聚合(最大值,最小值,计数...)e
- 查询中如果有where、group by(包含having)、order by,使用的顺序group by(包含having) 必须在where之后,orderby之前
sqlselect classes,max(hadoop) from student where classes is not null group by classes having max(hadoop) >= 90 order by classes;
- 查询中如果有where、group by(包含having)、order by、limit,使用的顺序groupby(包含having) 必须在where之后,order by之前,limit必须在orderby之后
也就是where > group by > order by > limit
这样,我们前面学习的所有查询就都可以任意混合使用了
7.7 sql中完成if判断
数据准备:
新建一张user表,如下:
sex: 0-男,1-女,3-未知;
level: 1-超级VIP客户,2-VIP客户,3-普通客户;
7.7.1 case流程控制函数
- 写法一
格式:
sql
CASE expression
WHEN value1 THEN returnvalue1
WHEN value2 THEN returnvalue2
WHEN value3 THEN returnvalue3
......
ELSE defaultreturnvalue
END
示例:
查询user表,性别用中文(0-男,1-女,3-未知)表示
sql
SELECT name,(
CASE sex
WHEN 0 THEN '男'
WHEN 1 THEN '女'
ELSE '未知'
END
) '性别'
FROM user;
- 写法二
格式:
sql
CASE
WHEN condition1 THEN returnvalue1
WHEN condition2 THEN returnvalue2
WHEN condition3 THEN returnvalue3
......
ELSE defaultreturnvalue
END
示例:
查询user表,性别用中文(0-男,1-女,3-未知)表示
sql
SELECT name,(
CASE
WHEN sex=0 THEN '男'
WHEN sex=1 THEN '女'
ELSE '未知'
END
) '性别'
FROM user;
7.7.2 IF()函数
使用CASE函数可以实现非常复杂的逻辑判断,可是若只是实现"如果符合条件则返回A,否则返回B"这样简单的判断逻辑的话,使用CASE函数就过于繁琐。
MySQL提供了IF()函数用于简化这种逻辑判断。
格式:
sql
IF(expr1,expr2,expr3);
示例:
查询user表,性别sex值为3的显示为"未知性别",其他显示为"正常性别"
sql
select name,sex,if(sex < 3,'正常性别','未知性别') from user;
特殊地,if函数的简化版,专门用来判断null值
格式:
sql
#判断 如果value1 不是null,返回value1;如果value1 为null,返回value2;
ifnull(value1,value2)
示例:
sql
SELECT IFNULL('abc','bcd'),IFNULL(null,'bcd');
7.7.3 字符串的集合操作ELT()
格式:
sql
#如果 N = 1,返回 str1,如果N =2,返回 str2,等等。如果 N 小于 1 或大于参数的数量,返回 NULL。
ELT(N,str1,str2,str3,...)
示例:
查询user表,把level的值转化为中文(1-超级VIP客户,2-VIP客户,3-普通客户)
sql
SELECT name,ELT(
level,
'超级VIP',
'VIP',
'普通'
) '客户类型'
FROM user;
八、附源码
sql
-- SHOW TABLES;
#学生表(主键-id,name,age,classes)
#主键的字段不能是null
create table student(
id int(10) not null,
name varchar(100),
age int(2),
primary key(id)
);
SHOW TABLES;
--
alter table student add column classes varchar(10);
-- 添加多个字段
alter table student add a int,add b int,add c int;
-- 修改a的数据类型为vachar
alter table student modify column a varchar(4);
-- 将字段名a改为a1
alter table student change column a a1 varchar(4);
-- 删除a1字段
alter table student drop column a1;
-- 删除b,c字段
alter table student drop column b,drop column c;
-- 将表名student改为stu
alter table student rename to stu;
-- 删除stu表
drop table stu;
-- 查看表结构
describe student;
-- 查看表的所有数据
select * from student;
-- 插入数据
insert into student values (1,'张三',14,'二班');
-- 单条指定字段插入数据,注意插入的值要和前面指定的字段的顺序保存一致
insert into student (id,name,age) values (2,'李四',15);
insert into student (name,age,id) values ('王五',16,3);
-- 批量插入数据
insert into student values (4,'lucy',14,'一班'),(5,'小明',15,'二班'),(6,'小红',16,'一班');
-- 主键-自动增长及字段-默认值设置
-- 创建新表student1
create table student1(
id int(10) not null auto_increment,#主键-自动增长auto_increment
name varchar(100) default '不知道',#字段默认值设置default--
primary key(id)
);
-- 批量插入数据
-- 主键自动递增
insert into student1 (name) values ('lucy'),('小明'),('小红');
-- 表的字段有默认值,则不给其值的话-就自动填默认值
insert into student1 (id) values (4),(5);
-- 查看表的所有数据
select * from student1;
-- 把表的当前所有行的`classes`字段的值改成二班
update student set classes = '二班';
-- 把id为2的学生的班级修改为一班
update student set classes = '一班' where id = 2;
-- 把id为3的学生的姓名改为张三,年龄改为12,班级改为一班
update student set name = '张三',age = 12,classes = '一班' where id = 3;
-- 删除学生表中id为2的对应行数据
delete from student where id = 2;
-- 删除学生表中姓名为张三的对应行数据(如果有多个叫,就是删除多行)
#1,3都叫张三,所以此操作会将一和三行的数据都删掉
delete from student where name = '张三';
-- 删除学生表的所有行数据
delete from student;
-- 查询指定的列
select name,classes from student;
-- 给查询的指定列取一个别名
select name '姓名',classes '班级' from student;
-- 把班级和姓名放在一个列中查询,展示的时候是类似`二班-张三`这种的
select CONCAT(classes,'-',name) '班级-姓名' from student;
-- 添加多个字段
alter table student add mysql int,add hadoop int;
-- 合并查询可以做算数查询,例如查询mysql和hadoop的总成绩
select name '姓名',(mysql + hadoop) '总成绩' from student;
-- 查询时添加常量列
select name, age, (mysql + hadoop) '总成绩', classes, '光明小学' from student;
select '常量' from student;
-- 去除某个列重复数据
-- 使用distinct ,注意在使用的时候去重的列(字段)要单独查询,不要和其他列一起查询
-- 查询学生的所有的年龄,查询时去除重复的年龄
select distinct age from student;
-- 条件查询
-- 1)查询所有年龄大于14岁的学生的姓名,班级, 年龄
select name,classes,age from student where age > 14;
-- 2)查询所有年龄大于等于14岁的学生的姓名,年龄,班级
select name,classes,age from student where age >= 14;
-- 3)查询所有年龄小于14岁的学生的姓名,年龄,班级
select name,classes,age from student where age < 14;
-- 4)查询所有年龄小于等于14岁的学生的姓名,年龄,班级
select name,classes,age from student where age <= 14;
-- 5)查询所有hadoop成绩在80到90之间的学生,(包含80和90)
select * from student where hadoop between 80 and 90;
-- 逻辑条件
-- 1)查询二班的`hadoop`成绩在95分以上的学生,这里查询要使用`and`
select * from student where classes = '二班' and hadoop > 95;
-- 2)查询`二班`的`mysql`和`hadoop`成绩在95分以上的男学生
select * from student where classes = '二班' and hadoop > 95 and mysql > 95;
-- 3)查询mysql的成绩在85分以上或者hadoop成绩在95分以上的学生
select * from student where mysql > 85 or hadoop > 95;
-- 4)查询mysql的成绩在85分以上或者haddop成绩在95分以上或者id为4的学生
select * from student where mysql > 85 or hadoop > 95 or id = 4;
-- 5)比较条件和逻辑条件混合使用
-- 查询二班hadoop成绩在95分以上或者一班mysql成绩在85分以上的学生
select * from student where (classes = '二班' and hadoop > 95) or (classes = '一班' and mysql > 85);
-- 判空条件
-- 1)查询name是''的数据
SELECT * from student where name = '';
-- 2)查询name是null的数据
SELECT * from student where name is null;
-- 3)查询name不是null的数据,`is not null`单纯的指的是值不是null
SELECT * from student where name is not null;
-- 4)查询name不等于`''`的数据,这个里面包含不等于null,也就是说`<> ''`代表的意思是不是`''`也不是`null`
SELECT * from student where name <> '';
-- 5)不等于--`<>`,还可以用来判断别的值
-- 查询所有姓名不是张三的学生
SELECT * from student where name <> '张三';
-- 查询所有年龄不是14的学生
SELECT * from student where age <> 14;
-- 模糊条件
-- 1)查询name中含有一个`张`字的学生
select * from student where name like '%张%';
-- 2)查询姓张的学生,就是名字以张开头就行
SELECT * from student where name like '张%';
-- 3)查询姓张的学生中,名字是三个字的
SELECT * from student where name like '张__';
-- 4)查询三个字的名字,张在中间的学生
SELECT * from student where name like '_张_';
-- 5)查询除了姓张的以外的学生
SELECT * from student where name not like '张%';
-- 聚合查询
-- 1)查询二班学生hadoop的总分之和,使用sum(字段名),这个是用来给值是数字的列做求和的函数
select sum(hadoop) '二班hadoop总分' from student where classes = '二班';
-- 2)求一班mysql的平均成绩,平均数是avg(字段名),这个是用来给值是数字的列做求平均数的函数
select AVG(mysql) from student where classes = '一班';
-- 3)查询所有的学生中最大的年龄是多少
select max(age) from student;
-- 4)查询id最小的值是多少
select min(id) from student;
-- 5)查询一班有多少个学生,使用`count()`,括号里面可以直接用*,或者某字段,或者常量
select count(*) from student where classes = '一班';
select count(id) from student where classes = '一班';
select count(1) from student where classes = '一班';
-- 排序查询
-- 1)正序查询是order by 字段 或者order by字段 asc
select * from student order by age;
select * from student order by age asc;
-- 2)有班级的学生按照年龄倒序排列,倒序排序使用orderby 字段 desc
select * from student where classes is not null order by age desc;
-- 3)可以排序多个字段,并且正序倒序可以混合使用
-- 根据年龄正序排序,如果年龄相同则根据id正序排序
select * from student order by age,id;
select * from student order by age asc,id asc;
-- 根据年龄正序排序,如果年龄相同则根据班级倒序排序,如果班级也相同则根据id正序排序
select * from student order by age,classes desc,id;
-- 5)如果where条件和order by同时使用,order by放在where条件的后面
select * from student where classes is not null order by age;
-- 分页查询
-- 分页查询学生表,从第1行开始,查询3条数据
select * from student limit 0,3;
select * from student limit 3;
-- 分页查询学生表,从第3行开始,查询4条数据
select * from student limit 2,4;
-- 如果我们现在有个查询,包含条件where、分页limit,和排序,先where然后order by,然后是limit
select * from student where classes is not null order by age limit 1,3;
-- 分组查询
-- 1)查询表中,一班和二班都是多少人(就是根据班级分组查询)
select classes,count( classes) from student group by classes;
-- 考虑到班级可能存在null值的情况
select classes,count( classes) from student where classes is not null group by classes;
-- 4)在做完分组之后,可以在分组上做聚合查询,聚合查询结果是每个分组的自己的结果
select classes,count(classes) '学生数',max(hadoop) '班级hadoop最高分' from student where classes is not null group by classes;
-- alter table student add column sex varchar(10);
-- 5)可以根据多个字段来分组
-- 统计每个班的男女生都是多少人
select classes,count(classes) '班级中某个性别数',sex,count(sex),max(hadoop) from student where classes is not null group by classes,sex;
-- 6)对分组查询的聚合函数结果加筛选条件
-- 示例1:查询班级人数大于1个人的班级
select classes,count(classes) from student where classes is not null group by classes having count(classes) > 1;
-- 示例2:查询hadoop的最高分大于90分的班级有哪些
select classes,max(hadoop)
from student
where classes is not null
group by classes
having max(hadoop) > 90;
-- 7.7 sql中完成if判断
-- 数据准备
-- 新建一张user表
-- sex:0-男,1-女,3-未知;
-- level:1-超级VIP客户,2-VIP客户,3-普通客户;
create table user(
id int(10) not null,
name varchar(100),
sex int(10),
age int(2),
level int(10),
primary key(id)
);
-- 批量插入数据
insert into user values (1,'张三',0,12,1),(2,'李四',3,11,2),(3,'王五',1,14,3);
SELECT * FROM user;
-- 7.7.1 case流程控制函数
-- 查询user表,性别用中文(0-男,1-女,3-未知)表示
SELECT name,(
CASE sex
WHEN 0 THEN '男'
WHEN 1 THEN '女'
ELSE '未知'
END
) '性别'
FROM user;
-- 写法二
SELECT name,(
CASE
WHEN sex=0 THEN '男'
WHEN sex=1 THEN '女'
ELSE '未知'
END
) '性别'
FROM user;
-- 7.7.2 IF()函数
-- 查询user表,性别sex值为3的显示为"未知性别",其他显示为"正常性别"
select name,sex,if(sex < 3,'正常性别','未知性别') from user;
-- 特殊地,if函数的简化版,专门用来判断null值
SELECT IFNULL('abc','bcd'),IFNULL(null,'bcd');
-- 7.7.3 字符串的集合操作ELT()
-- 查询user表,把level的值转化为中文(1-超级VIP客户,2-VIP客户,3-普通客户)
SELECT name,ELT(
level,
'超级VIP',
'VIP',
'普通'
) '客户类型'
FROM user;