MySQL库表操作以及简单查询语句

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL库表操作以及简单查询语句

一、结构化查询语句

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

SQL主要可以分为一下三种类型:

  • DDL(Data Definition Languages)语句:数据定义语句,这些语句定义了不同的数据库、表、列、索引等对象。常用的语句关键字有create、drop、alter
  • DML(Data Manipulation Languages)语句:数据操作语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性,常用的语句关键字包括 insert、delete、update和select
  • DCL(Data Control Languages)语句:数据控制语句,用于控制不同的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别,常用的语句关键字包括grant、revoke

二、库操作


1. 查询数据库:
show databases;
2. 创建数据库
create database testdb;
3. 删除数据库
drop database testdb;
4. 选择数据库
use testdb;

三、表操作

因为业务层操作内存,MySQL操作磁盘,数据库永远是最先达到性能瓶颈,我们不能把过多的逻辑操作放在数据库上,逻辑操作应该在业务层做。

MySQL只做最核心的CRUD,触发器、存储函数、存储过程等都不会在MySQL上设置,统一迁移到业务层中的服务层做


1. 创建表:
create table stu(
  id int unsigned primary key not null auto_increment,
  name varchar(50) not null unique,
  age tinyint not null,
  sex enum("man","woman") not null
);
2. 查看表结构:
desc stu;
3. 删除表:
drop table stu;
4. 打印表创建的SQL:
show create table stu;

四、CRUD操作


1. 插入:
// id从1开始自增,上限和id的类型有关,到了上限就无法插入
insert into stu(name, age, sex) values("shen", 10, "man"); 
insert into stu(name, age, sex) values("zhang", 11, "woman"); 
insert into stu(name, age, sex) values("shen", 10, "man"),("zhang", 11, "woman"); 
2. 删除:
delete from stu;
3. 更新
update stu set age=age+1 where name="shen";

面试可能会问上述两种insert的区别:

批量导入数据的时候,常用的是一条SQL语句插入多条数据,而不是一条SQL插入一条数据。因为 每条SQL语句都需要C/S之间建立连接,最好是一条SQL插入更多的数据

image.png

五、查询操作

1. 去重


select distinct age from stu;
2. union合并查询


select exp1, exp2, ..., expn
from tables [where conditions]
union [all|distinct]    -- union默认去重,不用distinct修饰,all表示显示所有重复值
select exp1, exp2, ..., expn
from tables [where conditions]

image.png

and用到索引,or被MySQL优化为union也用到了索引

image.png

3. 带in子查询


select * from stu where age in (11, 22, 33);
 select * from stu where age not in (11, 22, 33);
 select * from stu where age between 11 and 22; -- [11, 22]
 select name from stu where id in (select id from stu where age > 10);
4. 分页查询


-- 限制查询的数量,用法:limit count 或 limit start count
select * from stu limit 2;  -- 偏移0条开始显示2条,limit 0, 2
select * from stu limit 1, 5;  -- 偏移1条开始显示5条
select * from stu limit 5 offset 2;  -- 偏移2条开始显示5条
select * from stu order by age desc limit 10,2;  -- 先按照年龄降序排列,偏移10条显示2条

面试问题:limit关键字只是对数据的显示进行了过滤,还是说可以影响SQL语句的查询效率?

explain:查看SQL语句的执行信息,展示SQL执行的一些关键信息,大致统计一些性能指标,可以查看SQL语句的执行性能

创建表的时候关键字unique会创建索引

image.png

就比如我们注册QQ,登录的时候都会到数据库匹配信息,不可能是注册的早的人匹配信息快登录快,注册的晚的人匹配信息慢登录名。

查询一下age

image.png

由于age没有添加索引,所以数据库引擎做的是整表搜索,效率很低

可以通过limit加快查找

image.png

使用大数据证实limit加快查找

建表、插入数据的过程见

image.png

这里只使用了100000条数据,如果使用百万、千万级别数据,效果会更明显

扫描的数据一旦满足limit条件时,就会停止扫描,可以提高搜索效率

实际出现的效率问题:

image.png

我们若使用如下SQL查询,就会有前几页查询快,后几页查询慢的问题

效率主要低在(page_num-1)*n偏移量,偏移需要花费时间


select * from t_user limit (page_num-1)*n, n;

我们可以使用id索引直接偏移


select * from t_user where id>(page_num-1)*n limit n;

image.png

六、创建存储过程procedure


create table t_user(
  id bigint primary key not null auto_increment,
  domain char(20) not null,
  passwd char(20) not null
);
delimiter $ -- 修改MySQL的分隔符,避免和创建语句的分隔符冲突
create procedure add_t_user(in n int)
begin
declare i int;
set i = 0;
while i < n do
insert into t_user(domain, passwd) values(concat(i+1,"@BugMaker.com"), i+1);
set i = i + 1;
end while;
end$
delimiter ;
call add_t_user(100000);

七、order by排序查询


select * from stu where sex= "man" order by age asc;
select * from stu where sex = "woman" order by age desc;
select * from stu where (age between 18 and 24) and sex="man" order by age desc, id desc; -- 先年龄降序,年龄一样则按照id降序

image.png

八、group by分组查询

一般和聚合函数一起使用


select age, count(age) from stu group by age;
select sex, avg(age) from stu group by sex;   
select age, sex, count(*) from stu group by age, sex order by age; -- 统计age和sex都相同的有几个人
select age, count(age) from stu group by age having age > 20; -- 条件查询

image.png

九、简单笔试题

image.png

  1. 统计表中缴费的总笔数和总金额


select count(serno), sum(amount) from bank_bill;
  1. 按网点和日期统计每个网点每天的营业额,并按照营业额倒序排序


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


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
23天前
|
缓存 关系型数据库 MySQL
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
|
1月前
|
SQL 前端开发 关系型数据库
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
54 9
|
1月前
|
缓存 监控 关系型数据库
如何优化MySQL查询速度?
如何优化MySQL查询速度?【10月更文挑战第31天】
71 3
|
1月前
|
关系型数据库 MySQL
mysql 5.7.x版本查看某张表、库的大小 思路方案说明
mysql 5.7.x版本查看某张表、库的大小 思路方案说明
64 5
|
1月前
|
SQL DataWorks 关系型数据库
阿里云 DataWorks 正式支持 SelectDB & Apache Doris 数据源,实现 MySQL 整库实时同步
阿里云数据库 SelectDB 版是阿里云与飞轮科技联合基于 Apache Doris 内核打造的现代化数据仓库,支持大规模实时数据上的极速查询分析。通过实时、统一、弹性、开放的核心能力,能够为企业提供高性价比、简单易用、安全稳定、低成本的实时大数据分析支持。SelectDB 具备世界领先的实时分析能力,能够实现秒级的数据实时导入与同步,在宽表、复杂多表关联、高并发点查等不同场景下,提供超越一众国际知名的同类产品的优秀性能,多次登顶 ClickBench 全球数据库分析性能排行榜。
|
1月前
|
SQL NoSQL 关系型数据库
2024Mysql And Redis基础与进阶操作系列(5)作者——LJS[含MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页等详解步骤及常见报错问题所对应的解决方法]
MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页、INSERT INTO SELECT / FROM查询结合精例等详解步骤及常见报错问题所对应的解决方法
|
1月前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
196 1
|
2月前
|
SQL Java 关系型数据库
java连接mysql查询数据(基础版,无框架)
【10月更文挑战第12天】该示例展示了如何使用Java通过JDBC连接MySQL数据库并查询数据。首先在项目中引入`mysql-connector-java`依赖,然后通过`JdbcUtil`类中的`main`方法实现数据库连接、执行SQL查询及结果处理,最后关闭相关资源。
|
1月前
|
SQL 关系型数据库 MySQL
定时任务频繁插入数据导致锁表问题 -> 查询mysql进程
定时任务频繁插入数据导致锁表问题 -> 查询mysql进程
47 1
|
1月前
|
关系型数据库 MySQL
mysql 5.7.x版本查看某张表、库的大小 思路方案说明
mysql 5.7.x版本查看某张表、库的大小 思路方案说明
36 1