MySQL基础知识入门(一)
知识点相关练习

CREATE TABLE student3 (id INT, NAME VARCHAR(20),
age INT , sex VARCHAR(5),address VARCHAR(100),math INT ,
english INT) ;

-- 添加所有的表数据
INSERT INTO student3(id,NAME,age,sex,address,math,english)
VALUES 
(7,'马德',22,'女','香港',99,99),
(8,'德玛西亚',18,'男','南京',56,65); 


SELECT 
s3.`id` AS '编号',
s3.`name`'姓名',
s3.`age`'年龄',
s3.`sex`'性别',
s3.`address`'地址',
s3.`math`'数学成绩',
s3.`english`'英语成绩'
FROM student3 AS s3 ;

-- 查询年龄大于等于20的学生信息
SELECT
s.id,
s.name,
s.age,
s.math,
s.english
FROM
student3 AS s

WHERE
age >= 20 ;

-- 查询年龄在20和30岁之间的学生信息(所有信息)
SELECT
*
FROM
	student3

WHERE
age >= 20 AND age <=30 ;

-- 查询两者之间的学生信息  bewteen 值1 and  值2 
SELECT
*
FROM
	student3
WHERE
age
BETWEEN 20 AND 30 ;

-- 查询年龄不是20岁的学生的信息
SELECT
*
FROM
student3
WHERE age <> 20 ;

-- 查询英语成绩是null的学生信息
SELECT
*
FROM
student3
WHERE
english IS NULL ;

-- 查询英语成绩不是null的学生的姓名
SELECT
s.`name`
FROM
student3 s
WHERE
english IS NOT NULL ;

-- 查询年龄是18岁或者20岁或者55岁的学生信息
-- 多个 "或者" 的关系:in(值1,值2,值3) ;
SELECT 
*
FROM
student3
WHERE
age
IN(18,20,55) ;


-- 查询所有的信息,包括数学和英语的总成绩

SELECT
s.`id` 	编号,
s.`name`姓名,
s.`age`年龄,
s.`sex`性别,
s.`address`地址,
(s.math+IFNULL(s.english,0)) 总成绩

FROM
student3 s ;



-- 模糊查询
-- select 指定的字段列表 from 表名 where 字段名称 like '%xx%'

-- 模糊查的匹配符号'%某个字%',模糊匹配包含的xx字的信息(使用最多:模糊检索)
-- 单个字符'%_化',模糊匹配第二个字包含"化"的学生信息

#1 模糊查询所有姓"马"的学生信息

SELECT
*
FROM
student3
WHERE
NAME LIKE '%马%'

#2 模糊查询第二个字包含"化"的学生信息
SELECT
*
FROM
student3
WHERE
NAME LIKE "%_化%" ;


#3 模糊查询名字是三个字的学生信息
-- 这里查询出来一个"柳岩",是因为"岩"字后面有一个空格

SELECT
*
FROM
student3
WHERE
NAME LIKE "___";


-- 聚合函数查询--->查询的结果:是单行单列的

# count(字段):通过指定字段:查询总记录数
# avg(字段):针对某个字段求平均分
# sum(字段):针对某个字段求和
# max(字段):针对某个字段获取里面的最大值
# min(字段):针对某个 字段获取里面的最小值

-- 业务字段的查询总记录数:但是english有一个学生null值
SELECT
COUNT(english) 总人数
FROM
student3

 -- 业务字段的查询总记录数:但是english有一个学生null值
SELECT
COUNT(IFNULL(english,0)) 总人数
FROM
student3

-- 一般都是非业务字段查询下表中的总记录数
SELECT
COUNT(id) 总记录数
FROM
student3

-- 求数学成绩的平均分
SELECT
	AVG(math)'数学平均分'
FROM
student3

-- 求英语平均分
SELECT
	AVG(IFNULL(english,0)) 英语平均分
FROM
student3

-- 求英语总分
SELECT
	SUM(IFNULL(english,0)) 总分
FROM
student3 ;

-- 查询英语最高分
SELECT
	MAX(IFNULL(english,0)) 英语最高分
FROM
student3;

-- select 嵌套select语句
# 需求:查询员工工资最高的员工信息
	#1)查询出来最高工资是多少 max(工资)
	#2)最高工资对应的员工信息
# select * from emp where 工资 = (select max(工资) from emp) ;

-- 排序查询order by 字段名称 (排序规则) asc 或者 desc

-- 按学生的数学成绩进行升序排序
SELECT
s.`id`,
s.`name`,
s.`math`
FROM
student3 s
ORDER BY math;-- 后面没有带排序规则:默认升序排序asc

-- 将数学成绩降序排列
SELECT
s.`id`,
s.`name`,
s.`math`
FROM
student3 s
ORDER BY math DESC ;

-- 英语成绩升序排列
SELECT
*
FROM
student3
ORDER BY IFNULL(english,0) ASC ;

-- 同时先数学升序,英语成绩降序排列
# select 字段列表 from 表名 order by 字段名称1 排序方式1,字段名称 排序方式2

SELECT
*
FROM
student3
ORDER BY math ASC ,
IFNULL(english,0) DESC;

-- 分组查询 group by
-- group by 的后面可以跟的分组字段
-- select 分组字段 , 聚合函数 from 表名 group by 分段字段;

SELECT
sex ,性别
AVG(math) 数学平均分

FROM
student3
GROUP BY -- 分组查询
sex ; -- 分组的字段

-- 注意事项:group by 后面不能跟聚合函数

-- group by 和 where 一块使用
# where 条件必须在group by 之前 (必须先满足条件,才能分组)
SELECT
sex '性别',
AVG(math)'数学平均分'
FROM
student3
WHERE math>70 -- 条件满足
GROUP BY sex ; -- 参与分组

-- having :筛选查询
-- 注意事项:having 后面可以跟聚合函数

# 需求:
	# 按照性别分组,查询他们的对应的平均分
	# 条件:数学成绩不大于70分的人不参与分组 where math > 70 ;
	# 筛选出总人数大于2的信息
SELECT
sex '性别',
AVG(math)'数学平均分'
FROM
student3
WHERE math > 70
GROUP BY sex 
HAVING COUNT(id) > 2 ;


# ----------- 优化-----------------
SELECT
sex '性别',
AVG(math)'数学平均分',
COUNT(id) 人数
FROM
student3
WHERE math > 70 -- 条件满足
GROUP BY sex -- 参与分组

HAVING 人数 > 2 ;



-- 插入几条数据
INSERT INTO student3 VALUES
(9,'张三丰',25,'男','西安',97,87),
(10,'张三',25,'男','西安',57,87),
(11,'德亚',18,'男','南京',56,65); 




-- 分页查询 关键字 limit
-- select 字段列表 from 表名 limit 起始行数,每页显示的条数
# 起始行数从0开始 -- 计算 = (当前页码-1)*每页显示的条数
-- 查询第一页的数据,每页显示两条
 
SELECT
*
FROM
student3
LIMIT 0 , 2 ;

-- 第二页数据

SELECT
*
FROM
student3
LIMIT 2 , 2 ;

-- 第三页数据
SELECT
*
FROM
student3
LIMIT 4 ,2 ;
-- 第四页数据
SELECT
*
FROM
student3
LIMIT 6 ,2 ;
-- 第五页数据
SELECT
*
FROM
student3
LIMIT 8 ,2 ;

-- 第六页数据
SELECT
*
FROM
student3
LIMIT 10 ,2 ;