【MySQL】数据库基础操作

  • 👑专栏内容:MySQL
  • ⛪个人主页:子夜的星的主页
  • 💕座右铭:前路未远,步履不停

目录


一、数据库操作

1、创建数据库

sql 复制代码
create database  数据库名;
  • create,database 相当于关键字
  • SQL 关键字不区分大小写
  • 数据库名不能重复
sql 复制代码
create database 数据库名 character set utf8;
  • 创建数据库的时候,指定字符集

2、查看所有数据库

sql 复制代码
show databases;

3、选定指定数据库

sql 复制代码
use 数据库名;

一旦选定某个指定数据库,后续操作,就都是针对该数据库展开。

4、删除数据库

sql 复制代码
drop database 数据库名;

注意:drop操作是非常危险的,一旦删掉数据库,数据库中的所有数据都没了。

二、数据表操作

1、创建数据表

sql 复制代码
create table 表名(列名 类型 , 列名 类型.....);

重点了解如下数据类型:
intbigintvarchardoubledecimaldatetime

创建表的时候,需要把表的类型确定好,后续插入的数据也要遵循当前类型。

sql 复制代码
create table product(
  name varchar(30),
  price int ,
  inventory int , 
  description varchar(30)
);

2、查看所有表

sql 复制代码
show tables;

3、查看指定表的结构

sql 复制代码
desc 表名;


Field:字段。表示一行里面有几列
Type:每一列的类型
NULL:该列是否允许为空,YES 就是允许为空(不填)
Default:不填的时候的默认值
Extra:额外的补充信息

4、删除表

sql 复制代码
drop table 表名;

删除表,相当于删除整个表的所有数据。也是一个危险的操作。

三、增删改查

1、新增

sql 复制代码
insert into 表名 values (值,值,值...);
  • SQL 中 '" 都行。
  • 大多数没有字符类型的编程语言,都是允许单引号和双引号来表示字符串,并且单双引号的效果是等价的。
  • 注意:要想插入中文,必须在创建数据库的时候,指定 charset utf8

指定列插入

sql 复制代码
insert into book(name) values ('三国演义'); 

使用 ()来标识当前要针对那些列进行插入,多个列名之间可以用,来分割。

插入多个记录

sql 复制代码
insert into book values (10,'a'),(12,'b')....;

两者区别

一次插入三条记录和分三次插入,每次插入一条记录有什么区别???

MySQL 是一个客户端服务器结构的程序。



每次执行SQL都涉及到了客户端和MySQL服务器之间的通信!所以,每一次的网络交互都有成本,所以多行数据插入是优于单行多次插入的!!

2、查询

全列查询

sql 复制代码
select *from 表名;
  • * 是通配符,可以代指任意的列。


select * 一个非常危险的操作!

因为select * 会查询所有的数据。如果查询的数据非常非常多,那么就会导致这个服务器一瞬间,硬盘的带宽和网卡的带宽都被吃满了。

指定列查询

手动指定查询某一列或者某几列。

sql 复制代码
select 列名,列名....from 表名;
sql 复制代码
select name,author from book;

查询字段为表达式

查询的同时,可以进行计算。

sql 复制代码
select name,price-30 from book;

MySQL是一个客户端 服务器 结构的程序!!我们看到的客户端显示的结果是一个"临时表",select 操作不管怎么写,都不会影响到数据库服务器硬盘上存储的原始数据。

查询结构的列名和表达式是一致的,不利于用户阅读。所以,我们在查询的时候,可以给表达式指定别名。

sql 复制代码
select name,price-30 as '价钱-30' from book;

查询时去重

把重复的行去掉,只保留一份。

sql 复制代码
select distinct 列名 from 表名;

排序查询

对查询到的结果进行排序。MySQL是一个客户端 服务器 结构的程序,我们看到的客户端显示的结果是一个"临时表"。对于数据库服务器上的原始的数据没有任何的顺序上的影响。

sql 复制代码
-- 升序排序(asc可以不写)
select 列名 from 表名 order by 列名 asc;
-- 降序排序
select 列名 from 表名 order by 列名 desc;
-- 多列排序(多列排序有先后顺序)
-- 先排前面的。前面的一样再排后面的
select 列名 from 表名 order by 列名,列名....asc;

默认为升序排序,如果想要降序排序,就在列名后面加上 desc

sql 复制代码
select 列名 from 表名 order by 列名 desc;

如果SQL中,没有指定 order by,此时我们的代码中就不应该依赖结果临时表的顺序!MySQL并不承诺,这个不带order by的查询结果是带有一定顺序的。

条件查询

查询的同时,制定一个筛选条件,把符合条件的结果保留,不符合的就剔除掉。
比较运算符

运算符 解释
>,>=,<,<= 大于,大于等于,小于,小于等于
= 等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL
<=> 等于,NULL 安全,例如 NULL <=> NULL 的结果是 TRUE(1)
!=,<> 不等于
between a0 and a1 范围匹配,[a0, a1],如果 a0 <= value <= a1,返回 TRUE(1)
in(option,...) 如果是 option 中的任意一个,返回 TRUE(1)
IS NULL 是NULL
is not NULL 不是NULL
like 模糊匹配。% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字

逻辑运算符

运算符 解释
and 多个条件必须都为 TRUE(1),结果才是 TRUE(1)
or 任意一个条件为 TRUE(1), 结果为 TRUE(1)
not 条件为 TRUE(1),结果为 FALSE(0)
  • 有些列可以不填,不填就相当于 NULL
  • where 条件可以使用表达式,但不能使用别名。
  • and 的优先级高于 or,在同时使用时,需要使用小括号 () 包裹优先执行的部分。
sql 复制代码
select name,price from book where price < 89;

理解查询语句执行的过程:

  1. 服务器需要先遍历表中的每一个记录
  2. 针对当前记录,带入条件,看是否成立
  3. 如果条件成立,则将这一结果加入结果集,返回给客户端。否则,跳过该结构。
sql 复制代码
-- 查询英语不及格的同学及英语成绩 ( < 60 )
select name, english from exam_result where english < 60;
-- 查询语文成绩好于英语成绩的同学
select name, chinese, english from exam_result where chinese > english;
-- 查询总分在 200 分以下的同学
select name, chinese + math + english as total from exam_result where chinese + math + english < 200;
-- 查询语文成绩大于80分,且英语成绩大于80分的同学
select * from exam_result where chinese > 80 and english > 80;
-- 查询语文成绩大于80分,或英语成绩大于80分的同学
select * from exam_result where chinese > 80 or english > 80;
-- 观察and 和 OR 的优先级:
select * from exam_result where chinese > 80 or math>70 and english > 70;
select * from exam_result where (chinese > 80 or math>70) and english > 70;
-- 查询语文成绩在 [80, 90] 分的同学及语文成绩
select name, chinese from exam_result where chinese between 80 and 90;
-- 使用 and 也可以实现
select name, chinese from exam_result where chinese >= 80 and chinese <= 90;
-- 查询数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩
select name, math from exam_result where math IN (58, 59, 98, 99);
-- 使用 OR 也可以实现
select name, math from exam_result where math = 58 OR math = 59 OR math = 98 OR math = 99;
-- % 匹配任意多个(包括 0 个)字符
select name from exam_result where name like '孙%';-- 匹配到孙悟空、孙权
-- _ 匹配严格的一个任意字符
select name from exam_result where name like '孙_';-- 匹配到孙权
-- 查询 qq_mail 已知的同学姓名
select name, qq_mail from student where qq_mail is not null;
-- 查询 qq_mail 未知的同学姓名
select name, qq_mail from student where qq_mail IS NULL;

3、修改

sql 复制代码
update 表名 set 列名 = 值 where 条件;

进行修改,要明确一些重要的信息。

  • 改那个表?
  • 改这个表的那个列?
  • 改这个表的那写行?
sql 复制代码
update book set price = 80 where name = '1984';
-- 把book表中的price列中1984这一行改成80
-- 这里面的 = 和上面的查询不一样,是赋值而不是相等

select 支持的各种条件,对于 update 来说也是同样生效的。
update 可以理解为先查后改。

sql 复制代码
update book set price = 0;

update 后面不加其他操作会出现上面??

会把所有的数据都修改掉!!非常非常非常危险!!
【注意】

  • update 是一个非常危险的操作。

多列修改

sql 复制代码
update 表名 set 列名 = 值 ,列名 = 值  where 条件;
sql 复制代码
update book set price = 80, class = '西方小说' where name = '1984';

排序修改

sql 复制代码
update 表名 set 列名 = 列名 + xxx  order by 排序条件 ;
sql 复制代码
update book set price = price - 20 order by price limit 3;
-- 把price最低是三位再减20

4、删除

sql 复制代码
delete from 表名 where 条件;
-- 直接删除符合条件的行
sql 复制代码
delete from book where name = '了不起的盖茨比';

删除是按行来删除的,无法直接删除某些列。

要想删除列,可以通过 update 来更新为 null
select 支持的各种条件,对于 delete 来说也是同样生效的。

如果在 delete的时候没有指定条件,就会把所有的都删除。效果和删表差不多了。

相关推荐
Rookie也要加油23 分钟前
01_SQLite
数据库·sqlite
liuxin3344556628 分钟前
教育技术革新:SpringBoot在线教育系统开发
数据库·spring boot·后端
看山还是山,看水还是。1 小时前
MySQL 管理
数据库·笔记·mysql·adb
fishmemory7sec1 小时前
Koa2项目实战2(路由管理、项目结构优化)
数据库·mongodb·koa
momo小菜pa1 小时前
【MySQL 09】表的内外连接
数据库·mysql
Jasonakeke2 小时前
【重学 MySQL】四十九、阿里 MySQL 命名规范及 MySQL8 DDL 的原子化
数据库·mysql
程序猿小D2 小时前
第二百六十九节 JPA教程 - JPA查询OrderBy两个属性示例
java·开发语言·数据库·windows·jpa
小宇成长录2 小时前
Mysql:数据库和表增删查改基本语句
数据库·mysql·数据库备份
团儿.3 小时前
解锁MySQL高可用新境界:深入探索MHA架构的无限魅力与实战部署
数据库·mysql·架构·mysql之mha架构
程序猿小D3 小时前
第二百六十七节 JPA教程 - JPA查询AND条件示例
java·开发语言·前端·数据库·windows·python·jpa