目录
注意:本文语法格式中[ ]所括起来的内容均可省略
准备工作
分别创建三张空表(学生表、老师表、课程表),本文的操作均是基于这三张表。
create table students(
id int auto_increment primary key,
name varchar(20),
age int,
height float,
gender char(10),
cls_id int,
is_delete int
);
create table teachers(
id int primary key,
name varchar(20)
);
create table classes(
id int primary key,
teacher_id int,
cls_content varchar(100),
cls_date datetime,
name varchar(50)
);
1、插入数据
语法格式:
INSERT [INTO]
表名 [字段名]
VALUES (值列表);
示例:向学生表中插入一行数据
第一种:
insert into students (id,name,age,height,gender,cls_id,is_delete)
values (0,'小明',18,180.00,2,1,0);
第二种:
insert into students values (0,'小明',18,180.00,2,1,0);
向学生表中插入多行数据:
insert into students (id,name,age,height,gender,cls_id,is_delete)
values (2,'佩奇',8,130.00,2,1,0),(3,'超人',36,180.00,1,2,0);
注意:为避免表结构发生变化引发错误,建议插入数据时写明具体字段名!
2、更新数据
语法格式:
UPDATE 表名 SET 字段1=值1,
字段2=值2,…,字段n=值n
[WHERE 条件];
示例:将所有学生的姓名改成邓超
UPDATE students SET name= '邓超';
示例: 将id是1学生的姓名改成超人,年龄改为30
update students set name='超人',age=30 where id=1;
3、删除数据
3.1 delete删除
语法格式:
DELETE FROM 表名
[WHERE条件];
示例:删除id是1的学生的数据
DELETE FROM students where id = 1;
3.2 truncate删除
语法结构:
TRUNCATE TABLE 表名;
示例:删除id是2的学生的数据【报错,不能加条件!!!】
TRUNCATE TABLE students where id = 2;
示例:删除学生表中的数据【清空数据,表还在,delete删除同理】
TRUNCATE TABLE students;
4、查询
前文的操作完成后三张表依旧是空表,接下来给出数据填充这三张表格。
INSERT INTO `students` (`id`, `name`, `age`, `height`, `gender`, `cls_id`, `is_delete`) VALUES (1, '小明', 18, 180, '女', 1, 0);
INSERT INTO `students` (`id`, `name`, `age`, `height`, `gender`, `cls_id`, `is_delete`) VALUES (2, '小月月', 18, 180, '女', 2, 1);
INSERT INTO `students` (`id`, `name`, `age`, `height`, `gender`, `cls_id`, `is_delete`) VALUES (3, '彭于晏', 29, 185, '男', 1, 0);
INSERT INTO `students` (`id`, `name`, `age`, `height`, `gender`, `cls_id`, `is_delete`) VALUES (4, '刘德华', 59, 175, '男', 2, 1);
INSERT INTO `students` (`id`, `name`, `age`, `height`, `gender`, `cls_id`, `is_delete`) VALUES (5, '黄蓉', 38, 160, '女', 1, 0);
INSERT INTO `students` (`id`, `name`, `age`, `height`, `gender`, `cls_id`, `is_delete`) VALUES (6, '凤姐', 28, 150, '保密', 2, 1);
INSERT INTO `students` (`id`, `name`, `age`, `height`, `gender`, `cls_id`, `is_delete`) VALUES (7, '王祖贤', 18, 172, '保密', 1, 1);
INSERT INTO `students` (`id`, `name`, `age`, `height`, `gender`, `cls_id`, `is_delete`) VALUES (8, '周杰伦', 36, NULL, '男', 3, 0);
INSERT INTO `students` (`id`, `name`, `age`, `height`, `gender`, `cls_id`, `is_delete`) VALUES (9, '程坤', 27, 181, '男', 2, 0);
INSERT INTO `students` (`id`, `name`, `age`, `height`, `gender`, `cls_id`, `is_delete`) VALUES (10, '刘亦菲', 25, 166, '男', 2, 0);
INSERT INTO `students` (`id`, `name`, `age`, `height`, `gender`, `cls_id`, `is_delete`) VALUES (11, '猪猪侠', 33, 162, '保密', 3, 1);
INSERT INTO `students` (`id`, `name`, `age`, `height`, `gender`, `cls_id`, `is_delete`) VALUES (12, '静香', 12, 180, '女', 2, 0);
INSERT INTO `students` (`id`, `name`, `age`, `height`, `gender`, `cls_id`, `is_delete`) VALUES (13, '郭靖', 12, 170, '男', 3, 0);
INSERT INTO `students` (`id`, `name`, `age`, `height`, `gender`, `cls_id`, `is_delete`) VALUES (14, '周杰', 34, 176, '女', 1, 0);
INSERT INTO `teachers` (`id`, `name`) VALUES (1, '赵老师');
INSERT INTO `teachers` (`id`, `name`) VALUES (2, '孙老师');
INSERT INTO `teachers` (`id`, `name`) VALUES (3, '李老师');
INSERT INTO `teachers` (`id`, `name`) VALUES (4, '周老师');
INSERT INTO `classes` (`id`, `teacher_id`, `cls_content`, `cls_date`, `name`) VALUES (1, 1, '班级学生有较强的学习能力', '2024-10-01 00:00:00', 'python_01期');
INSERT INTO `classes` (`id`, `teacher_id`, `cls_content`, `cls_date`, `name`) VALUES (2, 2, '班级学生比较顽皮', '2024-11-01 00:00:00', 'python_02期');
INSERT INTO `classes` (`id`, `teacher_id`, `cls_content`, `cls_date`, `name`) VALUES (3, 2, '数据结构班', '2024-11-01 00:00:00', 'data_struct_01期');
4.1 SELECT基本查询语句
语法格式:
SELECT 列名 FROM 表名;
示例:查询所有学生信息
select * from students;
示例:查询所有学生的姓名,性别
select name,gender from students;
4.2 运算符
算术运算符 + - * / %【取余运算符】
5 ÷ 2 = 2 .... 1
5 / 2 = 2 5 % 2 = 1
关系运算符 > < = <> >=
赋值运算符 =
逻辑运算符 and(&&)、or( ||)、not( !)
4.3 where条件查询
语法格式:
SELECT 列名
FROM 表名
WHERE 条件
示例:查询id为1学生的姓名,性别
SELECT name, gender FROM students WHERE id=1;
4.4 where多条件查询
语法格式:
SELECT 列名
FROM 表名
WHERE 条件 运算符 条件
示例:查询id为1或者为3的 学生 姓名,性别
select name,gender from students where id=1 or id=3;
4.5 like模糊查询
语法格式:
SELECT 列名
FROM 表名
WHERE 字段
LIKE '值'
示例:查询名字里面包含'小'的学生的信息
select * from students where name like '小%';
4.6 IN关键字查询
语法格式:
SELECT 列名
FROM 表名
WHERE 字段
IN (值1,值2,....);
示例:查询id为1,5,6,10的学生的信息
select * from students where id in(1,5,6,10);
4.7 BETWEEN关键字查询
语法格式:
SELECT 列名
FROM 表名
WHERE 字段
BETWEEN 值1 and 值2;
示例:查询id为8-10的学生的信息
select * from students where id between 8 and 10;
4.8 DISTINCT关键字查询(去重)
语法格式:
SELECT DISTINCT
字段名1,字段名2......
FROM 表名;
示例:查询性别有几种分类
select distinct gender from students;
4.9 ORDER BY关键字查询
语法格式:
SELECT <字段名列表>
FROM <表名>
[WHERE <查询条件>]
[ORDER BY <排序的列名>
[ASC 或 DESC]];
示例:将学生的身高按照降序排列
select * from students order by height desc;
4.10 LIMIT关键字查询
语法格式:
SELECT <字段名列表>
FROM <表名>
[WHERE <查询条件>]
[ORDER BY <排序的列名> [ASC 或 DESC]]
[LIMIT <行数>];
示例:只看前2条学生信息
select * from students limit 2;
5、连接查询
观察三张表,如何查看students表中cls_id所代表的的班级名称是什么? 答:使用连接查询
连接查询是将多张表中记录按照指定的条件进行连接的查询方式
注意:连接查询涉及到两个表以上,在查询的时候至少要有一个必备的连接条件,这个必备的条件就是两个表共有的那个字段相等,而且这个字段一定在一个表里是主键,在另一个表里是外健
5.1 内连接
内连接是返回连接表中符合连接条件记录的连接查询。
包括:显式内连接、隐式内连接
4.1.1 显示内连接查询
语法格式:
SELECT 字段 FROM 表1
INNER JOIN 表2
ON 连接条件
[WHERE 条件]
示例:查看学生所在班级
select s.name,c.name from students s inner join classes c on s.cls_id=c.id;
5.1.2 隐式内连接查询
语法格式:
SELECT 字段
FROM 表1,表2
WHERE 表1.条件=表2.条件
示例:查看学生所在班级
select s.name ,c.name from students s, classes c where s.cls_id = c.id;
5.2 外连接
5.2.1左外连接查询
左外连接是以左表为基表,返回左表中所有记录及连接表中符合条件的记录的外连接。
语法格式:
SELECT 字段 FROM 表1
LEFT [outer] JOIN 表2
ON 连接条件
[WHERE 条件];
示例:查看老师所在班级
select c.name,t.name from classes c left join teachers t on c.teacher_id = t.id;
5.2.2 右外连接查询
右外连接是以右表为基表,返回右表中所有记录及连接表中符合条件的记录的外连接。
语法格式:
SELECT 字段 FROM 表1
RIGHT [outer] JOIN 表2
ON 连接条件
WHERE 条件
示例:查看老师所在班级
select classes.name,teachers.name from classes right join teachers on classes.teacher_id = teachers.id;
6、聚合函数
如何查看班级同学的平均身高? 答:使用聚合函数
聚合函数是可以对一组值进行计算,并返回单个值的函数。
count()-计数
sum()-求和
max()-最大值
min()-最小值
avg()-平均值
语法格式:
SELECT 聚合函数<字段>
FROM 表名
[WHERE 条件]
[GROUP BY 聚合函数]
示例:查询班级学生的平均身高
select avg(height) as '平均身高' from students;
7、子查询(查询嵌套)
如何只查询比刘德华高的同一班的学生信息?答:子查询
定义:子查询是在一个查询的内部包括另一个查询的查询方式
7.1 简单子查询
示例:查看刘德华同学的所在班级的所有同学
select * from students where cls_id = (select cls_id from students where name = '刘德华');
7.2 ANY/SOME子查询
示例:查看赵老师所带的学生信息
select * from students where cls_id = any(select id from classes where teacher_id = (select id from teachers where name='赵老师'));
7.3 All子查询
示例:查看班级号大于赵老师班的学生信息
select * from students where cls_id > all(select id from classes where teacher_id = (select id from teachers where name='赵老师'));
7.4 EXISTS子查询
示例:查看存在王老师的班级表
select * from classes where exists (select * from teachers where name='王老师');
7.5 NOT EXISTS子查询
示例:创建教师表
create table IF NOT EXISTS teachers(
id int primary key,
name varchar(20)
);