【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的时候没有指定条件,就会把所有的都删除。效果和删表差不多了。

相关推荐
齐 飞6 分钟前
MongoDB笔记01-概念与安装
前端·数据库·笔记·后端·mongodb
云空7 分钟前
《Python 与 SQLite:强大的数据库组合》
数据库·python·sqlite
暮毅11 分钟前
10.Node.js连接MongoDb
数据库·mongodb·node.js
wowocpp14 分钟前
ubuntu 22.04 server 格式化 磁盘 为 ext4 并 自动挂载 LTS
服务器·数据库·ubuntu
成富37 分钟前
文本转SQL(Text-to-SQL),场景介绍与 Spring AI 实现
数据库·人工智能·sql·spring·oracle
songqq2738 分钟前
SQL题:使用hive查询各类型专利top 10申请人,以及对应的专利申请数
数据库·sql
计算机学长felix41 分钟前
基于SpringBoot的“校园交友网站”的设计与实现(源码+数据库+文档+PPT)
数据库·spring boot·毕业设计·交友
小码的头发丝、1 小时前
Django中ListView 和 DetailView类的区别
数据库·python·django
小兜全糖(xdqt)2 小时前
mysql数据同步到sql server
mysql·adb
Karoku0662 小时前
【企业级分布式系统】Zabbix监控系统与部署安装
运维·服务器·数据库·redis·mysql·zabbix