MySQL核心SQL

news2024/10/6 16:31:27

一.结构化查询语言

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.coloradmin.cn/o/1390892.html

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

相关文章

通过Canal实现缓存同步

文章目录 1.数据同步策略2.初始Canal3.安装Canal4.监听Canal 1.数据同步策略 2.初始Canal 3.安装Canal 见文章安装Canal详情 4.监听Canal

【Web】websocket应用的是哪个协议

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Web ⛳️ 功不唐捐&#xff0c;玉汝于成 前言 在当今互联网时代&#xff0c;实时性和即时通讯成为网络应用日益重要的一部分。WebSocket 协议作为一种创新性的通信协议&#xff0c;极大地改善了…

网页设计(八)HTML5基础与CSS3应用

一、当当网企业用户注册页面设计 当当网企业用户注册页面 改版后当当网企业用户注册页面 <!-- prj_8_1.html --> <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>当当网企业用户注册页面设计</title><s…

圈小猫游戏HTML源码

源码介绍 圈小猫游戏html源码&#xff0c;HTMLCSSJS,记事本可以打开修改内容&#xff0c;电脑本地双击index.html即可运行&#xff0c;也可以上传到服务器上面运行&#xff0c;喜欢的同学可以拿去使用 下载地址 蓝奏云&#xff1a;https://wfr.lanzout.com/iFkVc1lb5akj CS…

【MATLAB源码-第113期】基于matlab的孔雀优化算法(POA)机器人栅格路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 POA&#xff08;孔雀优化算法&#xff09;是一种基于孔雀羽毛开屏行为启发的优化算法。这种算法模仿孔雀通过展开其色彩斑斓的尾羽来吸引雌性的自然行为。在算法中&#xff0c;每个孔雀代表一个潜在的解决方案&#xff0c;而…

NFS(Network File System 网络文件服务)

一&#xff0c;nfs 简介 1&#xff0c;nfs 性质 NFS&#xff08;Network File System 网络文件服务&#xff09; 文件系统&#xff08;软件&#xff09;文件的权限 NFS 是一种基于 TCP/IP 传输的网络文件系统协议 通过使用 NFS 协议&#xff0c;客户机可以像访问本地目录一样…

找不到msvcr100.dll怎么办?msvcr100.dll丢失的解决方法

在面对计算机系统中“msvcr100.dll”文件缺失这一常见问题时&#xff0c;用户可能会遇到应用程序无法正常启动或运行的情况。为了解决这一困扰广大用户的难题&#xff0c;本文将详细介绍并解析找不到“msvcr100.dll”文件的5种有效解决方法。 一、了解一下msvcr100.dll是什么&a…

[论文精读]Few-shot domain-adaptive anomaly detection for cross-site brain images

论文网址&#xff1a;Few-shot domain-adaptive anomaly detection for cross-site brain images | IEEE Journals & Magazine | IEEE Xplore 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有…

怎么修改或移除WordPress后台仪表盘概览底部的版权信息和主题信息?

前面跟大家分享『WordPress怎么把后台左上角的logo和评论图标移除&#xff1f;』和『WordPress后台底部版权信息“感谢使用 WordPress 进行创作”和版本号怎么修改或删除&#xff1f;』&#xff0c;其实在WordPress后台仪表盘的“概览”底部还有一个WordPress版权信息和所使用的…

鸿蒙入门实战-ArkTS开发

声明式UI基本概念 应用界面是由一个个页面组成&#xff0c;ArkTS是由ArkUI框架提供&#xff0c;用于以声明式开发范式开发界面的语言。 声明式UI构建页面的过程&#xff0c;其实是组合组件的过程&#xff0c;声明式UI的思想&#xff0c;主要体现在两个方面&#xff1a; 描述…

Simulink简介

Simulink 是一个模块图环境&#xff0c;用于多域仿真以及基于模型的设计。它支持系统级设计、仿真、自动代码生成以及嵌入式系统的连续测试和验证。Simulink 提供图形编辑器、可自定义的模块库以及求解器&#xff0c;能够进行动态系统建模和仿真。Simulink 与 MATLAB 相集成&am…

EChars

1.引入 Apache ECharts <!DOCTYPE html> <html><head><meta charset"utf-8" /><!-- 引入刚刚下载的 ECharts 文件 --><script src"echarts.js"></script></head> </html> 2. <!-- 为 ECharts 准…

浅谈电动汽车充电站箱变电气安全物联监测系统设计与应用

摘 要:基于物联网技术架构提出了一种适用于电动汽车充电站箱变的电气安全物联监测系统设计方案。该系统由电气安全智能感知设备、通信网关、电气安全物联网监测平台等构成&#xff0c;可支持充电站箱变充电桩出线回路电流、电缆 温度、剩余电流、故障电弧、短路电流等数据采集监…

zabbix其他配置

自动发现 zabbix server 主动的去发现所有的客户端&#xff0c;然后将客户端的信息登记在服务端上。 缺点是如果定义的网段中的主机数量多&#xff0c;zabbix server 登记耗时较久&#xff0c;且压力会较大。 systemctl disable --now firewalld setenforce 0 hostnamectl se…

C++I/O流——(4)格式化输入/输出(第一节)

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 含泪播种的人一定能含笑收获&#xff…

搜维尔科技:SenseGlove Nova 2力反馈技术手套,虚拟培训的沉浸感达到新高度!

SenseGlove Nova 2-虚拟培训的沉浸感达到新高度&#xff01; 通过集成主动接触反馈&#xff0c;Nova 2 使用户能够在手掌中感知虚拟现实物体的感觉。虚拟训练、研究和多人互动现在感觉比以往更加自然。这项创新增强了与整个手掌接触的任何虚拟物体的真实感。使用第一款也是唯一…

HarmonyOS之sqlite数据库的使用

从API Version 9开始&#xff0c;鸿蒙开发中sqlite使用新接口ohos.data.relationalStore 但是 relationalStore在 getRdbStore操作时&#xff0c;在预览模式运行或者远程模拟器运行都会报错&#xff0c;导致无法使用。查了一圈说只有在真机上可以正常使用&#xff0c;因此这里…

redis原理(四)数据安全之数据持久化

一、将数据持久化至硬盘 1、介绍&#xff1a;Redis是一个基于内存的数据库&#xff0c;它的数据是存放在内存中&#xff0c;内存有个问题就是关闭服务或者断电会丢失。Redis的数据也支持写到硬盘中&#xff0c;这个过程就叫做持久化。 2、Redis持久化选项&#xff1a;Redis提…

Pycharm无法刷新远程解释器的框架: Can‘t get remote credentials for deployment server

在Pycharm上部署项目到远程服务器&#xff0c;有时候需要启动SSH会话&#xff0c;启动的时候发现没反应&#xff0c;且事件日志显示&#xff1a;无法刷新远程解释器的框架: Can’t get remote credentials for deployment server 观察pycharm界面最下边&#xff0c;发现“无默…

Typora概述

Typora概述 1 下载Typora2 Typra大纲视图3 标题4 引用5 列表6 代码7 图片 各位小伙伴想要博客相关资料的话关注公众号&#xff1a;chuanyeTry即可领取相关资料&#xff01; 作为程序员平时编写笔记和开发文档时一般都使用Markdown格式&#xff0c;为了让你能成为更加专业的程序…