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

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 -ADatabase 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.hqwc.cn/news/467865.html

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

相关文章

java之jvm详解

JVM内存结构 程序计数器 Program Counter Register程序计数器(寄存器) 程序计数器在物理层上是通过寄存器实现的 作用&#xff1a;记住下一条jvm指令的执行地址特点 是线程私有的(每个线程都有属于自己的程序计数器)不会存在内存溢出 虚拟机栈(默认大小为1024kb) 每个线…

Rust入门:如何在windows + vscode中关闭程序codelldb.exe

在windows中用vscode单步调试rust程序的时候&#xff0c;发现无论是按下stop键&#xff0c;还是运行完程序&#xff0c;调试器codelldb.exe一直霸占着主程序不退出&#xff0c;如果此时对代码进行修改&#xff0c;后续就没法再编译调试了。 目前我也不知道要怎么处理这个事&am…

python-分享篇-GUI界面开发-PyQt5-弹出不同种类的消息提示框

代码 # -*- coding: utf-8 -*-# Form implementation generated from reading ui file messagebox.ui # # Created by: PyQt5 UI code generator 5.11.3 # # WARNING! All changes made in this file will be lost! 弹出不同种类的消息提示框from PyQt5 import QtCore, QtGui,…

剪辑视频衔接怎么操作 剪辑视频衔接过渡自然方法 剪辑视频教程新手入门 抖音剪辑短视频 会声会影视频制作教程

视频剪辑在现代社交媒体和数字媒体时代中变得越来越重要。它广泛应用于各种领域&#xff0c;包括电影制作、广告宣传、教育培训、社交媒体内容创作等。 一、剪辑视频衔接怎么操作 会声会影是一款功能强大、易于使用的视频编辑软件。接下来我们拿会声会影为例讲解剪辑视频如何…

【精选】java进阶——包和final

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

【MySQL】:分组查询、排序查询、分页查询、以及执行顺序

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; MySQL从入门到进阶 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. 分组查询1.1 语法1.2 where与having区别1.3 注意事项:1.4 案例: 二. 排序查询…

上位机图像处理和嵌入式模块部署(上位机主要功能)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 目前关于机器视觉方面&#xff0c;相关的软件很多。比如说商业化的halcon、vision pro、vision master&#xff0c;当然也可以用opencv、pytorch自…

Microsoft Visio 弧线

Microsoft Visio 弧线 1. 指针工具 -> 弧线2. 弧线References 1. 指针工具 -> 弧线 2. 弧线 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

Android的常用Drawable讲解

今天来讲讲Android开发中水都绕不开的东西----drawable。最常使用的莫过于通过XML所声明的Drawable作为View背景&#xff0c;通过代码创建的应用场景则较少。其有着使用简单&#xff0c;比自定义view的成本要低的特点。同时&#xff0c;非图片类型的drawable占用空间较小&#…

Linux_进程概念

硬件系统 软件系统 进程概念 进程状态 孤儿进程 进程优先级 一.硬件系统 1.1 冯诺依曼体系结构 数学家冯诺依曼提出了计算机制造的三个基本原则&#xff0c;即采用二进制逻辑、程序存储执行以及计算机由五个部分组成&#xff08;运算器、控制器、存储器、输入设备、输出设备&a…

Elasticsearch:适用于 iOS 和 Android 本机应用程序的 Elastic APM

作者&#xff1a;来自 Elastic Akhilesh Pokhariyal, Cesar Munoz, Bryce Buchanan 适用于本机应用程序的 Elastic APM 提供传出 HTTP 请求和视图加载的自动检测&#xff0c;捕获自定义事件、错误和崩溃&#xff0c;并包括用于数据分析和故障排除目的的预构建仪表板。 适用于 …

linux---内存管理

一 虚拟内存 即使是现代操作系统中&#xff0c;内存依然是计算机中很宝贵的资源&#xff0c;看看你电脑几个T固态硬盘&#xff0c;再看看内存大小就知道了。 为了充分利用和管理系统内存资源&#xff0c;Linux采用虚拟内存管理技术&#xff0c;利用虚拟内存技术让每个进程都有…