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;
查看表结构
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后面 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue2配置教程

5.12.3 Vue Cli 文档地址: https://cli.vuejs.org/zh/ IDEA 打开项目&#xff0c;运行项目

【年终总结】回首2023的精彩,迈向2024的未来

文章目录 一、历历在目&#xff0c;回首成长之路&#x1f3c3;‍1、坚持输出&#xff0c;分享所学2、积土成山&#xff0c;突破万粉3、不断精进&#xff0c;向外涉足 二、雅俗共赏&#xff0c;阅历百般美好&#x1f3bb;1、音乐之声&#xff0c;声声入耳2、书海遨游&#xff0c…

select...for update锁详解

select…for update锁详解 select…for update的作用就是&#xff1a;如果A事务中执行了select…for update&#xff0c;那么在其提交或回滚事务之前&#xff0c;B&#xff0c;C&#xff0c;D…事务是无法操作&#xff08;写&#xff09;A事务select…for update所命中的数据的…

php时间函数date()、getdate()、time()

目录 1. 时区修改 2. date() 3. getdate() 4. time() 1. 时区修改 位于东八区&#xff0c;修改php.ini 。date.timezone Asia/Shanghai 2. date() 获取时间函数 <?php header("Content-Type: text/html; charsetutf-8");$d date(H:i:s);//小时H&#xf…

linux驱动(五):framebuffer

本文主要探讨210的framebuffer驱动知识。 frameBuffer 用户态进程直接调用显卡写屏,framebuffer接口是给用户态进程用于写屏 framebuffer设备文件为fbx 清屏:dd if/dev/zero of/dev/fbx 清屏&#xff1a;$ dd if/dev/zero of/dev/fb0 bs1024 …

2023 IoTDB Summit:天谋科技高级开发工程师苏宇荣《汇其流:如何用 IoTDB 流处理框架玩转端边云融合》...

12 月 3 日&#xff0c;2023 IoTDB 用户大会在北京成功举行&#xff0c;收获强烈反响。本次峰会汇集了超 20 位大咖嘉宾带来工业互联网行业、技术、应用方向的精彩议题&#xff0c;多位学术泰斗、企业代表、开发者&#xff0c;深度分享了工业物联网时序数据库 IoTDB 的技术创新…

一键调整播放倍速,调整播放倍速的软件

你是否曾因为长时间的视频而感到厌烦&#xff1f;或者因为视频播放得太快而错过了一些重要内容&#xff1f;现在&#xff0c;有了我们的【媒体梦工厂】&#xff0c;这些问题都将得到完美解决。不论你是想快速浏览长视频&#xff0c;还是想让视频慢下来以便更好地学习或欣赏&…

spring-mvc(1):Hello World

虽然目前大多数都是使用springboot来开发java程序&#xff0c;或者使用其来为其他端提供接口&#xff0c;而为其他端提供接口&#xff0c;这些功能都是依靠springmvc实现的&#xff0c;所以有必要学习一下spring-mvc&#xff0c;这样才能更好的学习springboot。 一&#xff0c…

C++力扣题目236--二叉树的最近公共祖先

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以是它自己的…

代码随想录 Leetcode349. 两个数组的交集

题目&#xff1a; 代码(首刷看解析 2024年1月14日&#xff09;&#xff1a; class Solution { public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {unordered_set<int> a;unordered_set<int> res;for(int i 0…

每日一题——LeetCode1189.气球的最大数量

方法一 个人方法&#xff1a; 统计text字符串中b、a、l、o、n 这几个字符出现的次数 l和n需要两个才能拼成一个balloon&#xff0c;所以碰到l和o加1&#xff0c;其他字符加2 最后求出出现次数最少的那个字符再除以2就是能拼凑成的单词数量&#xff0c;避免出现小数要使用向下…

近红外光谱分析技术与基于深度学习的化学计量学方法

郁磊【副教授】&#xff1a;主要从事AI人工智能与大数据分析等相关研究&#xff0c;长期致力于人工智能与近红外生物医学工程等领域融合&#xff0c;主持并完成多项科研课题。著有《神经网络43个案例分析》等书籍。 // 讲座内容 1、近红外光谱基本理论、近红外光谱仪基本原理…

clickhouse join查询算法

算法对比&#xff1a; 使用方法&#xff1a; SELECT town,max(price) AS max_price,any(population) AS population FROM uk_xxx_paid JOIN uk_xxx_table ON lower(uk_price_paid.town) lower(uk_populations_table.city) GROUP BY town ORDER BY max_price DESC SETTINGS jo…

对接苹果CMS芒果影视APPV1.0(附安装教程+源码支持多端)内置采集脚本

目录 概述1. 演示效果1.1 视频演示1.2 图文演示1.2.1 首页1.2.2 专题页1.2.3 搜索1.2.4 观影 2. 支持功能3. 插件和框架4. 部署方法4.1 后端4.1.1 准备工具4.1.2创建站点4.1.3 上传后端代码到服务器4.1.4 导入数据库4.1.5 配置数据库信息4.1.6访问后台管理系统 4.2 前端4.2.1 准…

影响邮件打开率的因素有哪些?

影响邮件打开率得因素有很多&#xff0c;比如说邮件地址的有效性、邮件标题、定位人群、发送频率或者时间等因素。目前来讲&#xff0c;我们可以通过技术的手段改善邮件的到达率&#xff0c;但是邮件的打开率取决于收件人本身&#xff0c;所以发件人的发送动作如何在很大程度上…

为什么光刻要用黄光

光刻是集成电路&#xff08;IC或芯片&#xff09;制造中的重要工艺之一。简单来说&#xff0c;它是通过使用光掩膜和光刻胶在基板上复制电路图案的过程。 基板将涂覆硅二氧化层绝缘层和光刻胶。光刻胶在被紫外光照射后可以容易地用显影剂溶解&#xff0c;然后在腐蚀后&#xf…

MT1138-MT1150总结

1. 判断闰年方法 year%40&&year%400&#xff01;0||year%4000 #include<bits/stdc.h> using namespace std;int day(int year,int mouth){if(mouth1||mouth3||mouth5||mouth7||mouth8||mouth10||mouth12){return 31;}else if(mouth4||mouth6||mouth9||mouth11)…

【促销定价】背后的算法技术 2 - 数据预处理生成

【促销定价】背后的算法技术 2 - 数据预处理生成 01 数据探查02 数据清洗03 数据聚合04 数据补全05 小结参考文献 导读&#xff1a;在日常生活中&#xff0c;我们经常会遇见线上/线下商家推出各类打折、满减、赠品、新人价、优惠券、捆绑销售等促销活动。一次成功的促销对于消费…

【Linux 内核源码分析笔记】系统调用

在Linux内核中&#xff0c;系统调用是用户空间程序与内核之间的接口&#xff0c;它允许用户空间程序请求内核执行特权操作或访问受保护的内核资源。系统调用提供了一种安全可控的方式&#xff0c;使用户程序能够利用内核功能而不直接访问底层硬件。 系统调用&#xff1a; 通过…

Azure Machine Learning - 视频AI技术

Azure AI 视频索引器是构建在 Azure 媒体服务和 Azure AI 服务&#xff08;如人脸检测、翻译器、Azure AI 视觉和语音&#xff09;基础之上的一个云应用程序&#xff0c;是 Azure AI 服务的一部分。 有了 Azure 视频索引器&#xff0c;就可以使用 Azure AI 视频索引器视频和音频…