MySQL面试篇章——MySQL核心SQL(基本语法)

news2024/11/25 15:39:18

文章目录

  • 结构化查询语句SQL
  • 库操作
  • 表操作
  • CURD 操作
    • insert 增加
    • update 修改
    • delete 删除
  • select 查询
    • 去重 distinct
    • 空值查询
    • union 合并查询
    • 带 in 子查询
    • 分页查询
    • 排序 order by
    • 分组 group by
    • 笔试实践题
  • 连接查询
    • 内连接查询
    • 外连接查询
      • 左连接查询
      • 右连接查询

结构化查询语句SQL

SQL是结构化查询语言(Structure Query Language),它是关系型数据库的通用语言

SQL主要可以划分为3个类别:

  • DDL(Data Definition Language)语句

    数据定义语言,这些语句定义了不同的数据库、表、列、索引等数据库对象的定义。常用的语句关键字主要包括 create、drop、alter等。

  • DML(Data Manipulation Language)语句

    数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性,常用的语句关键字主要包括 insert、delete、update 和select 等。

  • DCL(Data Control Language)语句

    数据控制语句,用于控制不同的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括 grant、revoke 等。

库操作

  • 查询数据库
show databases;
  • 创建数据库
create database ChatDB;
  • 删除数据库
drop database ChatDB;
  • 选择数据库
use ChatDB;

表操作

  • 查看表
show tables;
  • 创建表
CREATE TABLE user (
    id BIGINT UNSIGNED PRIMARY KEY NOT NULL AUTO_INCREMENT COMMENT 'id号',
    name VARCHAR(50) UNIQUE NOT NULL COMMENT '姓名',
    age TINYINT UNSIGNED NOT NULL COMMENT '年龄',
    sex ENUM('M', 'W') NOT NULL COMMENT '性别,M男性,W女性'
) ENGINE=INNODB DEFAULT CHARSET=utf8;
  • 查看表结构
desc user;
  • 查看建表SQL(可以查看索引、外键等情况)
show create table user\G;
  • 删除表
drop table user;

CURD 操作

insert 增加

# 添加表数据
INSERT INTO user(name, age, sex) VALUES('zhangsan', 18, 'M');
INSERT INTO user(name, age, sex) VALUES('lisi', 19, 'W');
INSERT INTO user(name, age, sex) VALUES('wangwu', 20, 'M');
INSERT INTO user(name, age, sex) VALUES('zhaoliu', 21, 'W');
INSERT INTO user(name, age, sex) VALUES('qianqi', 22, 'M');

INSERT INTO user(name, age, sex) VALUES('zhangsan', 18, 'M'),('lisi', 19, 'W'),('wangwu', 20, 'M'),('zhaoliu', 21, 'W'),('qianqi', 22, 'M');

扩展:两种添加方式的不同

每次的 insert 操作都会有一个数据库连接操作,是占用资源的,一次连接完成的事情肯定比多次连接完成的事情所花费的时间短
在这里插入图片描述

update 修改

update user set age = 23 where name = 'zhangsan';
update user set age = age + 1 where id = 3;

delete 删除

delete from user where age=23;
delete from user where age between 20 and 22;
delete from user;

select 查询

select * from user;
select id, nickname, name, age, sex from user;
select id, name from user;
select id, nickname, name, age, sex from user where sex = 'M' and age >= 20 and age <= 25;
select id, nickname, name, age, sex from user where sex = 'M' and age between 20 and 25;
select id, nickname, name, age, sex from user where sex = 'W' or age >= 22;

去重 distinct

select distinct name from user;

空值查询

  • is [not] null
select * from user where name is null;

union 合并查询

  • 一句话:连接两个select查询的SQL语句(全查)
SELECT country FROM Websites UNION ALL SELECT country FROM apps ORDER BY country;

注意:union 默认去重,不用修饰distinct,all显示所有重复值

带 in 子查询

  • [not] in (元素1,元素2,…,元素n)
select * from user where id in (10, 20, 30, 40, 50)
select * from user where id not in (10, 20, 30, 40, 50)
select * from user where id in (select stu_id from grade where average >= 60.0)

分页查询

select id, nickname, name, age, sex from user limit 10;
select id, nickname, name, age, sex from user limit 2000,10;

select * from user limit N offset M;

explain进行分析:查看SQL语句的执行计划
  • 测试代码(自动生成2000000条数据)【测试分页,测试explain所用】
# 修改SQL结束的符号
delimiter $

Create Procedure add_t_user (IN n INT)
BEGIN
DECLARE i INT;
SET i=0;

WHILE i<n DO
INSERT INTO t_user VALUES(NULL,CONCAT(i+1,'@fixbug.com'),i+1);
SET i=i+1;
END WHILE;
END$

delimiter ;

call add_t_user(2000000);

面试题:分页的效率低吗?为什么低?怎么修改呢?

低,pageNum的偏移所花费的性能,要先偏移到对应的位置,在进行分页拿去后面的数据记录

修改:添加索引,通过where筛选条件进行偏移

select * from t_user limit 1500000, 3;

select * from t_user where id >= 1500000 limit 3;
  • 查询的情况

在这里插入图片描述

  • 使用explain指令进行分析

在这里插入图片描述

  • 可以发现由于用了索引,所以速率快
  • 注意:limit的性能优化explain看不到,所以rows还是多的,并且是using where不是using index,explain不展示MySQL Server所进行的优化,所以看这个也没啥意思,主要还是看他们的一个执行速率

在这里插入图片描述

排序 order by

select id,nickname,name,age,sex from user where sex='M' and age>=20 and age<=25 order by age asc;
select id,nickname,name,age,sex from user where sex='M' and age>=20 and age<=25 order by age desc;

**扩展:**order by 查询特别慢,查看explain进行分析,发现是Using filesort,所以给排序列或者查询列添加索引

在这里插入图片描述

分组 group by

select sex from user group by sex;
select count(id), sex from user group by sex;
select count(id), age from user group by age having age>20;

**扩展:**group by 查询慢,explain 分析发现是 Using temporary,即产生了一个临时表,因此最好给分组列添加索引

笔试实践题

下表bank_bill是某银行代缴话费的主流水表结构:

字段名描述
serno流水号
date交易日期
accno账号
name姓名
amount金额
brno缴费网点

1、统计表中缴费的总笔数和总金额

2、给出一个sql,按网点和日期统计每个网点每天的营业额,并按照营业额进行倒序排序

CREATE TABLE bank_bill (
    serno BIGINT UNSIGNED PRIMARY KEY NOT NULL AUTO_INCREMENT,
    date DATE NOT NULL,
    accno VARCHAR(100) NOT NULL,
    name VARCHAR(50) NOT NULL,
    amount DECIMAL(10, 1) NOT NULL,
    brno VARCHAR(150) NOT NULL
 );
 
 INSERT INTO bank_bill VALUES
 ('101000', '2021-3-1', '111', 'zhang', 100, '高新区支行'),
 ('101001', '2021-3-1', '222', 'liu', 200, '碑林区支行'),
 ('101002', '2021-3-1', '333', 'gao', 300, '高新区支行'),
 ('101003', '2021-3-1', '444', 'lian', 150, '雁塔区支行'),
 ('101004', '2021-3-1', '555', 'lan', 360, '雁塔区支行'),
 ('101005', '2021-3-1', '666', 'wang', 300, '碑林区支行'),
 ('101006', '2021-3-1', '777', 'wei', 500, '碑林区支行'),
 ('101007', '2021-3-2', '444', 'lian', 150, '雁塔区支行'),
 ('101008', '2021-3-2', '555', 'lan', 360, '雁塔区支行'),
 ('101009', '2021-3-2', '666', 'wang', 300, '碑林区支行'),
 ('101010', '2021-3-3', '777', 'wei', 500, '碑林区支行');

连接查询

  • 连接表时需要在每个表中选择一个字段,并对这些字段的值进行比较,值相同的两条记录将合并为一条。连接表的本质就是将不同表的记录合并起来,形成一张新表。当然,这张新表只是临时的,它仅存在于本次查询期间
  • SQL 先根据 ON 生成一张临时表,然后再根据 WHERE 对临时表进行筛选
    在这里插入图片描述

内连接查询

select s.uid, s.name, s.age, s.sex, e.score from student s inner join exame e on s.uid = e.uid where e.uid = 1 and e.cid = 2;

注意:on s.uid = e.uid 会区分大表和小表,是按照记录的个数(数据量)区分

数量多的为大表,小的为小表

小表永远是整表扫描,然后去大表搜索

从 student 表中取出所有的s.uid,然后拿着这些uid去exame大表中搜索

有 where 会进行where的过滤,在划分大小表,来决定哪个整表扫描

对于inner join内连接,过滤条件写在where的后面和on连接条件里面,效果是一样的

外连接查询

左连接查询

# 把left这边的表所有的数据显示出来,在右表中不存在相应数据,则显示NULL
select a.*, b.* from student a left join exame b on a.uid = b.uid;

在这里插入图片描述
在这里插入图片描述

右连接查询

# 把right这边的表所有的数据显示出来,在左表中不存在相应数据,则显示NULL
select a.*, b.* from student a right join exame b on a.uid = b.uid;

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1941654.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

内置对象的原型继承

Object.prototype&#xff08;原型链顶部&#xff09; console.log(ItShare.__proto__); console.log(ItShare.__proto__.__proto__); console.log(ItShare.__proto__.__proto__.__proto__);那么数组的原型链是什么呢&#xff1f; const arr [1, 2, 5, 4, 55, 66, 54]; cons…

matlab2018b安装

1.可先参考这个 2.激活 按上面教程安装后&#xff0c;打开matlab 可能会出现软件激活这个界面&#xff0c;需要按如下步骤进行操作。

Android Studio 中使用switch语句时报错Constant expression required

发现问题 Android Studio 中使用switch语句时报错Constant expression required 解决方法&#xff1a; 首先&#xff0c; 在gradle.properties配置文件下添加代码&#xff1a; android.nonFinalResIdsfalse之后&#xff0c; 点击&#xff1a;“Sync Now” 进行同步 效果 原…

《梦醒蝶飞:释放Excel函数与公式的力量》18.2 数据可视化技术

第18章&#xff1a;创建图表和数据可视化 18.2 数据可视化技术 数据可视化是将数据转化为图形和图表的过程&#xff0c;以便更好地理解和分析数据。有效的数据可视化可以揭示数据的模式、趋势和异常&#xff0c;从而帮助做出更明智的决策。以下将介绍几种常用的数据可视化技术…

【C++】————搜索二叉树

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;C 创作时间 &#xff1a;2024年7月22日 什么是二叉搜索树&#xff1f; 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树&#xff1a; 若它的左子树不为空&#xff0…

大模型学习笔记 - LLM指令微调

LLM 指令微调 LLM 指令微调 0. 概览1. 指令数据的构建 1.1 基于现有NLP任务数据集构建1.2 基于日常对话数据构建1.3 基于合成数据构建1.4 指令数据构建的提升方法 2. 指令微调的策略 2.1 优化设置2.2 数据组织策略 3. 参数高效的模型微调 3.1 低秩适配微调方法3.2 其他高效微调…

【跨链机制】哈希锁定原理

随着区块链多年来的发展&#xff0c;在区块链生态中已经形成了不同特性的区块链网络&#xff0c;这些网络之间存在着一定的隔离和孤立性。为了打破这种局面&#xff0c;跨链技术应运而生&#xff0c;促进了区块链间的数据流通和价值交换。目前&#xff0c;主流的跨链机制包括公…

电路学习——经典运放电路之滞回比较器(施密特触发器)(2024.07.18)

参考链接1: 电子设计教程29&#xff1a;滞回比较器&#xff08;施密特触发器&#xff09; 参考链接2: 滞回比较器电路详细分析 参考链接3: 比较器精髓&#xff1a;施密特触发器&#xff0c;正反馈的妙用 参考链接4: 比较器反馈电阻选多大&#xff1f;理解滞后效应&#xff0c;轻…

Kafka之存储设计

文章目录 1. 分区和副本的存储结构1. 分区和副本的分布2. 存储目录结构3. 文件描述 2. 相关配置3. 数据文件类型4. 数据定位原理LogSegment 类UnifiedLog 类 5. 副本数据同步HW水位线LEO末端偏移量HW更新原理 6. 数据清除 1. 分区和副本的存储结构 在一个多 broker 的 Kafka 集…

如何学习Linux:糙快猛的大数据之路( 只讲大数据开发用到的)

引言 还记得第一次面对Linux命令行时的茫然吗&#xff1f;黑乎乎的终端&#xff0c;闪烁的光标&#xff0c;还有那些看起来像外星文的命令。 作为一个从0基础开始跨行到大数据领域的开发者&#xff0c;我深深体会到了学习Linux的重要性和挑战。今天&#xff0c;我想和大家分享…

谷粒商城实战-Vue学习过程中踩坑记录

一&#xff0c;自闭合的<script>标签 第一次使用Vue&#xff0c;按照步骤引入vue.js&#xff0c;创建div&#xff0c;创建Vue对象&#xff0c;但是未达预期效果。 插值表达式{{name}}没被替换为data对象中的属性值。 F12看了下网页源代码&#xff0c;发现创建Vue对象的…

计算机组成原理面试知识点总结1

#ウルトラマンゼット&#xff08;泽塔&#xff09; 1 计算机发展历程 1.1 计算机的硬件发展 电子管时代晶体管时代中小规模集成电路时代超大规模集成点电路时代 元件更新变化&#xff1a; 摩尔定律&#xff1a;18 个月晶体管翻一倍半导体存储器不断发展微处理器不断发展 1.2…

适合学生的护眼台灯哪个牌子最好?学生护眼台灯十大排名名单

适合学生的护眼台灯哪个牌子最好&#xff1f;作为一名当代的学生&#xff0c;经常会出现长时间用眼的情况&#xff0c;但是这种状况是难以改变的&#xff0c;我国的学习教育一直都在“内卷”&#xff0c;学生课业重&#xff0c;每日的夜间学习更是成了孩子的家常便饭&#xff0…

数据结构之字符串的最长公共子序列问题详解与示例(C,C++)

文章目录 1、最长公共子序列定义2、动态规划解法3、状态转移方程初始化构建最长公共子序列 4、C 和 C 实现示例C 语言实现C 语言实现 5、总结 字符串的最长公共子序列&#xff08;Longest Common Subsequence, LCS&#xff09;是计算机科学中的一个经典问题&#xff0c;属于动态…

08、Tomcat 部署及优化

8.1 Tomcat概述 8.1.1 Tomcat介绍 自从 JSP 发布之后,推出了各式各样的 JSP 引擎。Apache Group 在完成 GNUJSP1.0的开发以后&#xff0c;开始考虑在 SUN 的 JSWDK 基础上开发一个可以直接提供 Web 服务的 JSP服务器&#xff0c;当然同时也支持 Servlet, 这样 Tomcat 就诞生…

函数(递归)

递归&#xff1a;程序调用自身编程技巧称为递归。 在学习递归前需要粗略的了解一下内存&#xff0c;内存分为三类&#xff0c;分别是栈区、堆区和静态区。对于栈区来说&#xff0c;每调用一次函数都会为本次函数开辟一块空间&#xff0c;然而栈区也是有空间限制的&#xff0c;随…

GCN知识总结

关键点&#xff1a; 1.理解图结构的形式 2.如何使用邻接矩阵实现其图结构形式 3.GCN卷积是如何实现节点特征更新的 核心公式&#xff1a; 特征提取&#xff1a; 处理好的x 代表节点特征&#xff0c;然后*权重&#xff0c;再*邻接。 A尖换元后&#xff1a; forward函数 传播规则…

基于SpringBoot+Vue的篮球竞赛预约平台(带1w+文档)

基于SpringBootVue的篮球竞赛预约平台(带1w文档) 基于SpringBootVue的篮球竞赛预约平台(带1w文档) 本系统提供给管理员对首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;项目分类管理&#xff0c;竞赛项目管理&#xff0c;赛事预约管理&#xff0c;系统管理等诸多功…

C++中的模板函数和模板类

模板是 C 中的泛型编程的基础&#xff0c;编写与类型无关的通用代码&#xff0c;是代码复用的一种手段。 作为强类型语言&#xff0c;C 要求所有变量都具有特定类型&#xff0c;由程序员显式声明或编译器推导。 但是&#xff0c;许多数据结构和算法无论在哪种类型上操作&#x…

【Java开发实训】day05——数组常见算法

目录 一、数组翻转 1.1示例代码 1.2适用场景 二、冒泡排序 2.1示例代码 2.2适用场景 三、二分查找 3.1示例代码 3.2适用场景 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo…