MySQL核心SQL

一.结构化查询语言

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

SQL 主要可以划分为以下 3 个类别:
  • DDLData Definition Languages)语句
    数据定义语言,这些语句定义了不同的数据库、表、列、索引等数据库对象的定义。常用的语句关键字主要包括 createdropalter等。
  • DMLData Manipulation Language)语句
    数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性,常用的语句关键字,主要包括 insertdeleteupdate select 等。
  • DCLData Control Language)语句
    数据控制语句,用于控制不同的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户 的访问权限和安全级别。主要的语句关键字包括 grantrevoke 等。

二.库操作

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

三.表操作 

查看表
show tables;
创建表
create table user(
id int primary key auto_increment comment '主键',
nickname varchar(20) not null comment '昵称',
age int unsigned not null default 18 comment '年龄',
sex enum('男','女') default '男' comment '性别'
)engine=innodb default charset=utf8;

修改表名

alter table user rename to user1;

插入字段

alter table user add password varchar(20);

删除字段

alter table user drop password;

改变字段的类型

alter table user modify password varchar(30);

查看表结构
desc user
查看建表 sql
show create table user;
或者
show create table user\G
删除表

drop table user;

四.CRUD操作

1.insert增加

INSERT INTO USER(nickname,age,sex) VALUES('张三',19,'男'),('李四',20,'女');

INSERT INTO USER(nickname,age,sex) VALUES('王五',26,'男');

这两条语句的区别:一条SQL语句执行一次三次握手和四次挥手

多条语句执行多次

2.update修改

UPDATE USER SET age=age+1;

UPDATE USER SET age=age+1 where id=1;

3.delete删除

delete from user where id=1;

delete from user;

delete from user where age between 1 and 2;

4.select查询

1.简单select查询

select * from user;

select id,nickname,age,sex from user;

select id,nickname,age,sex from user where sex='男';

2.去重distinct

select distinct age from user;

3.空值查询

select * from user where nickname is null;

4.union合并查询

SELECT expression1, expression2, ... expression_n
FROM tables[WHERE conditions]
UNION [ALL | DISTINCT] # 注意: union 默认去重,不用修饰 distinct all 表示显示所有重复值
SELECT expression1, expression2, ... expression_n
FROM tables[WHERE conditions];

select * from user where age>=20 union all select * from user where sex='男';

select * from user where age>=20 union select * from user where sex='男';

5.带in子查询

select * from user where age in(20,21);

6.分页查询

select * from user limit 3;

select * from user limit 1,3;

select * from user limit 3 offset 1;

select * from user where age>=20 limit 2 offset 1;

我们都知道有索引字段的情况下查询的条数都是一条,但是没有使用会发生什么情况,使用limit会不会提高查询的效率呢? 

可以使用explain查询select查询的条数

EXPLAIN SELECT * FROM USER WHERE age>=20 LIMIT 1; 

 可以看到还是要进行全表扫描的,但是实际执行过程中扫描到第一条符合条件的数据的时候就停止扫描了,在实际的环境中(对于大量的数据),使用limit查询的速度比不适用快很多

 向t_user表中插入2000000条数据的执行

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);

此时我们可以进行观察,速度明显是快很多的,自己可以尝试

因此当我们知道某个数据是唯一(或者需要查询执行数量的数据)时,并且字段没有建立索引,此时我们使用limit可以明显提高查询的效率.

实际生产项目中分页查询pagenum,pageno

select * from user limit (pageno-1)*pagenum,pagenum;

这种可以进行查询,但是效率很低,因为他首先需要从0->offset条数据,再将之后的数据取出来,0->offset条数据的时间

优化后的sql语句(id为主键,具体表的主键为准),因为主键建立了索引,我们只需要花常量的时间就可以定位到需要查询的位置

select * from user where id>(上一页最后一条数据的id) limit pagenum;

7.排序order by

select * from user order by age;(默认升序ASC)

select * from user order by age DESC;

select * from user order by age,nickname;

EXPLAIN SELECT * FROM USER ORDER BY nickname; 

使用的是外排序

 EXPLAIN SELECT id,nickname FROM USER ORDER BY nickname;

使用的是索引

是否使用的是索引与排序的字段是否添加索引和查询的字段是否有索引有关 

8.分组group by

select age,count(age) as num from user group by age;

select age from user group by age having age>20;
select age,sex from user group by age,sex;

explain select age from user group by age;

查询出来的数据其实是经过排序的,因此会出现filesort,因此group by之后的字段加索引是十分必要的

9.笔试实践题

下表 bank_bill 是某银行代缴话费的主流水表结构:
字段名
描述
serno流水号
date交易日期
accno账号
name 姓名
amount金额
brno缴费网点
1 、统计表中缴费的总笔数和总金额
select count( serno),sum( amount) from  bank_bill;
2 、给出一个 sql ,按网点和日期统计每个网点每天的营业额,并按照营业额进行倒序排序

select   brno,date,sum(amount) as sum_account from bank_bill group by brno,date order by sum_account DESC;

5.连接查询 

连接查询主要分为以下的几个:

先来创建三个表

create table student(
uid int primary key auto_increment,
name varchar(20) not null,
age int not null,
sex enum('男','女') default '男' not null
);

create table course(
cid int primary key auto_increment,
cname varchar(20) not null,
credit int not null
);

create table exame(
uid int not null,
cid int not null,
time date not null,
score float not null,
primary key(uid,cid)
);

插入一些数据:

insert into student(name,age,sex) 
values('zhangsan',18,'男'),('gaoyang',20,'女'),('chenwei',22,'男') ,('linfeng',21,'女'),('liuxiang',19,'女');
insert into course(cname, credit)
values('c++基础课程',5),('c++高级课程',10),('c++项目开发',8),('c++算法课程',12);
insert into exame(uid,cid,time,score) 
values(1,2,'2021-04-10',80.0),(2,2,'2021-04-10',90.0),
(2,3,'2021-04-12',85.0),(3,1,'2021-04-09',56.0) ,
(3,2,'2021-04-10',93.0),(3,3,'2021-04-12',89.0),(3,4,'2021-04-11',100.0),
(4,4,'2021-04-11',99.0),(5,2,'2021-04-10',59.0),
(5,3,'2021-04-12',94.0),(5,4,'2021-04-11',95.0); 

1.内连接查询

select t1.uid,t1.name,t1.age,t1.sex,t2.`score` from student t1 join exame t2 on t1.`uid`=t2.`uid`;

重点:on a.uid=c.uid区分大表和小表,按照数据量来区分,小表永远是整表扫描,然后去大表搜索从student小表中取出所有的a.uid,然后拿着这些uid去exame大表中搜索

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

select t1.uid,t1.name,t1.age,t1.sex,t2.`score`,t3.`cid`,t3.`cname`,t3.`credit` from student t1 join exame t2 on t1.`uid`=t2.`uid`
join course t3 on t3.`cid`=t2.`cid`;


 

select b.cid,b.cname,b.credit,count(*) cnt
from exame c
inner join course b on c.cid=b.cid
where c.score>=90.0
group by c.cid
order by cnt;

 内连接应用场景,前面t_user表可以通过id直接定位分页查询的位置,是因为加了索引,如果我们直接查询id,因为id加了索引,也可以减少查询的时间,但是我们需要的是查询全部的信息,怎么通过内连接可以减少查询的时间呢?

select id from t_user limit 100000,10

下面给出解决方案

select a.id,a.email,a.password from t_user a join (select id from t_user limit 100000,10) b

on a.id=b.id;

通过产生的id临时表,可以直接定位到查询的位置,也是因为id加了索引. 

2.外连接查询

学生表中插入一条新的数据

insert into student(name,age,sex) values('weiwei',32,'男');

1.左连接查询

select a.*,b.* from student a left join exame b on a.`uid`=b.`uid`;

把left这边的表所有的数据显示出来,在右表中不存在相应数据,则显示NULL

使用explain查看可知是先查左表

2.右连接查询

select a.*,b.* from student a right join exame b on a.`uid`=b.`uid`;

right 这边的表所有的数据显示出来,在左表中不存在相应数据,则显示 NULL
使用explain查看可知是先查右表
不采用带in子查询的原因: 会产生一张中间表存储结果供外面的sql来查询,not in对于索引的命中并不高
再来分析一组例子
select a.*,b.* from student a left join exame b on a.`uid`=b.`uid` where b.`cid`=2;
select a.*,b.* from student a join exame b on a.`uid`=b.`uid` where b.`cid`=2;

此时上面的两条sql语句一个是内连接一个是外连接,两者按理来说应该是不一样的,但是实际显示的结果都是一致的

 使用explain查看

可以看到都是先全表查询右表,然后再查询左表,这样与我们预期中的左连接查询结果是不一样的了,此时我们应该 

select a.*,b.* from student a left join exame b on a.`uid`=b.`uid` and b.`cid`=2;

我们把查询的条件写在on的后面,此时查询的结果是我们想的左连接查询所预期的

使用explain查看也可以看到是先查询左表的. 

外连接的连接条件不能像内连接一样写在on和where都行,如果想要产生符合预期的答案,应该要写在on后面 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Discuz论坛网站登录账号操作慢,必须强制刷新才会显示登录怎么办?

飞飞发现在登录服务器大本营账号时&#xff0c;输入账号密码登录后还是显示的登录框&#xff0c;强制刷新后才知道已经登录了&#xff0c;每次都要刷新才能正常显示&#xff0c;非常影响用户体验&#xff0c;于是在网上找了类似的问题故障解决方法&#xff0c;目前问题已经解决…

AWS边缘媒体安全交付方案

企业如何在AWS上的边缘站点&#xff0c;安全的将优质视频内容交付给用户&#xff0c;并且禁止哪些未经过授权的访问&#xff1f;九河云将基于AWS平台提供边缘媒体安全交付解决方案 解决方案详情 在通过 Amazon CloudFront 交付时&#xff0c;免受未经授权的访问。基于添加到交…

多标签节点分类

Multi-Label Node Classification on Graph-Structured Data,TMLR’23 Code 学习笔记 图结构数据的多标签分类 节点表示或嵌入方法 通常会生成查找表&#xff0c;以便将相似的节点嵌入的更近。学习到的表示用作各种下游预测模块的输入特征。 表现突出的方法是基于随机游走(ran…

docker部署项目,/var/lib/docker/overlay2目录满了如何清理?

docker部署项目&#xff0c;/var/lib/docker/overlay2目录满了如何清理&#xff1f; 一、问题二、解决1、查看 /var/lib/docker 目录&#xff08;1&#xff09;、containers 目录&#xff08;2&#xff09;、volumes 目录&#xff08;3&#xff09;、overlay2 目录 2、清理&…

台灯护眼有用吗?分享备考专用的护眼台灯

说到台灯相信大家都不陌生&#xff0c;如今基本是每个家庭都会备上一台。很多家长会买上一台给孩子学习使用&#xff0c;还有些学生党、办公族夜晚学习工作时也会用得上它。但普通的台灯会出现光照范围不够大、光线过度集中、光线均匀度不足、产生眩光等问题&#xff0c;可能会…

基于 IDEA 进行 Maven 依赖管理

一、依赖管理概念 Maven 依赖管理是 Maven 软件中最重要的功能之一。Maven 的依赖管理能够帮助开发人员自动解决软件包依赖问题&#xff0c;使得开发人员能够轻松地将其他开发人员开发的模块或第三方框架集成到自己的应用程序或模块中&#xff0c;避免出现版本冲突和依赖缺失等…

Redis--Zset使用场景举例(滑动窗口实现限流)

文章目录 前言什么是滑动窗口zset实现滑动窗口小结附录 前言 在Redis–Zset的语法和使用场景举例&#xff08;朋友圈点赞&#xff0c;排行榜&#xff09;一文中&#xff0c;提及了redis数据结构zset的指令语法和一些使用场景&#xff0c;今天我们使用zset来实现滑动窗口限流&a…

IOS-高德地图SDK接入-Swift

申请key 这个要前往高德开发平台注册成为个人开发者然后在控制台创建一个应用&#xff1a; 高德开发平台 注册步骤就不写了&#xff0c;写一下创建应用的步骤&#xff1a; 1、点击应用管理——>我的应用 2、点击右上角的创建新应用 3、输入内容&#xff1a; 4、点击添加ke…

【设计模式之美】重构(三)之解耦方法论:如何通过封装、抽象、模块化、中间层等解耦代码?

文章目录 一. “解耦”概述二. 如何给代码“解耦”&#xff1f;1. 封装与抽象2. 中间层2.1. 引入中间层能**简化模块或类之间的依赖关系**。2.2. 引入中间层可以起到过渡的作用&#xff0c;能够让开发和重构同步进行&#xff0c;不互相干扰。 3. 模块化4. 其他设计思想和原则4.…

【STM32】| 02——常用外设 | I2C

系列文章目录 【STM32】| 01——常用外设 | USART 【STM32】| 02——常用外设 | I2C 失败了也挺可爱&#xff0c;成功了就超帅。 文章目录 前言1. 简介2. I2C协议2.1 I2C物理连接2.2 I2C通信协议2.2.1 起始和停止信号2.2.2 数据有效性2.2.3 数据传输格式2.2.4 从机地址/数据方…

QT中操作word文档

QT中操作word文档&#xff1a; 参考如下内容&#xff1a; C(Qt) 和 Word、Excel、PDF 交互总结 Qt对word文档操作总结 QT中操作word文档 Qt/Windows桌面版提供了ActiveQt框架&#xff0c;用以为Qt和ActiveX提供完美结合。ActiveQt由两个模块组成&#xff1a; QAxContainer模…

【计算机网络】OSI七层模型与TCP/IP四层模型的对应与各层介绍

1 OSI七层模型与TCP/IP四层模型对应 2 OSI七层模型介绍 OSI&#xff08;Open Systems Interconnection&#xff09;模型是一个由国际标准化组织&#xff08;ISO&#xff09;定义的七层网络体系结构&#xff0c;用于描述计算机网络中的通信协议。每一层都有特定的功能&#xff…

【数据库原理】(27)数据库恢复

在数据库系统中&#xff0c;恢复是指在发生某种故障导致数据库数据不再正确时&#xff0c;将数据库恢复到已知正确的某一状态的过程。数据库故障可能由多种原因引起&#xff0c;包括硬件故障、软件错误、操作员失误以及恶意破坏。为了确保数据库的安全性和完整性&#xff0c;数…

(C++)成绩排序

文章目录 一、实验目的、内容二、实验程序设计及结构1.需求分析结构体变量函数 2.设计结构或流程图 三、设计过程四、测试分析五、设计的特点和结果 一、实验目的、内容 假设某年级有4个班&#xff0c;每班有45名同学。本学期有5门课程考试&#xff0c;每门课程成绩是百分制。…

Unity-场景

创建场景 创建新的场景后&#xff1a; 文件 -> 生成设置 -> Build中的场景 -> 将项目中需要使用的场景拖进去 SceneTest public class SceneTest : MonoBehaviour {// Start is called before the first frame updatevoid Start(){// 两个类&#xff1a; 场景类、场…

ONLYOFFICE服务器无法连接,请联系管理员问题解决

1、现象 部署好了nextcloud和onlyoffice后&#xff0c;新建文本文档报错ONLYOFFICE服务器无法连接&#xff0c;请联系管理员。 用快捷键“F12”进入控制台&#xff0c;点开错误提示栏&#xff0c;找到有“api.js“文件&#xff0c;“https://ONLYOFFICED的地址/web-apps/apps/…

微电网优化MATLAB:蚁群算法(Ant Colony Optimization,ACO)求解微电网优化(提供MATLAB代码)

一、微网系统运行优化模型 微电网优化是指通过优化微电网的运行策略和控制算法&#xff0c;以实现微电网的高效、可靠和经济运行。在微电网中&#xff0c;通过合理调度和控制微电源、负荷和储能系统&#xff0c;可以最大限度地提高能源利用效率&#xff0c;降低能源成本&#…

SpringCloud GateWay 在全局过滤器中注入OpenFeign网关后无法启动

目录 一、问题 二、原因 1、修改配置 2、添加Lazy注解在client上面 3、启动成功 一、问题 当在gateway的全局过滤器GlobalFilter中注入OpenFeign接口的时候会一直卡在路由中&#xff0c;但是不会进一步&#xff0c;导致启动未成功也未报错失败 2024-01-18 22:06:59.299 I…

数据集成时表模型同步方法解析

01 背景介绍 数据治理的第一步&#xff0c;也是数据中台的一个基础功能 — 即将来自各类业务数据源的数据&#xff0c;同步集成至中台 ODS 层。业务数据源多种多样&#xff0c;单单可能涉及到的主流关系型数据库就有近十种。功能更加全面的数据中台通常还具有对接非关系型数据…