MySQL语言学习:DML、DCL

2024-06-04 12:04

本文主要是介绍MySQL语言学习:DML、DCL,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

day52上

MySQL

SQL

SQL分类

  1. 数据定义语言(DDL ,Data Defintion Language)语句:数据定义语句,用于定义不同的数据对象、数据库、表、列、索引等。常用的语句关键字包括create、drop、alter等。
  2. 数据操作语言(DML , Data Manipulation Language)语句:数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据的完整性。常用的语句关键字主要包括insert、delete、update和select等。(DML:添加,修改,删除,DQL:查询)
  3. 数据控制语言(DCL, Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括grant、revoke等。
DML

继day51

新建查询DML01:sql语句
# DML:针对数据行增删查改的语言,由于查询的SQL语句较多,所以查询语句又分出来叫做DQL# 前言:每张表必须有且只有一个主键
# 主键:主键上的数据不能重复且不能为null,主键上的数据相当于该数据行的唯一标识
# PRIMARY KEY - 主键
# auto_increment - 自动增长
CREATE TABLE student(id INT(3) PRIMARY KEY auto_increment,name VARCHAR(32),sex VARCHAR(32),age INT(3),salary FLOAT(8,2),course VARCHAR(32)
)# 添加数据 ----------------------------------------------------------------# 方式一
INSERT INTO student VALUES(1,'奇男子','男',23,10000,'Java');# 方式二
INSERT INTO student VALUES(1,'奇男子','男',23,10000,'Java'),(2,'小兰','男',20,12000,'Java');# 方式三
INSERT INTO student(name,sex,age,salary,course) VALUES('奇男子','男',23,10000,'Java');
INSERT INTO student(name,sex,age,salary,course) VALUES('小兰','男',20,12000,'Java');
INSERT INTO student(name,sex,age,salary,course) VALUES('奇女子','女',19,17000,'Java');
INSERT INTO student(name,sex,age,salary,course) VALUES('刘德华','男',21,15000,'Java');
INSERT INTO student(name,sex,age,salary,course) VALUES('马德华','男',27,10000,'Java');
INSERT INTO student(name,sex,age,salary,course) VALUES('霍建华','男',19,12000,'Java');
INSERT INTO student(name,sex,age,salary,course) VALUES('华晨宇','男',32,5000,'Python');
INSERT INTO student(name,sex,age,salary,course) VALUES('黄日华','男',45,4000,'Python');
INSERT INTO student(name,sex,age,salary,course) VALUES('任达华','男',28,7000,'Python');
INSERT INTO student(name,sex,age,salary,course) VALUES('周华健','男',30,8000,'Python');
INSERT INTO student(name,sex,age,salary,course) VALUES('欧阳震华','男',23,12000,'Python');
INSERT INTO student(name,sex,age,salary,course) VALUES('麻生希','女',30,7000,'HTML');
INSERT INTO student(name,sex,age,salary,course) VALUES('椎名空','女',23,6000,'HTML');
INSERT INTO student(name,sex,age,salary,course) VALUES('水野朝阳','女',28,8000,'HTML');# 删除数据 ----------------------------------------------------------------# 清空表数据 - 方式一:清空数据后,再次添加,id会从1开始
TRUNCATE student;
# 清空表数据 - 方式二:清空数据后,再次添加,id会继续递增
# 注意:清空数据推荐使用第二种方式,因为删除的数据如果恢复后,id不会冲突
DELETE FROM student;# 单条件删除
DELETE FROM student WHERE id=5;
DELETE FROM student WHERE salary<=5000;# 多条件删除
# OR 或
# AND 与
DELETE FROM student WHERE sex='女' OR course='Python';
DELETE FROM student WHERE sex='女' AND course='Java';
DELETE FROM student WHERE course IN('Python','HTML');# 修改数据 ----------------------------------------------------------------#语法:update 表名 set 字段1=值1,字段2=值2,字段n=值n where 条件
# 修改所有数据
UPDATE student SET salary=10000;# 单条件修改
UPDATE student SET salary = 20000 WHERE id=3;# 多条件修改
UPDATE student SET salary=30000 WHERE sex='女' OR course='Python';
UPDATE student SET salary=40000 WHERE sex='女' AND course='Java';
UPDATE student SET salary=10000 WHERE course IN('Python','HTML');# 修改多个数据
UPDATE student SET age=21,salary=50000 WHERE id=3;# 查询数据(DQL) ----------------------------------------------------------------# 查询所有字段
#语法:select * from 表;
SELECT * FROM student;# 查询指定字段
#语法:select 字段 from 表;
SELECT name,sex,age FROM student;# 查询指定字段 + 别名
SELECT name AS '姓名',sex AS '性别',age AS '年龄' FROM student;# 去重查询
#语法:select distinct 字段 from 表; 
# 需求:查询学科
SELECT DISTINCT course FROM student;# 单条件查询
SELECT * FROM student WHERE id=3;# 多条件查询
SELECT * FROM student WHERE sex='女' OR course='Python';
SELECT * FROM student WHERE sex='女' AND course='Java';
SELECT * FROM student WHERE course IN('Java','Python');# 模糊查询
#语法:select 字段 from 表 where 字段 like  ‘%内容%’;
# %表示没有或多个字符
# 需求:查询出姓名中带'华'字的数据
SELECT * FROM student WHERE name LIKE '%华%';
# 需求:查询出姓名中第四个带'华'字的数据
SELECT * FROM student WHERE name LIKE '___华';# 单字段排序
#语法:select 字段 from 表 order by 字段 排序关键词
# ORDER BY表示排序
# ASC表示升序
# DESC表示降序
# 需求:按照年龄排序 - 升序
SELECT * FROM student ORDER BY age ASC;
# 需求:按照工资排序 - 降序
SELECT * FROM student ORDER BY salary DESC;# 多字段排序
#语法:select 字段 from 表 order by 字段1 排序关键词,... ...字段n desc|asc;
# 需求:按照年龄排升序,年龄一致按照工资排降序
SELECT * FROM student ORDER BY age ASC,salary DESC;# 限制查询
#LIMIT 数量与分页查询不同
# 需求:查询出工资最高的学生信息
SELECT * FROM student ORDER BY salary DESC LIMIT 1;# 分页查询
# SELECT * FROM student LIMIT 偏移量,数据条数;
SELECT * FROM student LIMIT 0,5;# 第1页
SELECT * FROM student LIMIT 5,5;# 第2页
SELECT * FROM student LIMIT 10,5;# 第3页
# 分页公式:SELECT * FROM student LIMIT (当前页-1)*数据条数,数据条数;# 聚合查询/统计类查询
# 需求:获取学生的总工资
SELECT SUM(salary) FROM student;
# 需求:获取学生的平均工资(保留2位小数)
SELECT FORMAT(AVG(salary),2) FROM student;
# 需求:获取学生的最高工资
SELECT MAX(salary) FROM student;
# 需求:获取学生的最低工资
SELECT MIN(salary) FROM student;
# 需求:获取学生个数
SELECT COUNT(id) FROM student;# 子查询
#子查询是一个完整的的SELECT语句,用()括起来,可多层嵌套;先查()
# 需求:查询出工资最高的学生信息
SELECT * FROM student WHERE salary = (SELECT MAX(salary) FROM student);# 分组查询
# 需求:查询出各个学科的平均工资
SELECT course,AVG(salary) FROM student GROUP BY course;# 分组查询 + 条件
# 需求:查询出平均工资大于10000的学科
SELECT course,AVG(salary) FROM student GROUP BY course HAVING AVG(salary)>10000;
修改数据

更新所有数据、单条件/多条件更新单个数据、修改多个数据

查询数据

查询所有字段、查询指定字段、查询指定字段 + 别名(AS)、去重查询(DISTINCT)、单条件查询、多条件查询、模糊查询(LIKE)【模糊查询在工作中不会用到,貌似会用框架】、单字段排序(ORDER BY)、多字段排序、限制查询(LIMIT)、分页查询【 分页公式】、聚合查询/统计类查询【其中count()注意区别小括号里数字、*、主键】、子查询()、分组查询(GROUP BY)、分组查询 + 条件【分组查询加条件用having】

注意:

1.多字段排序

只有在第一个字段排序后,出现相同值才会比较第二个字段,否则第二个比较字段无效,主排序字段和次排序字段。

order by 后面可以跟多个不同的字段排序,并且排序字段的不同结果集的顺序也不同,如果排序字段的值一样,则值相同的字段按照第二个排序字段进行排序。

2.聚合查询/统计类查询:

统计类函数使用

函数说明
sum求和
count统计总数
max最大值
min最小值
avg平均值
新建查询DML02:sql语句

注意:取别名可简化sql语句,取别名用as,也可以省略,即呈现两种方式

ps:student as stu;student stu;stu.name as a等等,可百度一下

# 多表联合查询 --- 一对多情况# 创建场景 --------------------------------------------------------------------------------------# 创建老师表,并插入数据
#注意:创建表和插入数据要分开运行,不然会报错
CREATE TABLE teacher(id INT(3) PRIMARY KEY auto_increment,name VARCHAR(32)
)
INSERT INTO teacher(name) VALUES('何老师');
INSERT INTO teacher(name) VALUES('苍老师');
INSERT INTO teacher(name) VALUES('波多老师');# 创建学生表,并插入数据
CREATE TABLE student(id INT(3) PRIMARY KEY auto_increment,name VARCHAR(32),t_id INT(3)
)
INSERT INTO student(name,t_id) VALUES('小喻',1);
INSERT INTO student(name,t_id) VALUES('小马',1);
INSERT INTO student(name,t_id) VALUES('小牛',1);
INSERT INTO student(name,t_id) VALUES('小李',2);
INSERT INTO student(name,t_id) VALUES('小辉',2);
#这里设置小陈没有老师教的情况
INSERT INTO student(name) VALUES('小陈');# 内链接 --------------------------------------------------------------------------------------# 方式一
#语法:select 表1.字段 [as 别名],表n.字段 from 表1 [别名],表n where 条件;
SELECT s.name,t.name FROM student s,teacher t WHERE s.t_id=t.id;# 方式二
#语法:select 表1.字段 [as 别名],表n.字段 from 表1 INNER JOIN 表n on 条件;
SELECT s.name AS '学生姓名',t.name AS '老师姓名' FROM student s INNER JOIN teacher t ON s.t_id=t.id;# 外连接 --------------------------------------------------------------------------------------# 左连接:针对于左边表去查询,会展示左边表中的所有数据
#语法:select 表1.字段 [as 别名],表n.字段 from 表1 LEFT JOIN 表n on 条件;
SELECT s.name,t.name FROM student s LEFT JOIN teacher t ON s.t_id=t.id;# 右链接:针对于右边表去查询,会展示右边表中的所有数据
#语法:select 表1.字段 [as 别名],表n.字段 from 表1 RIGHT JOIN 表n on 条件;
SELECT s.name,t.name FROM student s RIGHT JOIN teacher t ON s.t_id=t.id;# 全连接 --------------------------------------------------------------------------------------
# 概念:多张表联合查询,多张表没有联系的数据都查询出来
# 注意:MySQL没有全连接的SQL语句,实现全连接的思想就是合并查询结果 + 去重# 合并查询结果
SELECT s.name,t.name FROM student s LEFT JOIN teacher t ON s.t_id=t.id
UNION ALL
SELECT s.name,t.name FROM student s RIGHT JOIN teacher t ON s.t_id=t.id;# 合并查询结果 + 去重
SELECT s.name,t.name FROM student s LEFT JOIN teacher t ON s.t_id=t.id
UNION
SELECT s.name,t.name FROM student s RIGHT JOIN teacher t ON s.t_id=t.id;

查询结果

内链接
内连接

外连接

  1. ​ 左连接
    左连接

  2. ​ 右链接
    右连接

合并查询结果
全连接合并查询结果

合并查询结果 + 去重
全连接合并查询结果去重

多表联合查询–一对多

场景:一个老师教多个学生

一对一比较少

内连接(where/INNER JOIN…on…)、外连接(join…on…)、全连接(UNION ALL/UNION[去重]);

INNER JOIN 等同于 JOIN,用于数据过滤
多表联合

表连接

当需要查询多个表中的字段时,就可以使用表连接来实现。表联接分为内连接和外连接。

内联结:将两个表中存在联结关系的字段符合联结关系的那些记录形成记录集的联结。

外连接:会选出其他不匹配的记录,分为外左联结和外右联结。

左连接:包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录

右连接:包含所有的右边表中的记录甚至是右边表中没有和它匹配的记录

全链接:sql代码注释

新建查询DML02:sql语句
# 多表联合查询 --- 多对多# 创建场景 --------------------------------------------------------------------------------------# 创建学生表,并插入数据
CREATE TABLE student(id INT(3) PRIMARY KEY auto_increment,name VARCHAR(32)
)
INSERT INTO student(name) VALUES('小平');
INSERT INTO student(name) VALUES('小智');
INSERT INTO student(name) VALUES('小燕');# 创建学科表,并插入数据
CREATE TABLE course(id INT(3) PRIMARY KEY auto_increment,name VARCHAR(32)
)
INSERT INTO course(name) VALUES('语文');
INSERT INTO course(name) VALUES('数学');
INSERT INTO course(name) VALUES('英语');# 创建成绩表,并插入数据
CREATE TABLE scores(id INT(3) PRIMARY KEY auto_increment,s_id INT(3),c_id INT(3),score FLOAT(4,1)
)
INSERT INTO scores(s_id,c_id,score) VALUES(1,1,90);
INSERT INTO scores(s_id,c_id,score) VALUES(1,2,91);
INSERT INTO scores(s_id,c_id,score) VALUES(1,3,92);
INSERT INTO scores(s_id,c_id,score) VALUES(2,1,93);
INSERT INTO scores(s_id,c_id,score) VALUES(2,2,94);
INSERT INTO scores(s_id,c_id,score) VALUES(2,3,95);
INSERT INTO scores(s_id,c_id,score) VALUES(3,1,85);
INSERT INTO scores(s_id,c_id,score) VALUES(3,2,87);
INSERT INTO scores(s_id,c_id,score) VALUES(3,3,86);# 需求:查询学生对应的学科成绩(学生姓名,学科名,成绩)
SELECT stu.name,cou.name,sco.score FROM student stu INNER JOIN course cou INNER JOIN scores sco WHERE sco.s_id=stu.id AND sco.c_id=cou.id;# 提升题1:查询出每个学生的平均成绩(学生姓名,平均分)
SELECT stu.name,AVG(sco.score) FROM scores sco INNER JOIN student stu ON sco.s_id=stu.id GROUP BY sco.s_id;# 提升题2:查询出每个学生的最好成绩的学科(学生姓名,学科目,成绩)
SELECT stu.name,cou.name,sco.score FROM scores sco INNER JOIN (SELECT sco.s_id,max(sco.score) AS 'maxScore' FROM scores sco GROUP BY sco.s_id) xx INNER JOIN student stu INNER JOIN course cou ON sco.score =xx.maxScore AND sco.s_id=xx.s_id AND sco.s_id=stu.id AND sco.c_id = cou.id;

查询结果

需求
多对多需求查询结果

提升题1
多对多提升题

提升题2
多对多提升题2

多表联合查询–多对多

场景:多个学生的多门学科成绩

多对多:有中间表

DCL

管理用户,开权限

新建查询DCL:sql语句
# DCL:给子账号开权限# 开子账号
create user 'qnz'@'localhost' identified by '123123';# 添加权限
grant select,insert on qnz01.* to 'qnz'@'localhost';# 删除权限
revoke insert on qnz01.* from 'qnz'@'localhost';# 删除子账号
drop user 'qnz'@'localhost';# 设置临时编码格式(关闭命令行后就无效了)
SET CHARSET gbk;

注意win7黑窗口jbk,mysql为utf-8,需要设置临时编码格式;当然可以设置默认的编码格式即永久的,但不建议
mysql设置默认编码格式

创建子账号
子账户
给子账号授权,黑窗口登录DCL

小结

SQL语言学习:DML、DCL

这篇关于MySQL语言学习:DML、DCL的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1030025

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点: 1.确保子表中的某个字段(外键)只能引用父表中的有效记录2.主表中的列被删除时,子表中的关联列也会被删除3.主表中的列更新时,子表中的关联元素也会被更新 子表中的元素指向主表 以下是一个外键约束的实例展示

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

如何去写一手好SQL

MySQL性能 最大数据量 抛开数据量和并发数,谈性能都是耍流氓。MySQL没有限制单表最大记录数,它取决于操作系统对文件大小的限制。 《阿里巴巴Java开发手册》提出单表行数超过500万行或者单表容量超过2GB,才推荐分库分表。性能由综合因素决定,抛开业务复杂度,影响程度依次是硬件配置、MySQL配置、数据表设计、索引优化。500万这个值仅供参考,并非铁律。 博主曾经操作过超过4亿行数据

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]