目录
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 = 张三
字符串内的数据,对大小写很敏感
如果所查询记录中有? ? ? ? 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;
? ? ? ? <? ?>? ?<=? ?>=? ?!=? ?=
示例:
#查询生日在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;