目录
[1. 增加数据(INSERT语句)](#1. 增加数据(INSERT语句))
[2. 修改数据(UPDATE语句)](#2. 修改数据(UPDATE语句))
[3. 删除数据(DELETE语句)](#3. 删除数据(DELETE语句))
[4. 计算列(MySql8 新特性)](#4. 计算列(MySql8 新特性))
[1. DQL语言](#1. DQL语言)
[2. 查询语句语法规则](#2. 查询语句语法规则)
[LIKE 关键字:](#LIKE 关键字:)
[IN 关键字:](#IN 关键字:)
[NULL 值查询:](#NULL 值查询:)
[ORDER BY排序](#ORDER BY排序)
[3. 常用的聚合函数(⭐⭐)](#3. 常用的聚合函数(⭐⭐))
[3.1 GROUP BY](#3.1 GROUP BY)
[3.2 HAVING](#3.2 HAVING)
[4. 扩展](#4. 扩展)
一、Mysql对数据的增删改
DML(数据操作语言) Data Manipulation Language 用于对数据库中数据的增删改操作
**数据增加:**关键字INSERT,主要功能是 给数据库表增加记录。
**数据修改:**关键字是UPDATE,主要功能是 修改数据库表中已有的记录。可 以根据条件去做修改。
**数据删除:**关键字DELETE,主要功能室删除 数据库表中已有的记录。可以依 照条件去做修改。
1. 增加数据(INSERT语句)
语法:
sqlINSERT INTO `表名` [(`字段1`,`字段2`,...`字段n`)] VALUES/VALUE ('值1','值2',...'值n')[,('值1','值2',...'值n')...]; 其中: •"[]" 包含的内容可以省略; • 字段或值之间用英文逗号隔开; • 可同时插入多条数据,values 后用英文逗号隔开; • values和value的方式均可。
sql-- 全字段插入数据 -- 日期要用字符串的形式书写成日期格式 insert into student(sid,sname,birthday,ssex,classid) values(9,'张三','2000-1-1 14:30:59','男',1); -- 不写字段名就是全字段插入 insert into student values( null, '李四', '1999-2-2', '女', 1 ); insert into student values(default,'李四','1999-2-2','女',1);
sql-- 部分字段插入 -- 其他的字段不能有not null约束,如果有默认值也可以 insert into student(sname) values('王五');
一次性插入多条数据:
方式一:
sql-- 一次性插入多条数据 -- 方式一:(推荐使用) insert into student(sname,ssex) values ('唐三藏','男'),('孙悟空','男'),('猪悟能','男'), ('沙悟净','男');
方式二:
INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中。 目标表中任何已存在的行都不会受影响。
语法:
sqlINSERT INTO table2 (column_name,...) SELECT column_name,... FROMtable1; 其中: • table2 必须存在,将table1中数据赋值到table2中
sql-- 方式二:(不推荐) -- 目标表必须要事先存在 create table stu1( stuid int primary key auto_increment, xingming varchar(10), xingbie varchar(2), classid int ); -- insert into 目标表 select insert into stu1(xingming,xingbie,classid) select sname,ssex,classid from student;
方式三:
sql-- 方式三(不推荐) -- 目标表不能存在 -- create table 目标表 select create table newstu select sid,sname,birthday from student;
2. 修改数据(UPDATE语句)
语法:
sqlUPDATE 表名 SET `字段名1`= '值1' [ , `字段名2` = '值2', .... ] [ WHERE 条件]; 其中: •"[]" 包含的内容可以省略; • `字段名`为要更改数据的字段,'值'表示字段改后的值,注意字段和值的对应; • 可同时修改多个字段,多个字段后用英文逗号隔开; •"WHERE"是where子句,可以给修改增加条件; • 条件:为筛选条件,如不指定则修改该表的所有列数据。
sql-- 修改 update 表名 set 字段名=值,字段名=值...,字段名=值 【where 子句】 -- 数据库的值全部改变 -- 受影响的行数 -- 避免过多的读写(IO)数据库 update stu1 set xingbie ='男';
WHERE子句(⭐):
有条件的从数据库表中获取记录,通常同在修改,删除,和查询语句的时候,协助该类语句从条件中获取 记录。针对修改和删除语句,如果没有条件,则全部修改和全部删除。
运算符 含义 举例 结果 = 等于 5=6 false <> 或 != 不等于 5!=6 true > 大于 5>6 false < 小于 5<6 true >= 大于等于 5>=6 false <= 小于等于 5<=6 true BETWEEN 在某个范围之间 BETWEEN 5 AND 10 - AND 并且 5>1 AND 1>2 false OR 或 5>1 OR 1>2 True Not 非
sql-- where 条件是整张表每一条数据进行判断 **** update stu1 set xingbie ='女' where xingming='王五';
where 针对表中每一行数据
sql-- where 条件是整张表每一条数据进行判断 **** update stu1 set xingbie ='女' where xingming='王五'; -- 范围形 -- 方式一 -- 闭合区间 update stu1 set classid =100 where stuid >=10 and stuid <=15;
sql-- 方式二: -- between 跟较小的数据 and 较大的数据 update stu1 set classid =300 where stuid between 10 and 15;
3. 删除数据(DELETE语句)
语法:
sqlDELETE FROM 表名 [ WHERE 条件]; 其中: •"[]" 包含的内容可以省略; • "WHERE"可以通过where子句增加删除的条件。
sql-- 删除 -- delete from 表名 【where 子句】 delete from stu1 insert into stu1(xingming) values('张三')
删除数据(TRUNCATE语句)
语法:
sqlTRUNCATE [TABLE] 表名 其中: • TRUNCATE是一个特殊的删除语句,又叫做清空语句; • "[]"包含的内容可以省略; • 功能:清空某一张表内的全部数据,重置自增计数器; • 特点:由于没有条件约束,所以速度快,而且效率高。
sql-- 清空表 -- truncate 表名 truncate stu1
面试题
drop truncate delete 区别
- drop 包表结构,索引,数据全部删掉
- truncate 只保留表结构, 索引和数据删掉
- delete 只删数据
4. 计算列(MySql8 新特性)
什么叫计算列呢?简单来说就是某一列的值是通过别的列计算得来的。
例如,a列值为1、b列值为2,c列不需要手动插入,定义a+b的结果为c的值,那么c就是计算列,是通过别的列计算得来的。
在MySQL8.0中,CREATE TABLE 和 ALTER TABLE 中都支持增加计算列。下面以CREATE TABLE为例进行讲解。
举例:定义数据表tb1,然后定义字段id、字段a、字段b和字段c,其中字段c为计算列,用于计算a+b的值。
sql-- 计算列 CREATE TABLE jsltab( id INT PRIMARY KEY AUTO_INCREMENT, a INT , b INT , c INT GENERATED ALWAYS AS (a + b) VIRTUAL ); select * from jsltab insert into jsltab(a,b) values(2,3),(200,300)
二、数据的备份和还原
方法一:使用工具
备份:
选中需要备份的 右键 选择转储SQL文件
恢复:
右键 点击运行SQL文件 选择备份的文件即可
方法二:使用dos命令
数据库备份和恢复的作用和价值主要体现在以下几个方面:
- 高可用性:使数据库的失效次数减到 最少,从而使数据库保持 最大的可用性。
- 安全性:计算机病毒型、特洛伊木马型、"黑客"入侵型、 逻辑炸弹型等会造成信息丢失,丢失的数据需要及时恢复。
- 完整性:当数据库失效后,确保尽量少的数据丢失或根本不丢失,从而使数据具有最大的完整性。
三、单表查询
1. DQL语言
DQL(Data Query Language 数据查询语言)。用途是查询数据库数据,如SELECT语句。是SQL语句中最核心、最重要的语句,也是使用频率最高的语句。其中,可以根据表的结构和关系分为单表查询和多表联查。
- 单表查询:针对数据库中的一张数据表进行查询,可以通过各 种查询条件和方式去做相关的优化。
- 多表联查:针对数据库中两张或者两张以上的表同时进行查询, 依赖的手段有复杂查询和嵌套查询。
2. 查询语句语法规则
sqlSELECT [DISTINCT] {*|表1.*|[ 表1.字段1 [as 字段别名1] [, 表1.字段2[as 字段别名2]][, ...]]} FROM 表1 [as 表别名 ] [ left|right|inner join 表2 on 表之间 的关系 ] [ WHERE] [ GROUP BY ] [ HAVING] [ ORDER BY] [ LIMIT {[ 位置偏移量,]行数}]; 其中: "[ ]"包含的内容可以省略; "{ }"包含的内容必须存在; 必须按照该顺序使用
关键字:
- DISTINCT:设定DISTINCT可以去掉重复记录。
- AS:表名或者字段名过长时,可以用AS关键字起别名,方便操作。
- GROUP BY:按组分类显示查询出的数据。
- HAVING:GROUP BY分组时依赖的分组条件。
- ORDER BY:将查询出来的结果集按照一定顺序排序完成。
- LIMIT:限制显示查询结果的条数。
sql#DQL -- 所有的查询都会得到一张虚拟表 -- 数据查询 -- 最简单的查询 select 'abc'; select 123; select 1+1;
指定字段列:
语法:
sqlSELECT * | 字段名1, 字段名2... FROM 表名 其中:"*"表示所查询的数据库表的全部字段。
sql-- 从表中查询数据 -- select from 表名 -- 全字段查询 select Sid,Sname,birthday,Ssex,classid from student; select * from student;
sql-- 部分字段查询 select Sname,Ssex from student;
表别名和字段别名:
语法:
sqlSELECT 表别名.字段名1 AS 字段别名1, 表别名.字段名2 AS 字段别名2 FROM 表名 AS 表别名 其中: • "." 当前表存在的字段; • "AS"可忽略不写,"AS"的功能如下: • 给字段取一个新别名; • 给表取一个新别名; • 把经计算或总结的结果用另外一个新名称来代替。
sql-- 给字段起别名 select Sname as '学生姓名' ,Ssex from student; select Sname as '学生姓名' ,Ssex '学生性别', birthday 学生生日 from student;
sql-- 添加一个学校的字段 select Sname 学生姓名, 'xynu' 学校 from student;
DISTINCT:
语法:
sqlSELECT DISTINCT 字段名1, 字段名2... FROM 表名 其中:去掉SELECT查询返回的记录结果中重复的记录(所有返回列的值都相同), 只返回一条。
sql-- 查询学生表中性别的数据 -- distinct 去除重复的数据 -- 去重机制 完全一致 select distinct Ssex from student;
WHERE条件子句:
语法:
sqlSELECT * FROM 表名 [ WHERE 条件]; 其中: • WHERE条件子句不是必须的; • WHERE子句,可以给查询增加条件; • 条件:为筛选条件,如不指定则修改该表的所有数据。
sql-- 带条件的查询 where子句 select * from student where Ssex ='男' and classid =1;
练习:
sql-- 查询Sid 2-6 的学生 select * from student where Sid >=2 and Sid <=6; select * from student where Sid between 2 and 6;
sql-- 查询出年龄大于1990-1-1的学生 select * from student where birthday < '1990-1-1';
LIKE 关键字:
语法:
sqlSELECT * FROM 表名 WHERE 字段 LIKE 条件; 其中: • 在WHERE子句中,使用LIKE关键字进行模糊查询; • 与"%"一起使用,表示匹配0或任意多个字符; • 与"_"一起使用,表示匹配单个字符。
sql-- like 模糊查询 insert into student (sname) values ('张老师'),('小张'),('张美女'),('姓张的老师'); -- % 任意多的任意字符 -- _ 一个任意字符 select * from student where Sname like '%张%'; select * from student where Sname like '张%'; select * from student where Sname like '%张_'; select * from student where Sname like '%张__';
IN 关键字:
语法:
sqlSELECT * FROM 表名 WHERE 字段 IN (值1,值2...) 其中: • 查询的字段的值,至少与IN 后的括号中的一个值相同; • 多个值之间用英文逗号隔开。
sql-- in 在特定的范围内 -- 1,3,4,5,8 select * from student where Sid =1 or Sid =3 or Sid =4 or Sid =5 or Sid =8; select * from student where Sid in (1,3,4,5,8);
NULL 值查询:
语法:
sqlSELECT * FROM 表名 WHERE 字段 IS NULL | IS NOT NULL 其中: • NULL代表"无值"; • 区别于零值0和空符串; • 只能出现在定义允许为NULL的字段; • 须使用 IS NULL 或 IS NOT NULL 比较操作符去比较。
sql-- 对 null 的操作 select * from student where birthday is null; select * from student where birthday is not null;
ORDER BY排序
语法:
sqlSELECT * FROM 表名 ORDER BY 字段名 [DESC|ASC] 其中: • ORDER BY 表示对SELECT语句查询得到的结果,按字段名进行排序; • DESC表示排序的顺序为降序,ASC表示排序的顺序为升序; •"[ ]"包含的内容可以省略。
sql-- 排序 -- asc (或不写)就是升序 -- desc 降序 -- 先写先排 select * from student order by classid desc, birthday asc;
LIMIT关键字:
语法:
sqlSELECT * FROM 表名 LIMIT [n , m ] 其中: • LIMIT关键字是MySQL特有关键字; • LIMIT限制SELECT返回结果的行数; • n 表示第一条记录的偏移量,m 表示显示记录的数量; •"[ ]"包含的内容可以省略。
sql-- 分页 limit 位置,步长 如果不写位置 默认为0 select * from student limit 0,3; select * from student limit 3,3; select * from student limit 6,3; select * from student limit (页码-1)*步长,步长; select * from student limit (2-1)*3,3;
LIMIT实现分页显示的方式:
MySql8新关键词OFFSET:
语法:
sqlSELECT * FROM 表名 limit m offset n 其中: • LIMIT关键字是MySQL特有关键字; • LIMIT限制SELECT返回结果的行数; • n 表示第一条记录的偏移量,m 表示显示记录的数量; •"[ ]"包含的内容可以省略。
sql-- offset 设置偏移量,位置 select * from student limit 3 offset 6
3. 常用的聚合函数(⭐⭐)
函数名 返回值 AVG(col) 返回指定列的平均值 COUNT(col) 返回指定列中非NULL值的个数 MIN(col) 返回指定列的最小值 MAX(col) 返回指定列的最大值 SUM(col) 返回指定列的所有值之和 count
sql-- ***** 聚合函数 -- count 个数 --全类型 -- count 不统计null -- 学生表中一共有多少个人 select count(*) from student; select count('abc') from student; -- 常量 select count(Sid) from student; select count(birthday) from student;-- null 不会被count计算到
sql-- 得到男同学的人数 select count(*) from student where Ssex='男';
sum
sql-- sum 总和 select sum(score) from sc;
练习:
sql-- max 最大值 -- min 最小值 -- avg 平均值 -- 统计出sc表 -- 一共的考试次数 ,总成绩,平均分, 最高分,最低分 -- sum 总和 select count(*) 考试次数,sum(score) 总成绩,avg(score) 平均分,max(score) 最高分,min(score) 最低分 from sc;
3.1 GROUP BY
- 对所有的数据进行分组统计;
- 分组的依据字段可以有多个,并依次分组。
sql-- 查询出男同学和女同学各有多少个人 select count(*) from student where Ssex ='男'; select count(*) from student where Ssex ='女'; -- 上面两句等同于这句 select Ssex,count(*) from student group by Ssex;
sqlselect Ssex,max(Sid) from student group by Ssex;
练习:
sql-- 查出每个学生的平均分 select Sid,avg(score),count(*) from sc group by Sid;
3.2 HAVING
与GROUP BY结合使用,进行分组后的数据筛选。
sql-- 找到平均分不及格的学生 select Sid,avg(score)from sc group by Sid having avg(score)<60;
where 和 having 的区别
- where 必须出现在group by 前面 having 必须出现在group by 后面
- where筛选的聚合前的数据 每一行数据 having 筛选的是聚合后的数据
4. 扩展
在不同的 DBMS 中使用的关键字可能不同。在 MySQL、PostgresQL、MariaDB 和 sQLite 中使用 LIMIT 关键字,而且需要放到 SELECT 语句的最后面。
sql如果是 SQL Server 和 Access,需要使用 TOP 关键字,比如: SELECT TOP 5 name,hp_max FROM heros ORDER BY hp_max DESC 如果是 DB2,使用 FETCH FIRST 5 ROWS ONLY 这样的关键字: SELECT name, hp_max FROM herOS ORDER BY hp_maX DESC FETCH FIRST 5 ROWS ONLY 重要: 如果是 Oracle,你需要基于 ROWNUM 来统计行数: SELECT rownum,last_name,salary FROM employees WHERE rownum < 5 ORDER BY salary DESC;
四、总结
- DML语句内容?
- INSERT语句,UPDATE语句和DELETE语句;
- 新增语句如何实现多记录同时新增?
- INSERT INTO `表名` (`字段1`,`字段n`) VALUES (值1,值n),(值1,值n),(值1,值n);
- WHERE子句的功能?
- 依赖逻辑条件对数据库的记录修改,删除或者查询;
- TRUNCATE语句和DELETE语句的异同?
- 相同点:都能删除数据,都不能修改表结构;
- 不同点:1、前者会重置自增计数器,后者不会;
- 2、前者无条件约束,速度快效率高。
- DQL语句内容
- SELECT语句。