MySQL笔记2——DML数据操作语句和基本的DQL语句

MySQL对数据的增删改

增加数据(INSERT语句)

INSERT INTO `表名` [(`字段1`,`字段2`,...`字段n`)] VALUES/VALUE ('值1','值2',...'值n')[,('值1','值2',...'值n')...];

其中: •“[]” 包含的内容可以省略; • 字段或值之间用英文逗号隔开; • 可同时插入多条数据,values 后用英文逗号隔开; • values和value的方式均可。

-- 日期使用字符串的形式进行书写日期格式(yyyy-MM-dd HH:mm:SS)
-- 全字段插入
-- 方式一
USE myschoolxxx
INSERT INTO student(sid,sname,birthday,ssex,classid);
VALUES(9,'张三','1989-11-23','男','1');

-- 方式二 1.NULL
INSERT INTO student values(null,'李四','1789-01-01','男','2');
INSERT INTO student values(DEFAULT,'李四','1789-01-01','男','2');-- null和default都可以利用主键的自增

增加数据(INSERT INTO SELECT )

INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中。 目标表中任何已存在的行都不会受影响。

INSERT INTO table2 (column_name,...) SELECT column_name,... FROM table1;

其中:table2 必须存在,将table1中数据赋值到table2中

如果要新建表并赋值表内容:

create table 新表 select * from 原始表;

-- 部分字段插入
INSERT INTO student(sname,ssex) VALUES('王五','女');

ALTER TABLE student MODIFY ssex VARCHAR(10) not null DEFAULT '保密';

INSERT INTO student(sname) VALUES('赵六');

-- 一次性添加多条数据
-- 方式一
-- INSERT INTO 表名 (字段名......) VALUES(值..),(值..)...
INSERT INTO student(sname,ssex) VALUES('杨七','男'),('杨八','男'),('杨九','男');

-- 方式二 不常用
-- INSERT INTO SELECT 
-- 插入和被插入的表都必须存在
CREATE TABLE newstu(
	xingming VARCHAR(10),
	xingbie VARCHAR(10),
  classid int
);
INSERT INTO newstu(xingming,xingbie,classid) SELECT sname,ssex,classid from student

-- 方式三
-- CREATE TABLE SELECT
-- 被插入表不能存在 -- 被插入表不能有任何约束
CREATE TABLE stu1 SELECT sid,sname,birthday from student

修改数据(UPDATE语句)

UPDATE 表名 SET `字段名1` = '值1' [ , `字段名2` = '值2', …. ] [ WHERE 条件];

其中: •“[]” 包含的内容可以省略; • `字段名`为要更改数据的字段,'值'表示字段改后的值,注意字段和值的对应; • 可同时修改多个字段,多个字段后用英文逗号隔开; •“WHERE”是where子句,可以给修改增加条件; • 条件:为筛选条件,如不指定则修改该表的所有列数据。

-- 修改
-- UPDATE 表名 SET 字段名=值,字段名=值,...,字段名=值
-- 【where 子句条件】
-- where子句中的条件是对表中每一条数据进行判断,
-- 判断成立该数据的父句执行
-- 判断不成立该数据的父句不执行
UPDATE stu1 SET birthday='1974-2-2'  -- 如果没有where子句则全部更改 
WHERE sname='陈博远';

UPDATE newstu set classid = 200 WHERE xingbie != '男';

UPDATE newstu set classid = 100 WHERE xingbie <> '女'; -- ‘<>’是不等于

UPDATE newstu SET xingbie = '保密' where classid < 180


UPDATE newstu SET xingbie = '外星人' where classid >= 20 AND classid <=90

-- 30 50 70 他们的性别地球人
UPDATE newstu SET xingbie = '地球人' where classid = 30 or classid = 50 or classid = 90

UPDATE newstu SET xingbie = '火星人' where classid = 30 BETWEENclassid = 90

UPDATE newstu set xingbie = '水星人' where cldssid BETWEEN 30 and 90

删除数据(DELETE语句)

DELETE FROM 表名 [WHERE 条件];

其中:

  • “[]” 包含的内容可以省略;
  • “WHERE”可以通过where子句增加删除的条件。
-- DELETE from 表名 【here子句 】
DELETE from newstu;

DELETE from stu1 WHERE sid = 1;

删除数据(TRUNCATE语句)

TRUNCATE [TABLE] 表名

其中:

  • TRUNCATE是一个特殊的删除语句,又叫做清空语句;
  • “[]”包含的内容可以省略;
  • 功能:清空某一张表内的全部数据,重置自增计数器;
  • 特点:由于没有条件约束,所以速度快,而且效率高
-- 清空表、截断表
-- TRUNCATE 表名
TRUNCATE stu1;

DELETE from student;-- 只删数据

INSERT INTO student(sname) VALUES('小米'); 

-- DELETE和TRUNCATE的区别
-- DELETE 只删除数据
-- TRUNCATE 不仅删除数据,还删除了索引(使索引重新从1开始)
-- drop 不仅把数据删掉,还删除了索引,表结构也删除了

计算列(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的值。

建表:
CREATE TABLE jsltab(
id INT PRIMARY KEY AUTO_INCREMENT,
a INT,
b INT,
c INT GENERATED ALWAYS AS (a + b) VIRTUAL
)

数 据 的 备 份 和 还 原

MySQL数据库恢复的方法

方法:使用工具

  1. 先建库
  2. 在新建的库右键 【允许SQL文件】

 方法:备份

1.在已有的库右键 【转储SQL文件】

2.选择路径后进行保存, 会保存为xxx.sql 的文件

方法:控制台恢复

在控制台输入如下指令:

mysql –h localhost -P 3306 –u root –p dbname < /path/db_name.sql;

其中:

  • “dbname”表示需要恢复的数据库。
  • “/path/db_name.sql”表示所恢复数据库的备份文件绝对路径。

MySQL数据库备份的方法

方法1:控制台备份

控制台备份时,依赖的是MySQL自带的备份工具mysqldump,该工具的功能是转储数据 库,将数据转移到另一个SQL数据库,当然并不局限于MySQL数据库。 在控制台输入如下命令:

mysqldump -h localhost –P 3306 –u root –p dbname > /path/db_name.sql

其中:

  • “dbname”表示需要备份的数据库。
  • “/path/db_name.sql”表示将备份的数据库保存的绝对路径。

数据库备份和恢复的作用和主要价值

  1. 高可用性:使数据库的失效次数见到最少,从而使数据库保持最大的可用性
  2. 安全性:计算机病毒型、特洛伊木马型、“黑客”入侵型、逻辑炸弹型等会造成信息丢失,丢失的数据需要及时恢复。
  3. 完整性:当数据失效后,确保尽量少的数据丢失或根本不丢失,从而使数据具有最大的完整性。

单表查询

DQL语言

DQL(Data Query Language 数据查询语言)。用途是查询数据库数据,如SELECT语句。是SQL语句 中最核心、最重要的语句,也是使用频率最高的语句。其中,可以根据表的结构和关系分为单表查询和多表联查

单表联查:针对数据库中的一张数据进行查询,可以通过各种查询条件和方式去做相关的优化

多表联查:针对数据库中两张或者两张以上的表同时进行查询,依赖的手段有复杂查询和嵌套查询

查询语句语法规则

SELECT [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: 限制显示查询结果的条数。

# DQL(查询语言)
-- 所有的查询都会得到一张虚拟表,临时存储在内存中,并且这个表再也不会发生变化,除非再查询一次得到一个新表
-- 最简单的查询

-- SELECT 数据;
SELECT 123;
SELECT 'abc';
SELECT 1+1;

-- 从表中获取数据
-- SELECT 字段名,字段名 FROM 表名;
-- 全字段查询
SELECT sid,sname,birthday,ssex,classid FROM student; 

-- * 通配符, 查询这个表的所有数据
-- 使用*全字段查询效率慢得多,不利于sql优化,尽量不要使用*代替字段名
SELECT * FROM student;

-- 部分字段查询
SELECT sname,ssex FROM student;

-- 字段名起别名
SELECT sname as '姓名', birthday '生日', ssex 性别 FROM student;-- as 和 '' 都可以省略

-- 添加字段
SELECT sname,'猿究院' 学校 FROM student;

-- DISTINCT 去重
-- 所有的字段的数据要一致(完全相同的)时候才会去重,联合去除
SELECT DISTINCT ssex,sname FROM student;

-- 带有条件的查询
-- 【where子句】
SELECT * FROM student WHERE sid = 7;

SELECT * FROM student WHERE sname = '赵雷';

SELECT * FROM student WHERE sid > 7;

SELECT * FROM student WHERE sid > 3 and sid < 9;

-- 查找一班的女同学
SELECT * FROM student WHERE classid = 1 and ssex = '女';
-- 查询年龄大于1990-1-1的学生
SELECT * FROM student WHERE birthday < '1990-1-1';

-- in 在某个特定的范围内

-- 不推荐
-- or 会让索引失效
-- 3 5 7 9
SELECT * FROM student WHERE sid = 3 or sid = 5 or sid = 7 or sid = 9;

-- 推荐
-- in 可以使用到索引
SELECT * FROM student WHERE sid in (3,5,7,9);

-- 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 '陈__';

-- NULL 
-- IS 是一个什么
SELECT * FROM student WHERE birthday IS NULL;

SELECT * FROM student WHERE birthday IS NOT NULL;

常用的聚合函数

函数名返回值
AVG(col)返回指定列的平均值
COUNT(col)返回指定列中非NULL值的个数
MIN(col)返回指定列的最小值
MAX(col)返回指定列的最大值
SUM(col)返回指定列的所有值之和
-- 聚合函数
-- 把多个值变为一个值
-- COUNT() 统计个数
-- MAX() 求最大值
-- MIN() 求最小值
-- SUM() 求总和
-- AVG() 求平均值

-- COUNT() 统计任何类型总数量 不统计null
-- SELECT COUNT(字段/常量/*) from 表名
SELECT COUNT(sid) FROM student; -- 如果字段名使用的是主键 正常统计
SELECT COUNT(classid) FROM student; -- 除了主键外不统计null值,如不是为了统计非空,则不推荐使用,使用主键统计最佳
SELECT COUNT( 'a') FROM student; -- 不推荐
SELECT COUNT(1) FROM student; -- 推荐
SELECT COUNT(*) FROM student; -- 推荐

-- sum avg max min 数值类型 求的是数值的总和/平均/最大/最小
SELECT sum(score) FROM sc;

SELECT avg(score) FROM sc;

SELECT MAX(score) FROM sc;

SELECT MIN(score) FROM sc;

-- 统计出成绩表中一共多少次考试,总成绩,平均分,最高分,最低分
SELECT COUNT(*),SUM(score),AVG(score),MAX(score),MIN(score) FROM sc;

GROUP BY和HAVING分组

GROUP BY

  1. 对所有的数据进行分组统计;
  2. 分组的依据字段可以有多个,并 依次分组。

HAVING

与GROUP BY结合使用,进行分组 后的数据筛选。

-- GROUP BY ******
SELECT ssex,COUNT(*) from student GROUP BY ssex;

-- 统计出各班有多少人
SELECT classid,COUNT(*) FROM student GROUP BY classid;

-- 统计每个同学的总分和平均分
SELECT sid,SUM(score),AVG(score) FROM sc GROUP BY sid;

-- HAVING 用于过滤聚合后的数据
-- 由于where是对每一条数据进行判断,因此聚合时不容许使用where,应当使用having
-- 查询平均分不及格的sid
SELECT sid,SUM(score),AVG(score) FROM sc GROUP BY sid having AVG(score) < 60;

ORDER BY排序

SELECT * FROM 表名 ORDER BY 字段名 [DESC|ASC]

其中:

  • ORDER BY 表示对SELECT语句查询得到的结果,按字段名进行排序;
  • DESC表示排序的顺序为降序,ASC表示排序的顺序为升序;
  • “[ ]”包含的内容可以省略。
-- ORDER BY 排序 
-- 升序 asc 默认可不写
-- 降序 desc 必须声明
SELECT * from student ORDER BY sid DESC;

-- 排序时 数据相同可以根据其他数据再次排序
SELECT * FROM sc ORDER BY score DESC ,cid DESC;

LIMIT关键字

SELECT * FROM 表名 LIMIT [n , m ]

其中:

  • LIMIT关键字是MySQL特有关键字;
  • LIMIT限制SELECT返回结果的行数;
  • n 表示第一条记录的偏移量,m 表示显示记录的数量;
  • “[ ]”包含的内容可以省略。
-- LIMIT 分页 0 开始 (页码-1)*步长,步长
-- SELECT * FROM student LIMIT 位置,步长
SELECT * FROM student LIMIT 6,3;
-- 应用层解决
-- SELECT * FROM student LIMIT (3-1)*3,3;

-- 找到成绩及格的总分数排名第二的学生的sid和总成绩
SELECT sid,SUM(score) FROM sc WHERE score > 60 GROUP BY sid ORDER BY SUM(score) DESC LIMIT 1,1;

MySql8新关键词OFFSET

SELECT * FROM 表名 limit m offset n

其中:

  • LIMIT关键字是MySQL特有关键字;
  • LIMIT限制SELECT返回结果的行数;
  • n 表示第一条记录的偏移量,m 表示显示记录的数量;
  • “[ ]”包含的内容可以省略。

扩展了解

在不同的DBMS中使用的关键字可能不同。在MySQL、PostgreSQL、MariaDB和SQLite中使用的Limit关键字、而且放到SELECT语句的最后面。

  • 如果是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 rownums < 5 ORDER BY salary DESC

  • 29
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓晨CH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值