数据库查询
准备数据
CREATE TABLE stu (
id INT,
NAME VARCHAR(20),
age INT,
sex VARCHAR(5),
address VARCHAR(100),
math INT,
english INT
);
INSERT INTO stu VALUES
(1,'张三',55,'男','杭州',66,78),
(2,'张思',45,'女','深圳',98,87),
(3,'张亮',55,'男','香港',56,77),
(4,'柳岩',20,'女','湖南',76,65),
(5,'柳青',20,'男','湖南',86,NULL),
(6,'刘亮华',57,'男','香港',99,99),
(7,'马德',22,'女','香港',99),
(8,'亮亮 ',18,'男','南京',56,65);
比较运算符
< 小于
<= 小于等于
>= 大于等于
= 等于
<> != 不等于
> 大于
-- 查询math分数大于80分的学生
SELECT * FROM stu WHERE math>80;
-- 查询english分数小于或等于80分的学生
SELECT * FROM stu WHERE english<=80;
-- 查询age等于20岁的学生
select * from stu where age=20;
-- 查询age不等于20岁的学生
SELECT * FROM stu WHERE age!=20;
SELECT * FROM stu WHERE age<>20;
逻辑运算符
and(&&) 多个条件同时满足
or(||) 多个条件其中一个满足
not(!) 不满足
# 逻辑运算符
-- 查询age大于35且性别为男的学生(两个条件同时满足)
SELECT * FROM stu WHERE age>35 AND sex="男";
-- 查询age大于35或性别为男的学生(两个条件其中一个满足)
select * from stu where age>35 or sex='男';
-- 查询id是1或3或5的学生
SELECT * FROM stu WHERE id=1 OR id=3 OR id=5;
-- 查询id是1或3或5的学生
SELECT * FROM stu WHERE id IN(1,3,5);
范围查询
select * from 表名 where 字段 between 值1 and 值2 ;
# 范围
-- 查询english成绩大于等于75,且小于等于90的学生
SELECT * FROM stu WHERE english>=75 AND english<=90;
select * from stu from where english between 75 and 90;
模糊查询
格式: select * from 表名 where 字段 like 条件;
条件格式:
% : 模糊匹配所有
_ : 模糊匹配1位
// 匹配名称中包含张字的
select * from 表名 where name like "%张%";
// 匹配名称中以张字开头的
select * from 表名 where name like "张%";
// 匹配名称中以张字结尾的
select * from 表名 where name like "%张";
// 匹配名称为2个字且以张字开头的
select * from 表名 where name like "张_";
// 匹配名称为3个字的
select * from 表名 where name like "___";
排序
格式:
select * from 表名 where 条件 order by 字段名称 [desc|asc], 字段名 [desc | asc]... ;
asc(默认) : 升序
desc : 降序
-- 查询所有数据,使用年龄降序排序
SELECT * FROM stu ORDER BY age DESC;
-- 查询所有数据,在年龄降序排序的基础上,如果年龄相同再以数学成绩降序排序
SELECT * FROM stu ORDER BY age DESC,math DESC;
聚合函数
select 聚合函数 from 表名;
count() : 计数
IFNULL(english,0)
sum() : 求和
max() : 求最大值
min() : 求最小值
avg() : 求平均值
扩展-保留小数位
cast(被处理的数据 as decimal(5,2))
注意事项:
聚合函数对空值不起作用
使用在select后,或having后面
聚合函数返回一个结果
-- 查询学生总数
SELECT COUNT(*) FROM stu;
SELECT COUNT(IFNULL(english,0)) FROM stu;
-- 查询年龄大于40的总数
SELECT COUNT(*) FROM stu WHERE age>40;
-- 查询数学成绩总分
SELECT SUM(math) FROM stu;
-- 查询数学成绩平均分
SELECT AVG(math) FROM stu;
SELECT CAST(AVG(math) AS DECIMAL(5,2)) FROM stu;
-- 查询数学成绩最高分
SELECT MAX(math) FROM stu;
-- 查询数学成绩最低分
SELECT MIN(math) FROM stu;
分组
格式:
select * from 表名 where 条件 group by 分组字段 [having 分组条件 ] ;
group by 分组字段 [having 条件]
having与where的区别 ★
where是在分组前对数据进行过滤
having是在分组后对数据进行过滤.
where后面不可以使用聚合函数
having后面可以使用聚合函数
-- 按性别分组
SELECT sex FROM stu GROUP BY sex;
-- 查询男女各多少人
SELECT sex,COUNT(*) FROM stu GROUP BY sex;
-- 查询年龄大于25岁的人,按性别分组,统计每组的人数
SELECT sex,COUNT(*) FROM stu WHERE age>25 GROUP BY sex ;
分页
分页: 提高用户体验度,增强服务器的响应效率
分页关键字: limit
格式:
select * from 表名 limit 起始索引,每页显示条数;
select * from 表名 limit 开始的索引,从开始索引向后数多少条 ;
必须条件: (离开这些条件完成不了分页查询)
起始索引(开始的索引) = (当前页页码-1)*每页显示条数;
每页显示条数: 从开始索引向后数多少条
已知条件:
当前页的页码:
每页显示条数: 3
注意事项:
开始索引可以省去不写,如果不写默认从0开始.
-- 查询学生表中数据,从第三条开始显示,显示6条
SELECT * FROM stu LIMIT 2,6;
主键约束 primary key
用来标注一条记录的唯一性
特征:
主键字段值唯一(唯一不可重复)
主键列不能包含NULL值
一个表中只能有一个主键,但主键可以是多个字段 (联合主键)
格式:单一主键
create table 表名(
字段名称1 字段类型 字段约束区,
字段名称2 字段类型 字段约束区
);
格式2:联合主键
create table 表名(
字段名称1 字段类型,
primary kay(字段名称 ,字段名称1)
);
在已有表中添加主键(扩展)
alter table 表名 add primary key(字段名称);
删除主键
alert table 表名 drop PRIMARY KEY;
主键自增
auto_increment
默认地AUTO_INCREMENT 的开始值是1,如果要从指定的值开始增长可以修改起始值,请使用下列SQL语法(不用给值,每次自动增加)
唯一约束: unique
特征
被修饰的字段唯一,不可重复
注意: 一个表中可以有多个被unique修饰的字段,但对null不起作用
实现方式
创建表时在字段后添加
create table 表名 (
字段名称1 字段类型 约束,
字段名称2 字段类型 约束
);
非空约束:not null
特征:
被修饰的字段不可为空
实现方式:
直接在字段后面添加即可
删除: 修改字段删除约束
alter table 表名 change 旧字段名称 新字段名称 类型 约束;
default : 默认值约束
当不为该字段设置信息时,使用默认值
foreign key : 外键
添加外键
方式1: 创建表时添加
CREATE TABLE orders2 (
id INT PRIMARY KEY AUTO_INCREMENT,
price DOUBLE(5,2),
user_id INT,
FOREIGN KEY (外键名称) REFERENCES 主表名称(关联的字段)
);
方式2: 创建完表后通过修改表添加
在从表中添加外键字段
alter table 从表 add 外键名称 数据类型;
给从表的外键字段添加外键约束
alter table 从表名 add [constraint 名称] foreign key(外键字段) references 主表名称(主键);
删除外键
ALTER TABLE 从表 drop foreign key 外键名称;
每天积累一点点,加油!!! 一个小白正在努力成长中…