目录
有关数据表的DML操作
1.1 INSERT 语句
1.2 REPLACE 语句
replace语句的语法格式(三种)
REPLACE 语句 和 INSERT 语句的区别
1.3 DELETE 语句 | | TRUNCATE 语句
DELETE
TRUNCATE
DROP
1.4 UPDATE 数据
1.5 SELECT 语句 (DQL数据查询语句)
1.5.1 基础语法
语法解释
1.5.2 SELECT 语句中的算数表达式
1.5.3 运算符优先级
1.5.4 NULL值的使用
补充
1.5.5 祛除重复的记录
1.5.6 WHERE 限制所选择的横向区域
1.5.7 WHERE 中的比较运算符
1.5.8 LIKE 关键字
1.5.9 GROUP BY 分组查询
语法
分组函数的重要规则
1.5.10 ORDER BY 排序查询
语法
1.5.11 LIMIT 区间查询
语法
1.5.12 GROUP_CONCAT 分组数据合并
注意事项
1.6 多表关联查询
1.6.1交叉连接查询
1.6.2 等值连接查询
语法
1.6.3 内连接查询
语法
INSERT
针对于数据的插入
DELETE
针对于数据的删除
UPDATE
针对于数据的修改
INSERT INTO 表名 [(列名1,列名2,......)] VALUES (值1,值2,......);
默认情况下,一条插入命令只针对一行进行影响
INSERT INTO 表名 [(columnName,[columnName...])] VALUES
(value[,value.....]),(value[,value.....]),
(value[,value.....]).....;
一次性插入多条记录
注意:
如果我们为每一列都要指定注入的值,那么表名后面就不需要罗列 插入的列名
INSERT INTO 表名 VALUES (值1,值2,值3,......)
语法格式1 | replace into 表名 [(字段列表)] values (值列表); |
语法格式2 |
replace [into] 目标表名 [(字段列表1) select (字段列表2) form 源表] [where 条件表达式]; |
语法格式3 | replace [into] 表名 set 字段1=值1,字段2=值2; |
replace 语句的功能 和 insert 语句的功能 基本相同,不同之处在于:使用 replace语句向表插入新纪录时,如果新记录的 主键值或者唯一性约束的字段值与已有记录相同,则已有记录先被删除(注意:已有记录删除时也不能违背外键约束条件) 然后再插入新记录
使用 replace 的最大好处是可以将 delect 和 insert 合二为一(效果相当于更新),形成一个原子操作,这样就无需将 delect 操作与 insert 操作置于事务中了
DELCET (TRUNCATE) FRON 表名 [WHERE 条件];
删除数据,保留表结构,必要时可以回滚,但是如果数据量较大,运行速度不及 TRUNCATE
删除所有数据,保留表结构,不能够回滚,一次全部删除所有数据,速度相对很快
删除数据和表结构,删除速度最快
UPDATE 表名 SET 列名 = 值 [,列名 = 值, 列名 = 值, 列名 = 值,......]
[WHERE 条件];
SELECT {*,列名,函数}
FROM 表名
[WHERE 条件];
1、SELECT 检索关键字,* 匹配所有列 , 匹配指定列
2、FROM 所提供的数据源(表,视图,另一个查询机制反馈的结果)
3、WHERE 条件(控制查询的区域)
示例:
#查询学生表的所有列以及所有行
SELECT *
FORM student;
#查询指定三列的内容所有行(学生表的姓名、住址、邮箱)
SELECT StudentName,Adress,Email
FROM student;
#查询生日在2002-09-06 2010-09-06 的 男生 的 姓名
SELECT StudentName
FROM student
WHERE BornDate>'2002-09-06' AND BornDate<'2010-09-06' AND sex = 1;
对数值型数据列、变量、常量可以使用算数操作符创建表达式 | (+ - * /) |
对日期型数据列、变量、常量可以使用部分算数操作符创建表达式 | (+ -) |
运算符不仅可以在列和常量之间进行运算,也可以在多列之间进行运算
示例:
SELECT 100+80;
SELECT '300'+80; #只要其中一个是数值类型,而另一个能够转成数值,则自动转换并计算
SELECT 'ABC'+20; #若转换不成功,则将其认为是数字0对待
SELECT 'Hello'+'World'; #若转换不成功,则将其认为是数字0对待
SELECT NULL+80; #只要有一个为NULL,则结果为NULL
乘除 优先级 高于 加减 |
同级运算 时 运算顺序 由左到右 |
表达式内 使用括号,可以改变优先级的运算顺序 |
String str = null;
String str = "";
null指的是 不可用、未分配的值
null不等于 零或者空格
任意数据类型都支持 null 这种表达式
包括 null 的任何算数表达式结果都等于 空
字符串 和 null 进行连接运算,结果也为 空
<==> 安全等于 等价于 = 和 IS 两者的结合 |
示例:
#查询学号为001的学生
SELECT *
FROM student
WHERE StudentNo <==> 001; # WHERE StudentNo = 001;
#查询邮箱为空的学生的信息
SELECT *
FROM student
WHERE Email <==> NULL; # WHERE Email IS NULL;
可以使用 关键字 DISTINCT 清除查询记录中的重复的数据
示例:
#查看学生表的性别
#缺省情况下查询显示所有行,包括重复行
SELECT sex "性别"
FROM student;
#可以使用关键字DISTINCT清除查询记录中的重复数据
SELECT DISTINCT sex "性别"
FROM student;
WHERE 中的 字符串 或者 日期格式的内容,需要使用 单引号 进行专门的标识
正确标识:
StudentName = ‘张三’
错误标识:
StudentName = 张三
字符串内的数据,对大小写很敏感
如果所查询记录中有 [email protected] 那么我们在检索的时候,就不能表示为:[email protected]
日期值对格式是敏感的
如果所查询记录中有 2002-09-06 00:00:00 那么我们在检索的时候,就不能表示为:2002年09月06日
示例:
#查询姓名是张三的学生信息
SELECT *
FROM student
WHERE StudentName = '张三';
#查询生日是1986-12-31的学生信息
SELECT *
FROM student
WHERE BornDate = '1986-12-31';
#查询学号是0001的学生信息
SELECT *
FROM student
WHERE StudentNo = 0001;
< > <= >= != =
示例:
#查询生日在2000-01-01之后的学生信息
SELECT *
FROM student
WHERE BornDate > '2000-01-01';
#WHERE中逻辑运算符 AND OR NOT
#AND需要所有条件都满足
#查询班级编号是1,并且生日在1980-01-01之后,并且性别是1的学生信息
SELECT *
FROM student
WHERE GradeId = 1 AND BornDate > '1980-01-01' AND sex = 1;
#OR只要满足多条件之一即可
#查询班级编号是1,或者生日在1980-01-01之后,或者性别是1的学生信息
SELECT *
FROM student
WHERE GradeId = 1 OR BornDate > '1980-01-01' OR sex = 1;
#NOT表示取反
#查询邮箱不为空的学生的姓名,邮箱地址
SELECT StudentName "姓名",Email "邮箱地址"
FROM student
WHERE Email IS NOT NULL;
#查询生日在2000-2010之间的学生姓名
SELECT StudentName "姓名"
FROM student
WHERE BornDate >= '2000-01-01' AND BornDate <= '2010-01-01';
#使用BETWEEN关键字实现范围查询
SELECT StudentName "姓名"
FROM student
WHERE BornDate BETWEEN '2000-01-01' AND '2010-01-01';
#班级是1或2或3班的学生姓名
SELECT StudentName "姓名"
FROM student
WHERE GradeId = 1 OR GradeId = 3 OR GradeId = 2;
#使用IN关键字进行匹配
SELECT StudentName "姓名"
FROM student
WHERE GradeId IN (1,2,3);
LIKE关键字主要用于:
执行模糊查询,查询条件可以包含 文字字符 或 占位符
通过 % 表示匹配 0 或者 多个字符
_ 表示匹配一个字符
示例:
#查询学生姓名 姓名以张开始,后面字符数量不定
SELECT StudentName "姓名"
FROM student
WHERE StudentName LIKE '张%';
LIKE '%张' | 以 张 字结束 |
LIKE '%张%' | 包含 张 字 |
LIKE '张_' | 以张开始而且后方匹配一个字符 |
GROUP BY 真正作用在于 与各种聚合函数配合使用,用来对查询出来的数据进行 行分组
分组的含义:将表中列值相同的多条记录,当成是一条记录进行处理,最终也只能输出一条记录,分组函数 忽略空值
SELECT {*,列名,函数}
FROM 表名
[WHERE 基础条件]
[GROUP BY 分组条件]
[HAVING 过滤条件]
示例:
#统计各班人数
SELECT COUNT(*) "人数",GradeID "班级编号"
FROM student
WHERE sex = 1
GROUP BY (GradeID);
#统计每个学生的考试总分,平均分,最高分,最低分
SELECT StudentNo "学号", SUM(StudentResult) "总分",AVG(StudentResult) "平均分",MAX(StudentResult) "最高分",MIN(StudentResult) "平最低分"
FROM result
GROUP BY (StudentNo);
#考试时间在 2012年01月01日后 统计每个学生的考试总分,平均分,最高分,最低分
SELECT StudentNo "学号", SUM(StudentResult) "总分",AVG(StudentResult) "平均分",MAX(StudentResult) "最高分",MIN(StudentResult) "平最低分"
FROM result
WHERE ExamDate >= '2012-01-01'
GROUP BY (StudentNo);
#考试时间在 2012年01月01日后 统计每个学生的考试总分,平均分,最高分,最低分 过滤掉 总分在650以下的
SELECT StudentNo "学号", SUM(StudentResult) "总分",AVG(StudentResult) "平均分",MAX(StudentResult) "最高分",MIN(StudentResult) "平最低分"
FROM result
WHERE ExamDate >= '2012-01-01'
GROUP BY (StudentNo)
HAVING SUM(StudentResult) >= 650;
如果使用了分组函数,或者是使用了GROUP BY(字段1,字段2,......)执行查询,那么出现在SELECT 列表后的字段,要么必须 是聚合函数,要么出现过在 GROUP字句里面 |
GROUP BY 子句的字段可以不出现在 SELECT 内 |
使用聚合函数但不使用分组查询时,那么所有的数据会作为一组进行显示 |
GROUP BY 前面的 WHERE 表示:分组前执行的条件过滤 |
GROUP BY 后面的 HAVING 表示:分组后执行的条件过滤 |
SELECT {*,列名,函数}
FROM 表名
[WHERE 基础条件]
[GROUP BY 分组条件]
[HAVING 过滤条件]
[ORDER BY (需要排序的字段) ASC||DESC]; #ASC升序(升序) DESC(降序)
示例:
#查询平均成绩在80以上的学生(学号)信息,同时成绩还需要按照降序排列
SELECT StudentNo "学号",AVG(StudentResult) "成绩"
FROM result
GROUP BY (StudentNo)
HAVING AVG(StudentResult) > 80;
ORDER BY(AVG(StudentResult)) DESC;
SELECT {*,列名,函数}
FROM 表名
[WHERE 基础条件]
[GROUP BY 分组条件]
[HAVING 过滤条件]
[ORDER BY (需要排序的字段) ASC||DESC] #ASC升序(升序) DESC(降序)
[LIMIT A,B];
LIMIT | 连续区间查询 |
LIMIT A,B | A表示需要查询的行的索引位 B所查询的容量 |
LIMIT 0,5 | 第一行---第五 |
LIMIT 5,5 | 第六行---第十 |
LIMIT 10,5 | 第十一行---第十五 |
LIMIT 15,5 | 第十六---第二十 |
技巧:
LIMIT (当前页码数-1)*容量,容量
示例:
#求学校学生中 三甲学生的信息
#分析 学生总分 降序排列 区间取前三
SELECT StudentNo "学号",SUM(StudentResult) "总成绩"
FROM result
GROUP BY (StudentNo)
ORDER BY(SUM(StudentResult)) DESC
LIMIT 0,3;
示例:
#根据班级进行分组,要求查看各班人数,以及各班学员姓名。
SELECT GradeID "班级编号",COUNT(*) "班级人数",GROUP_CONCAT(StudentName) "学员姓名"
FROM student
GROUP BY(GradeID);
使用GROUP_CONCAT()函数时必须要对数据源进行分组,如果不分组,所有数据都将合并成一行 |
对结果集排序 查询语句执行的查询结果,数据是按照插入时顺序进行排序 |
实际上需要按照某列大小值进行拍讯的话,建议只针对于数值或日期通过 ORDER BY函数进行排序 |
在语句最后也可以通过LIMIT控制容量大小 |
示例:
#查询所有的学生+所有的班级信息
SELECT *
FROM student,grade;
SELECT * FROM 表1,表2,... WHERE 表1.列 = 表2.列 [AND...];
示例:
#查询所有的学生姓名,住址,班级名称
SELECT StudentName "姓名",Address "住址",GradeName "班级名称"
FROM student,grade
WHERE student.GradeID = grade.GradeID;
SELECT * FROM 表1 INNER JOIN 表2 ON 表1.列 = 表2.列 [INNER JOIN 表3 ON 关系 .....][WHERE 基础条件];
示例:
#练习查询学生姓名,参考科目,考试时间,考试成绩
SELECT s.StudentName "学生姓名",su.SubjectName "参考科目",r.ExamDate "考试时间",r.StudentResult "考试成绩"
FROM student s INNER JOIN result r ON r.StudentNo = s.StudentNo
INNER JOIN subject su ON r.SubjectNo = su.SubjectNo;