今天主要学习mysql的DML&DQL操作
思维导图:
一.DML操作(重点)
[关键字:insert(插入)、update(修改)、(delete删除)]
1.添加数据
(1)指定列名的添加
insert into 表名(字段名1,字段名2,字段名3...字段名N)
values(数据值1,数据值2,数据值3...数据值N)
(2)全部列的添加
insert into 表名 values(数据值1,数据值2,数据值3...数据值N)
注意:
<1>如果指定列后,可以自由的调整添加的顺序和个数,但是你的值必须要和你自定义的个数和顺序完全一致
<2>指定列名的好处是,可以选择性的添加指定列 而不是全部添加。
<3>如果没有指定列,则值添加的个数和顺序必须和你建表的时候的顺序完全一致。
<4>除了数字类型,其余的所有数值都必须使用单引号进行包裹(建议非关键字全部写上反引号)
(3)一次性插入多条数据
**方式一:**
INSERT INTO 表名 VALUES (数据值);
INSERT INTO 表名 VALUES (数据值);
INSERT INTO 表名 VALUES (数据值);
**方式二:**
INSERT INTO 表名 VALUES (数据值),(数据值),(数据值);
2.蠕虫复制插入
(1)概念:
一个已经存在数据的表连同数据值和表结构复制到另外一张表当中被称之为蠕虫复制
(2)全表复制:
INSERT INTO stu2 SELECT * FROM stu;
(3)指定列数据复制:
复制表的列数和顺序必须和被复制表的查询列数和顺序完全一致
INSERT INTO stu2(name) SELECT name FROM stu;
3.修改数据
(1)修改(更新)数据主要依赖于三个关键字:
UPDATE(修改那张表)
SET(修改的值)
WHERE(修改的限制条件)
(2)修改全部数据:
UPDATE 表名 SET 字段名=数据值;
-- 需求1:修改学生的姓名为白骨精
UPDATE student SET name='白骨精';
(3)修改指定字段数据:
UPDATE 表名 SET 字段名 = 数据值 WHERE 字段名 = 数据值;
-- 将admin的年龄修改为20岁
UPDATE student SET age = 20 WHERE id = 3;
(4)同时修改多个字段:
UPDATE 表 SET 字段名1 = 数据值1,字段名2 = 数据值2 WHERE 字段名 = 数据值;
-- 将admin的年龄修改为18岁,并且将姓名修改为root
UPDATE student SET age = 18,name = 'root' WHERE id = 3;
(5)在原基础数据上进行操作修改:
-- 在所有员工的年龄上新增加一岁
UPDATE student SET age = age+1;
注意:使用修改操作,请务必写上WHERE的限制条件,否则是整表修改,而不是指定修改
4.删除数据
(1)依赖关键字:DELETE FROM 删除那张表的数据
(2)删除表的全部数据:
DELETE FROM 表名;
-- 删除学生表的全部数据
DELETE FROM stu;
(3)删除表的指定数据:
DELETE FROM 表名 WHERE 字段名 = 字段值;
-- 删除所有名字为白骨精的数据
DELETE FROM student WHERE name = '白骨精';
(4)TRUNCATE删除全表数据:
TRUNCATE TABLE 表名;
-- 删除student数据
TRUNCATE TABLE student;
TRUNCATE和DELETE的区别:
<1>TRUNCATE:
.TRUNCATE会删除自增长序列,下一次添加会重新从0开始记录
.TRUNCATE删除表数据是先删除,然后使用空记录覆盖替换
.TRUNCATE删除表不允许添加任何的限制条件
.TRUNCATE删除类似于物理删除替换,数据恢复难度大
<2>DELETE:
.DELETE删除不会影响自增长序列,下一次添加会从最后一次增长序列继续开始计算。
.DELETE删除是直接将数据清空,并不会覆盖
.DELETE删除允许条件限制条件指定删除
.DELETE删除类似于逻辑删除,由于不破坏结构,不覆盖记录 数据一般可以恢复。
二.DQL操作(重中之重)
1.概念:
DQL泛指我们数据库当中的所有查询操作,DQL的任何语句都不会对数据库当中的表结构以及数据源造成任何的影响和改变,只不过是以一种虚拟表的方式进行数据的显示。
2.DQL的常用普通查询语法:
SELECT字段列表
FROM表名列表
WHERE条件列表
GROUP BY分组字段
HAVING分组条件
ORDER BY排序条件
LIMIT分页条件
3.查询表的所有数据:
如果要查询一个表的全部数据,可以使用*好来替代所有字段
SELECT * FROM 表名;
-- 查询所有学生
SELECT * FROM stu;
4.查询表的指定列:
查询列的显示顺序和我们书写的顺序是一致的
SELECT 列名1,列名2 FROM 表名;
-- 查询学生表的户籍地址以及学生姓名
SELECT `name`,`address` FROM `stu`;
5.指定别名查询:
使用别名查询,在显示的时候可以使用我们自定义的名字,不会修改表结构,在多表查询的时候经常使用。别名的AS是可以省略的!
SELECT 字段名 AS '新别名' FROM `stu`;
-- 查询学生表的户籍地址以及学生姓名
SELECT `name` AS '姓名',`address` AS '地址' FROM `stu`;
-- 省略AS指定别名
SELECT `name` '姓名',`address` '地址' FROM `stu`;
6.常量列查询
需要临时使用的列的临时的动态加入到显示列表,方便操作不会修改表结构。
SELECT 字段名 AS '新别名',临时常量 AS ’常量别名‘ FROM 表名;
-- 查询学生表的所有数据,并且计算该学生的总成绩,顺便指定别名。
SELECT id 'ID',name '姓名',mysql 'mysql成绩',java 'java成绩',php 'php成绩',oracle 'orcle成绩',(mysql+java+php+oracle) AS '总成绩' FROM stu;
-- 在不添加别名的时候,仍然可以添加长量列
SELECT *,(mysql+java+php+oracle) AS '总成绩' FROM stu;
-- 如果是使用算数运算来计算整数值,请不要写上非数字数据,否则不会计算(不会产生error).
SELECT *,(mysql+java+name+oracle) AS '总成绩' FROM stu;
7.指定别名查询
合并列查询一般是指两个以上的列合并操作,合并列必须是数值类型的字段,否则操作不会计算
SELECT 字段名,(字段1+字段2) AS ’别名‘ FROM stu;
-- 查询学生的php成绩和java成绩的总和
SELECT name AS '姓名',(php+java) AS '总和成绩' FROM stu;
三.条件查询
1.条件查询需要WHERE关键字
2.条件运算符
(1)> < <= >= = <> !=(Mysql方言)
(2)BETWEEN... AND
(3)IN(包含)
(4)LIKE 模糊查询
(5)IS NULL(判断是否为空)
(6)AND 或者 &&
(7)OR 或者 ||
(8)NOT 或者 !
使用例子如下:
-- 查询所有成绩MYSQL大于等于60分的同学
SELECT * FROM stu WHERE mysql >= 60;
-- 查询所有成绩MYSQL大于等于90分或者java成绩大于60分的同学
SELECT * FROM stu WHERE mysql >= 90 OR java > 60;
-- 查询所有成绩MYSQL大于等于90分或者java成绩大于60分的同学并且id为1的学生
SELECT * FROM stu WHERE mysql >= 90 OR java > 60 AND id = 5;
-- 查询java成绩在60分到80分的学生信息
SELECT * FROM stu WHERE java >= 60 AND java <= 80;
-- 查询java成绩在60分到80分的学生信息(另一种语法,在xx到xx之间的数据 包前也包后的)
SELECT * FROM stu WHERE java BETWEEN 60 AND 80;
-- 查询所有java成绩不等于60分的学生信息
SELECT * FROM stu WHERE java != 60;
SELECT * FROM stu WHERE java <> 60; -- (推荐)
-- 查询学生ID为1,6,7的学生
SELECT * FROM stu WHERE id = 1 OR id = 6 OR id = 7;
-- 查询学生ID不为1,6,7的学生
SELECT * FROM stu WHERE id != 1 OR id != 6 OR id != 7;
-- 查询所有成绩MYSQL大于等于60分的同学
SELECT * FROM stu WHERE mysql >= 60;
-- 查询所有成绩MYSQL大于等于90分或者java成绩大于60分的同学
SELECT * FROM stu WHERE mysql >= 90 OR java > 60;
-- 查询所有成绩MYSQL大于等于90分或者java成绩大于60分的同学并且id为1的学生
SELECT * FROM stu WHERE mysql >= 90 OR java > 60 AND id = 5;
-- 查询java成绩在60分到80分的学生信息
SELECT * FROM stu WHERE java >= 60 AND java <= 80;
-- 查询java成绩在60分到80分的学生信息(另一种语法,在xx到xx之间的数据 包前也包后的)
SELECT * FROM stu WHERE java BETWEEN 60 AND 80;
-- 查询所有java成绩不等于60分的学生信息
SELECT * FROM stu WHERE java != 60;
SELECT * FROM stu WHERE java <> 60; -- (推荐)
-- 查询学生ID为1,6,7的学生
SELECT * FROM stu WHERE id = 1 OR id = 6 OR id = 7;
-- 查询学生ID不为1,6,7的学生
SELECT * FROM stu WHERE id != 1 OR id != 6 OR id != 7;
----------------------------------------
-- 包含查询 查询学生ID为1,6,7的学生
SELECT * FROM stu WHERE id IN(1,6,7);
-- 包含查询 查询学生ID不为1,6,7的学生
SELECT * FROM stu WHERE id NOT IN(1,6,7);
3.判空查询:IS NULL
Null: 表示没有任何数据的存入 IS NULL/IS NOT NULL
空字符:表示的是有数据,只不过是个空字符!=”/<>”
-- 查询没有户籍地址的学生
SELECT * FROM stu WHERE address IS NULL;
-- 查询所有户籍不为空学生
SELECT * FROM stu WHERE address IS NOT NULL;
-- 推荐
SELECT * FROM stu WHERE address != '' AND address IS NOT NULL;
SELECT * FROM stu WHERE address <> '' AND address IS NOT NULL;