MYSQL笔记:简单的SQL操作和select查询

news2025/1/20 15:44:25

MYSQL笔记:简单的SQL操作和select查询

文章目录

  • MYSQL笔记:简单的SQL操作和select查询
    • 结构化查询语句SQL
    • 库操作
    • 表操作
    • CRUD操作
    • 单表查询
      • select 查询
      • 例子
    • 分页查询与limit
      • limit 只是对结果条数有限制还是会提高查询效率?
    • order by
    • group by
    • 多表连接查询
      • 内连接查询
      • 外连接
        • 左连接
        • 右连接

结构化查询语句SQL

SQL主要分为3个类别:

  • DDL 数据库定义语义
    creat drop alter
  • -DML 数据库操作语义
    insert delete update select
  • DCL 数据控制语句
    控制用户访问权限等:grant revoke

库操作

查看,创建,删除,选择数据库

show databases;
create database db;
drop database db;
use db;

表操作

创建表:六个约束: primary key unique not null default auto_increment

create table user(
id int unsigned primary key not null auto_increment,
name varchar(50) unique not null ,
age tinyint default '18'
)engine=INNODB default charset=utf8;

查看表结构:
desc user;
删除表:
drop table user;
查看表的创建语句:
show create table user\G;

mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show table;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| user           |
+----------------+
1 row in set (0.00 sec)

mysql> show create table user\G;
*************************** 1. row ***************************
       Table: user
Create Table: CREATE TABLE `user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT ' 用户id',
  `nickname` varchar(50) NOT NULL COMMENT '用户名称',
  `age` tinyint(3) unsigned NOT NULL DEFAULT '18',
  `sex` enum('male','famale') DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `nickname` (`nickname`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

CRUD操作

insert 增加

 insert into user(name,age,sex) values('a',20,'M');
mysql>  insert into user(nickname,age,sex) values('a',20,'male');
Query OK, 1 row affected (0.03 sec)
mysql> select * from user;
+----+----------+-----+------+
| id | nickname | age | sex  |
+----+----------+-----+------+
|  1 | a        |  20 | male |
+----+----------+-----+------+
1 row in set (0.00 sec)

update 更新

update user set age=age+1;

连续插入的两种方法:
在这里插入图片描述
区别:
首先mysql处理的过程:
在这里插入图片描述第一种会进行5次tcp握手挥手过程。
第二次只进行1次tcp握手挥手,会更省网络资源提升性能。
联想数据库连接池项目

单表查询

select 查询

select * from user;
select name,age from user where age>=21 and sex='male';
select name,age from user where age>=21 and sex='male';
select name,age from user where age beteen 10 and 22;
select name,age from user where name like "zhang%";

between and-》包含起始和末尾
去重
distinct
空值查询
select * from user where name is null;
union 合并查询
union 默认去重不用修饰distinct。union all 表示显示所有重复值
带in的子查询
select * from user where id in (10,20);

例子

mysql> select nickname from user where nickname is not null;
+-----------+
| nickname  |
+-----------+
| a         |
| zhangsan  |
| zhangsass |
| zhangww   |
+-----------+
4 rows in set (0.00 sec)

mysql> select nickname from user where age in (20,21);
+-----------+
| nickname  |
+-----------+
| a         |
| zhangsan  |
| zhangsass |
| zhangww   |
+-----------+
4 rows in set (0.00 sec)

mysql> select nickname from user where age in (20);
+-----------+
| nickname  |
+-----------+
| zhangsan  |
| zhangsass |
| zhangww   |
+-----------+
3 rows in set (0.00 sec)

mysql> select nickname from user where age not in (20);
+----------+
| nickname |
+----------+
| a        |
+----------+
1 row in set (0.00 sec)

mysql> select age from user;
+-----+
| age |
+-----+
|  21 |
|  20 |
|  20 |
|  20 |
+-----+
4 rows in set (0.00 sec)

mysql> select distinct age from user;
+-----+
| age |
+-----+
|  21 |
|  20 |
+-----+
2 rows in set (0.00 sec)

mysql> select nickname from user where age in (20) union all select sex from user where sex='male';
+-----------+
| nickname  |
+-----------+
| zhangsan  |
| zhangsass |
| zhangww   |
| male      |
| male      |
| male      |
| male      |
+-----------+
7 rows in set (0.00 sec)

mysql> select nickname from user where age in (20) union  select sex from
user where sex='male';
+-----------+
| nickname  |
+-----------+
| zhangsan  |
| zhangsass |
| zhangww   |
| male      |
+-----------+
4 rows in set (0.00 sec)

分页查询与limit

select id from user limit 10;

相当于limit 0,10
在这里插入图片描述
为了兼容postgresql

select id from user limit 1,3;

也可以写成:

select id from user limit 3 offset 1;

mysql> select id from user limit 3;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
+----+
3 rows in set (0.00 sec)

mysql> select id from user limit 1,3;
+----+
| id |
+----+
|  2 |
|  3 |
|  4 |
+----+
3 rows in set (0.00 sec)

limit 只是对结果条数有限制还是会提高查询效率?

用 explain 查看SQL的执行计划:
在这里插入图片描述
对于添加了索引的,每次扫都是直接扫1行
对于没有索引且没有limit的查找,是全表的查询
如果加了limit,就不会进行全表查询。
存储过程

create table t_user(
    id int NOT NULL AUTO_INCREMENT,
    email varchar(255)  default NULL,
    password varchar(255)  default NULL,
     PRIMARY KEY (id)
     )engine =InnoDB  DEFAULT CHARSET=utf8;
delimiter $
create procedure add_t_user( IN n INT)
BEGIN
DECLARE i INT;
SET i=0;
WHILE i<n DO
INSERT  INTO t_user(email,password) values(CONCAT(i+1,'@qq.com'),i+1);
SET i=i+1;
END WHILE;
END$
delimiter ;
call add_t_user(1000000);

常用聚合函数:count()

select count(*) from t_user;

分页
想设置分页怎么select:
在这里插入图片描述
如何降低偏移量大对性能的影响:
可以使用
select * from t_user where id>20001 limit 20;
代替
select * from t_user limit 20000,20;
因为id是有索引的,过滤会更快,是常量时间
在这里插入图片描述
在这里插入图片描述
select 多与少也是影响效率的
解决方法1:
在这里插入图片描述
如何查询更多的类型:
解决方法2:利用内连接优化分页
在这里插入图片描述
在这里插入图片描述
这样生成临时表是小表整表扫描

order by

select * from uer order by age ;

select * order from user  by age desc;

order by explain发现extra有 using filesort 外排序,放到磁盘里面是比较慢的,可以加索引变成using index可以提升效率

group by

select name,age from user group by age;

上述语句将age相同的分为一组,一般是结合统计函数,distinct没有这个功能

select name,sum(age) from user group by age;

分组后过滤:

select name,sum(age) from user group by age having age>20;

先过滤在分组:

select name,sum(age) from user where age>20 group by age;

group by加索引后可以提升性能,如下图所示,age字段本身没有索引。所以一开始是group by 生成临时表以后使用的是外排序。外排序有较大的磁盘IO容易降低性能。name有索引,所以using index的排序。性能会提升。order by 和group by都是这样。
在这里插入图片描述
例子
在这里插入图片描述


select count(serno) ,sum(amount) from  bank_bill;
select brno,date,sum(amount) as money from bank_bill group by brno,date order by brno money desc;

多表连接查询

在这里插入图片描述

内连接查询

create table student(
uid int unsigned PRIMARY KEY not null auto_increment,
name varchar(50) not null,
age Tinyint unsigned not null,
sex enum('M','W') NOT NULL
);
create table course (
cid int unsigned PRIMARY KEY not null auto_increment,
cname varchar(50) not null,
credit TINYINT unsigned not null
);
create table exame(
uid int unsigned,
cid int unsigned  not null ,
time date not null,
score float not null,
primary key (uid,cid)
);
insert into course (cname ,credit) values
('C++高级课程',5),
('操作系统',6),
('移动互联网',3),
('体系结构',5);

insert into student (name ,age,sex) values
('zjam',15,'M'),
('CAOjam',18,'M'),
('lijam',25,'W'),
('wangam',25,'W'),
('kakaxijam',20,'M');
insert into exame(uid,cid,time,score) values
(1,1,'2022-04-01',99.0),
(1,2,'2022-04-02',89.0),
(1,3,'2022-04-10',90.0),
(1,4,'2022-04-15',90.0),
(2,1,'2022-04-01',99.0),
(2,2,'2022-04-02',79.0),
(2,3,'2022-04-10',95.0),
(3,1,'2022-04-01',98.0),
(3,2,'2022-04-02',59.0),
(3,3,'2022-04-10',92.0),
(3,4,'2022-04-15',60.0),
(4,1,'2022-04-01',99.0),
(4,2,'2022-04-02',79.0),
(4,3,'2022-04-10',63.0),
(4,4,'2022-04-15',94.0),
(5,1,'2022-04-01',49.0),
(5,2,'2022-04-02',69.0),
(5,3,'2022-04-10',92.0),
(5,4,'2022-04-15',97.0);

查看某人某门课的成绩:
预置条件 uid:1 cid :2

select score from exame where uid=1 and cid=2;
select uid .name,age,sex from student where uid=1 ;

合并上述两句:
首先先给表命名:

select c.score from exame c where c.uid=1 and c.cid=2;
select a.uid ,a.name,a.age,a.sex from student a where a.uid=1 ;

合并:(区分大表和小表,按照数据量区分小表永远是整表扫描,然后去大表搜索
因为小表一直都是整表搜索,所以给大表建索引才有优化效果,小表建索引没用

select a.uid ,a.name,a.age,a.sex ,c.score from student a inner join exame c on a.uid=c.uid;
+-----+-----------+-----+-----+-------+
| uid | name      | age | sex | score |
+-----+-----------+-----+-----+-------+
|   1 | zjam      |  15 | M   |    99 |
|   1 | zjam      |  15 | M   |    89 |
|   1 | zjam      |  15 | M   |    90 |
|   1 | zjam      |  15 | M   |    90 |
|   2 | CAOjam    |  18 | M   |    99 |
|   2 | CAOjam    |  18 | M   |    79 |
|   2 | CAOjam    |  18 | M   |    95 |
|   3 | lijam     |  25 | W   |    98 |
|   3 | lijam     |  25 | W   |    59 |
|   3 | lijam     |  25 | W   |    92 |
|   3 | lijam     |  25 | W   |    60 |
|   4 | wangam    |  25 | W   |    99 |
|   4 | wangam    |  25 | W   |    79 |
|   4 | wangam    |  25 | W   |    63 |
|   4 | wangam    |  25 | W   |    94 |
|   5 | kakaxijam |  20 | M   |    49 |
|   5 | kakaxijam |  20 | M   |    69 |
|   5 | kakaxijam |  20 | M   |    92 |
|   5 | kakaxijam |  20 | M   |    97 |
+-----+-----------+-----+-----+-------+
19 rows in set (0.00 sec)

mysql> 

上述连接语句,从小表student中取出所有的a.uid然后拿着uid去exame大表中搜索
连接三个表:

select a.uid ,a.name,a.age,a.sex,b.cid,b.cname,b.credit,c.score from exame c
inner join student a on c.uid=a.uid
inner join course b on c.cid=b.cid
where c.uid=1 and c.cid=2;

+-----+------+-----+-----+-----+--------------+--------+-------+
| uid | name | age | sex | cid | cname        | credit | score |
+-----+------+-----+-----+-----+--------------+--------+-------+
|   1 | zjam |  15 | M   |   2 | 操作系统     |      6 |    89 |
+-----+------+-----+-----+-----+--------------+--------+-------+
1 row in set (0.00 sec)

外连接

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

如果加了where语句,先进行where条件的过滤
对于内连接,过滤条件写在where语句后面和写在on连接条件里面效果是一样的
在这里插入图片描述
对于外连接是不同的
在这里插入图片描述
在外连接如果加了where条件,效果会变得和内连接一样,所以外连接一般过滤条件都写在on的连接条件里面

左连接

把左边的表的所有数据显示出来,若在右表中不存在相应数据,则显示NULL
在这里插入图片描述

右连接

把right右边的表的所有数据显示出来,若在左表中不存在相应数据,则显示NULL
在这里插入图片描述
区别:
在这里插入图片描述
右连接先对右边的表进行整表的搜索,left连接先对左边的表进行整表搜索
小应用
如何查询那些人没有参加考试

select * from student where uid not in (select distinct uid from exame);

带in子查询的缺点:
in 可用到索引,而not in在没有sql优化的时候一般都是不能用索引的
子查询一般会产生一张中间表存储结果供外面的sql查询
用外连接实现:

select a.* from studenta  a left join exame b on a.uid=b.uid where b.cid is null;

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

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

相关文章

【数据结构】常见八大排序算法(附动图)

一、前言 关于排序&#xff0c;有一些术语&#xff0c;例如算法的稳定/不稳定&#xff0c;内部排序和外部排序等&#xff0c;需要我们了解一下 稳定&#xff1a;当未排序时a在b前面且ab&#xff0c;排序后a仍然在b前面 不稳定&#xff1a;当未排序时a在b前面且ab&#xff0c;排…

微信小程序的图片色彩分析,解决画布网络图片报错问题,窃取网络图片的主色调

1、安装 Mini App Color Thief 包 包括下载包&#xff0c;简单使用都有&#xff0c;之前写了&#xff0c;这里就不写了 网址&#xff1a;微信小程序的图片色彩分析&#xff0c;窃取主色调&#xff0c;调色板-CSDN博客 2、 问题和解决方案 问题&#xff1a;由于我们的窃取图片的…

【SpringBoot】Validator组件+自定义约束注解实现手机号码校验和密码格式限制

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java对AI的调用开发》 《RabbitMQ》《Spring》《SpringMVC》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 前言一、Cons…

Linux防火墙开放

记录一次问题 写的网络服务无法通信 代码没问题&#xff0c;IP绑定、端口绑定没问题&#xff0c;就是无法进行通信&#xff0c;这里要分2步走。 服务器控制台开放 进入防火墙 添加规则&#xff0c;这里以开放udp的8899端口为例 这里在服务器后台就已经开放了&#xff0c;但此时…

Redis相关介绍

概念 Redis&#xff1a;非关系型数据库&#xff08;non-relational)&#xff0c;Mysql是关系型数据库(RDBMS) Redis是当今非常流行的基于KV结构的作为Cache使用的NoSQL数据库 为什么使用NoSQL 关系型 数据库无法应对每秒上万次 的读写请求 表中的存储记录 数量有限 无法简单…

9.【CPP】List (迭代器的模拟实现||list迭代器失效||list的模拟实现)

介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前一个元素和后一个元素。list与forward_…

QGIS打开shp地图

地图shp文件如何打开查看 提示 open sans字体没有安装 字体天下-提供各类字体的免费下载和在线预览服务 这里搜索open sans下载 但是 还是不显示 省份名称。

数据结构——lesson2线性表和顺序表

目录 前言 一、顺序表是什么&#xff1f; 1. 静态顺序表&#xff1a;使用定长数组存储元素 2. 动态顺序表&#xff1a;使用动态开辟的数组存储。 二、接口实现 1.动态顺序表存储 2.基本增删查改接口 (1)初始化顺序表 (2)顺序表摧毁 (3)检查空间 (4)顺序表打印 (5)顺…

【JVM篇】什么是jvm

文章目录 &#x1f354;什么是Java虚拟机&#x1f6f8;Java虚拟机有什么用&#x1f339;Java虚拟机的功能&#x1f388;Java虚拟机的组成 &#x1f354;什么是Java虚拟机 JVM指的是Java虚拟机&#xff0c;本质上是一个运行在计算机上的程序&#xff0c;可以运行 Java字节码文件…

pytorch花式索引提取topk的张量

文章目录 pytorch花式索引提取topk的张量问题设定代码实现索引方法gather方法验证 补充知识expand方法gather方法randint pytorch花式索引提取topk的张量 问题设定 或者说&#xff0c;有一个(bs, dim, L)的大张量&#xff0c;索引的index形状为(bs, X)&#xff0c;想得到一个(…

位运算+leetcode ( 2 )

题一&#xff1a;只出现一次的数字&#xff08;1&#xff09; 1.链接 136. 只出现一次的数字 - 力扣&#xff08;LeetCode&#xff09; 2.思想 借用位运算中异或操作符的特点&#xff0c;a^a0&#xff0c;0^aa先定义一个sum0就用一个循环来遍历这个数组&#xff0c;每次都进行…

lv15 平台总线框架及案例 2

一、总线、设备、驱动 硬编码式的驱动开发带来的问题&#xff1a; 垃圾代码太多 结构不清晰 一些统一设备功能难以支持 开发效率低下 1.1 初期解决思路&#xff1a;设备和驱动分离 struct device来表示一个具体设备&#xff0c;主要提供具体设备相关的资源&#xff08;如…

小游戏和GUI编程(7) | SimpleNN 界面源码解析

小游戏和GUI编程(7) | SimpleNN 界面源码解析 0. 简介 SimpleNN 是 AdamYuan 在高中一年级时用 1 天时间写出来的简易 CNN, 使用 SFML 做 UI, 用于交互式输入手写数字&#xff0c;这个数字被训练好的 CNN 网络执行推理得到识别结果, 它的运行效果如下&#xff1a; 这一篇我们…

C语言——oj刷题——调整数组使奇数全部都位于偶数前面

题目&#xff1a; 输入一个整数数组&#xff0c;实现一个函数&#xff0c;来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分&#xff0c;所有偶数位于数组的后半部分。 一、实现方法&#xff1a; 当我们需要对一个整数数组进行调整&#xff0c;使得奇数位于数…

Solidworks:挑战新问题,不知道如何画出斜视图?

如果图形都是基于XYZ三个方向构造&#xff0c;没什么难度。如果有其他倾斜方向的&#xff0c;问题就难了。今天试了一下&#xff0c;看看我的3D模型。 出图纸的时候&#xff0c;不知道如何才能投影出斜视图&#xff0c;一边准确描述下面的那个小局部孔位。 补充&#xff1a;查了…

C++ Qt框架开发 | 基于Qt框架开发实时成绩显示排序系统(3) 保存表格数据

对上两篇篇的工作C Qt框架开发| 基于Qt框架开发实时成绩显示排序系统&#xff08;1&#xff09;-CSDN博客和C Qt框架开发 | 基于Qt框架开发实时成绩显示排序系统&#xff08;2&#xff09;折线图显示-CSDN博客继续优化&#xff0c;增加一个保存按钮&#xff0c;用于保存成绩数据…

八、克服冲动(Overcoming Impulses)

6.Overcoming Impulses 六、克服冲动 The skill of focus basically boils down to a tension between two different forces: the desire to work and the desire to quit. 专注的技巧基本上可以归结为两种力量之间的张力&#xff1a;工作的欲望和停止工作的欲望。 What makes…

猫头虎分享已解决Bug || Uncaught SyntaxError: Unexpected token

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

解锁未来:探秘Zxing二维码技术的神奇世界

解锁未来&#xff1a;探秘Zxing二维码技术的神奇世界 1. 引言 在当今数字化和智能化的社会中&#xff0c;二维码技术已经成为人们生活中不可或缺的一部分。从商品购物、支付结算到健康码、门票核销&#xff0c;二维码无处不在&#xff0c;极大地方便了人们的生活和工作。而Zx…

Vue3快速上手(三)Composition组合式API及setup用法

一、Vue2的API风格 Vue2的API风格是Options API,也叫配置式API。一个功能的数据&#xff0c;交互&#xff0c;计算&#xff0c;监听等都是分别配置在data, methods&#xff0c;computed, watch等模块里的。如下&#xff1a; <template><div class"person"…