复习
- Data数据-->DB数据库-->DBMS数据库管理系统
常见DBMS: MySQL oracle sql server db2 ... redis Mongodb
两大功能: 定义DDL 操纵DML
- 表table
创建表, 行和列
- MySQL数据类型
数据类型分成三大类:数值型、字符型、日期时间类
- 关于列属性
null值、primary key主键、auto_increment自增、default默认值、foreign key外键、comment注释
create database 数据库名
create table 表名(
id int primary key not null auto_increment comment'编号',
name varchar(10) not null comment'姓名',
gender char(1) comment'性别',
age tinyint comment'年龄',
salary decimal(m,d) comment'工资',
weight float comment'体重',
content text comment'内容',
birthday date comment'出生年月日',
status_value tinyint default 0 comment '状态0禁用 1激活',
create_time timestamp default current_timestamp comment'创建时间',
update_time timestamp default current_timestamp on update current_timestamp comment'更新时间'
)auto_increment=初始值
删除表结构
drop table 表名
插入语句 insert into 表名(字段名1,字段名2) values(值1,值2,...),(值1,值2,...);
更新语句 update 表名 set 字段名=新值, 字段名=新值 where 子句;
删除语句 delete from 表名 where子句;
查询语句 select 字段名1,字段名2,。。。 from 表名 where 子句
where子句,where是用于对行进行筛选
where 比较条件/确定范围/确定集合/and/or/not/is null/ is not null/like
like模糊匹配,通配符%和_
[面试题] drop truncate delete区别
1 binary关键字区分大小写
2 as关键字
3统计函数
SQL提供的统计函数称为集函数.
主要的集函数:(可与DISTINCT连用)
计数函数: count(列名) 计算非空行记录个数
求和函数: sum(数值列名) 对某一列的值求和
求平均值: avg(数值列名) 对某一列的值计算平均值
求最大值: max(数值列名) 找出某一列的最大值
求最小值: min(数值列名) 找出某一列的最小值
4 DISTINCT去重复关键字的使用
5 注意:where子句不能使用聚合函数
6 分组group by
分组可以使用"GROUP BY 列名"的写法,通常分组后都会有对组进行统计的函数的操作
以下代码查询选课表中每个学生的选课数量:
select sid,count(*) from grade group by sid
7对组筛选having
分完组后 ,有时只需要显示其中一部分的组的数据,如查询一个学校中人数超过40人的班级,这时就要使用HAVING子句。
以下代码从学生表中查询人数超过40人的班级:
SELECT 班级,COUNT(*) AS 人数
FROM 学生
GROUP BY 班级
HAVING 人数>40
8 排序order by
将结果集按照某一个列进行排序
desc: 降序排列
asc: 升序排列(默认)
语法:
select ... from 表名 where 子句 ... order by 列1 desc/asc, 列2 desc/asc
9 限制limit
对最终结果集记录数进行限制,实现分页功能
select... from 表 where ... limit a,b
应用程序中一般分页可以通过两种方式实现:
①基于数据库分页的物理分页(掌握);
②基于业务逻辑实现的逻辑分页
单表练习
单表基本语句练习题目:建立一个hw_student_info表。
字段名 数据类型 说明
stu_id int 学生编号 主键自增
stu_name varchar(10) 学生姓名 不可空
age int 学生年龄 可空
class_id int 班级编号 可空
course varchar(10) 选修课程名 可空
score decimal(4,1) 分数 可空
status_values tinyint 状态 可空0休学或1在读
-- 通过DDL创建表
-- 批量插入5条学生记录,数据自定义
-- 根据学生编号批量删除学生,例如删除1 3 5号学生
-- 修改表中所有学生的状态为1,设置为在读状态
-- 修改表中1班级学生的状态为0,设置为全部休学
-- 查询学生表所有信息
-- 查询所有学生的学号,姓名,年龄
-- 查询1号的学生学号,年龄,选修课程,分数信息
-- 查询1班和2班的学生信息
-- 查询在读的所有学生
-- 查询20-23岁之间的学生
-- 查询已分配班级信息的学生列表
-- 查询选修'Java'类似课程的学生列表
-- 查询'王'氏学生列表
-- 查询1班的学生总数
-- 查询每一种选修课程的人数
-- 查询班级列表
-- 查询1班的男生和女生的数量
-- 查询每个班级的人数
-- 查询1班学生的"java开发"课程最低分,最高分,和平均分
-- 查询每门选修课程的平均成绩
-- 查询班级人数大于1个的班级列表,显示出: 班级编号,总人数
-- 查询选修课程达到2人以上的选修课列表,显示出:选修课程,选修人数
-- 查询1班'Java'课程成绩前三名的学生信息(无相同分数的情况)
-- 查询1班'Java'课程成绩最后一名的学生信息(无相同分数的情况)
-- 查询1班'Java'课程成绩第三名的学生信息(无相同分数的情况)
10 SQL查询语句的执行顺序
select name,max(score) as max_score
from stu_score
where name is not null
group by name
having max(score) > 500
order by max_score
limit 0,10
首先执行 from子句,从stu_score表组装数据源的数据
执行where子句,筛选stu_score表中所有数据不为NULL的数据
执行group by 子句,把stu_score表按"name"列进行分组
计算max()聚合函数,按'score'列求出每组学生中成绩的最高分
执行having,对组进行筛选
执行select列表
执行order by子句,把最后的结果按照max_score列进行升序排序
执行limit子句,筛选前10条结果
11 嵌套子查询
嵌套子查询:一个查询中嵌套另一个查询
嵌套子查询分类:标量子查询、列子查询、行子查询、表子查询
7.1 标量子查询:返回1行1列, 返回单一的一个值或者字符串
SELECT * FROM t1 WHERE column1 = (SELECT MAX(column2) FROM t2)
7.2 列子查询:返回N行1列
SELECT * FROM article WHERE uid IN(SELECT uid FROM user WHERE status=1)
7.3 行子查询:返回1行N列
SELECT * FROM (SELECT uid,uname FROM user WHERE status=1) as 表别名
7.4 表子查询:返回N行N列
SELECT * FROM (SELECT * FROM USER) AS 表别名
子查询练习-继续单表练习hw_student_info
查询年龄最高的学生信息
从各课程中获取课程成绩最高分大于90分的课程,将选修这些课程的学生列出来
查询Java课程成绩大于该课程平均分的学生列表
查询Java课程班级平均分大于该课程总平均分的班级列表
查询Java课程班级平均分大于该课程总平均分的班级数量
12 Navicat导入和导出表结构和数据
导出表结构和数据
生成一个.sql文件
导入表结构和数据