目录
有关数据表的DML操作
INSERT
针对于数据的插入
DELETE
针对于数据的删除
UPDATE
针对于数据的修改
1.1 INSERT 语句
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.2 REPLACE 语句
replace语句的语法格式(三种)
语法格式1 | replace into 表名 [(字段列表)] values (值列表); |
语法格式2 | replace [into] 目标表名 [(字段列表1) select (字段列表2) form 源表] [where 条件表达式]; |
语法格式3 | replace [into] 表名 set 字段1=值1,字段2=值2; |
REPLACE 语句 和 INSERT 语句的区别
replace 语句的功能 和 insert 语句的功能 基本相同,不同之处在于:使用 replace语句向表插入新纪录时,如果新记录的 主键值或者唯一性约束的字段值与已有记录相同,则已有记录先被删除(注意:已有记录删除时也不能违背外键约束条件) 然后再插入新记录
使用 replace 的最大好处是可以将 delect 和 insert 合二为一(效果相当于更新),形成一个原子操作,这样就无需将 delect 操作与 insert 操作置于事务中了
1.3 DELETE 语句 | | TRUNCATE 语句
DELCET (TRUNCATE) FRON 表名 [WHERE 条件];
DELETE
删除数据,保留表结构,必要时可以回滚,但是如果数据量较大,运行速度不及 TRUNCATE
TRUNCATE
删除所有数据,保留表结构,不能够回滚,一次全部删除所有数据,速度相对很快
DROP
删除数据和表结构,删除速度最快
1.4 UPDATE 数据
UPDATE 表名 SET 列名 = 值 [,列名 = 值, 列名 = 值, 列名 = 值,......]
[WHERE 条件];
1.5 SELECT 语句 (DQL数据查询语句)
1.5.1 基础语法
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;
1.5.2 SELECT 语句中的算数表达式
对数值型数据列、变量、常量可以使用算数操作符创建表达式 | (+ - * /) |
对日期型数据列、变量、常量可以使用部分算数操作符创建表达式 | (+ -) |
运算符不仅可以在列和常量之间进行运算,也可以在多列之间进行运算
示例:
SELECT 100+80;
SELECT '300'+80; #只要其中一个是数值类型,而另一个能够转成数值,则自动转换并计算
SELECT 'ABC'+20; #若转换不成功,则将其认为是数字0对待
SELECT 'Hello'+'World'; #若转换不成功,则将其认为是数字0对待
SELECT NULL+80; #只要有一个为NULL,则结果为NULL
1.5.3 运算符优先级
乘除 优先级 高于 加减 |
同级运算 时 运算顺序 由左到右 |
表达式内 使用括号,可以改变优先级的运算顺序 |
1.5.4 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;
1.5.5 祛除重复的记录
可以使用 关键字 DISTINCT 清除查询记录中的重复的数据
示例:
#查看学生表的性别
#缺省情况下查询显示所有行,包括重复行
SELECT sex "性别"
FROM student;
#可以使用关键字DISTINCT清除查询记录中的重复数据
SELECT DISTINCT sex "性别"
FROM student;
1.5.6 WHERE 限制所选择的横向区域
WHERE 中的 字符串 或者 日期格式的内容,需要使用 单引号 进行专门的标识
正确标识:
StudentName = ‘张三’
错误标识:
StudentName = 张三
字符串内的数据,对大小写很敏感
如果所查询记录中有 Zhang123@163.com 那么我们在检索的时候,就不能表示为:zhang123@163.com
日期值对格式是敏感的
如果所查询记录中有 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;
1.5.7 WHERE 中的比较运算符
< > <= >= != =
示例:
#查询生日在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);
1.5.8 LIKE 关键字
LIKE关键字主要用于:
执行模糊查询,查询条件可以包含 文字字符 或 占位符
通过 % 表示匹配 0 或者 多个字符
_ 表示匹配一个字符
示例:
#查询学生姓名 姓名以张开始,后面字符数量不定
SELECT StudentName "姓名"
FROM student
WHERE StudentName LIKE '张%';
LIKE '%张' | 以 张 字结束 |
LIKE '%张%' | 包含 张 字 |
LIKE '张_' | 以张开始而且后方匹配一个字符 |
1.5.9 GROUP BY 分组查询
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 表示:分组后执行的条件过滤 |
1.5.10 ORDER BY 排序查询
语法
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;
1.5.11 LIMIT 区间查询
语法
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;
1.5.12 GROUP_CONCAT 分组数据合并
示例:
#根据班级进行分组,要求查看各班人数,以及各班学员姓名。
SELECT GradeID "班级编号",COUNT(*) "班级人数",GROUP_CONCAT(StudentName) "学员姓名"
FROM student
GROUP BY(GradeID);
注意事项
使用GROUP_CONCAT()函数时必须要对数据源进行分组,如果不分组,所有数据都将合并成一行 |
对结果集排序 查询语句执行的查询结果,数据是按照插入时顺序进行排序 |
实际上需要按照某列大小值进行拍讯的话,建议只针对于数值或日期通过 ORDER BY函数进行排序 |
在语句最后也可以通过LIMIT控制容量大小 |
1.6 多表关联查询
1.6.1交叉连接查询
示例:
#查询所有的学生+所有的班级信息
SELECT *
FROM student,grade;
1.6.2 等值连接查询
语法
SELECT * FROM 表1,表2,... WHERE 表1.列 = 表2.列 [AND...];
示例:
#查询所有的学生姓名,住址,班级名称
SELECT StudentName "姓名",Address "住址",GradeName "班级名称"
FROM student,grade
WHERE student.GradeID = grade.GradeID;
1.6.3 内连接查询
语法
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;