MySQL基础(一)

时间:2026-09-16 16:35:04 来源:幸福记忆 作者:远方 阅读:63

一、mysql概述

mysql是一个关系型数据库,与sql server、oracle等类似。   web开发黄金搭档:  

  • wamp(windows,apache,mysql,php)  

  • lamp(linux,apache,mysql,php)

mysql早期是由瑞典的一家公司开发,现在被oracle收购,所以一部分的功能进入商业化。   mysql出现了两种版本商业版,社区版。mariadb与mysql类似,在linux服务器上默认支持mariadb。 mysql版本: 5.5,5.6,5.7,8.0+

二、mysql的市场占有率

https://db-engines.com/en/ranking

三、开源的理解

GPL(Copyleft):    该协议具有传染性,如果基于GPL协议发布的软件做了多次修改后,再次发布,要求也必须开源。   MIT:    协议保护你任意使用这个软件的权力,你可以修改后闭源,也可以售卖这个软件,怎么都可以,但是要是因为使用软件出现任何损失,作者概不负责。  

四、mysql的三层架构

一层:   大多数基于网络的工具或服务都有类似架构。用于处理连接,授权,安全等。  

二层:   包含了大多数Mysql的核心服务功能,包括查询解析、分析、优化、缓存以及所有的内置函数(日期,时间,数学和加密函数),所有跨存储引擎的功能都在这一层实现:存储过程、触发器、视图等。【值得注意的是,为了保证更快的响应及更好的扩展,在开发中尽量不要设置存储过程,触发器,视图等】  

三层:   包含了存储引擎。存储引擎负责MySQL中数据的存储和提取,类似于文件系统负责数据的真正存储。服务器通过API与存储引擎进行通信,这些接口屏蔽了不同存储引擎之间的差异,使得这些差异对上层的查询过程透明。【因为InnoDB对事务的支持以及良好的读写速度,所以在项目中一般使用InnoDB引擎】

五、SQL(Structured Query Language)

称为结构化查询语言。SQL主要应用于关系型数据库,具有通用性。  

1、专业术语(DBMS)

数据库: 数据库是一些关联表的集合。   数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。   列: 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。   行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。   冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。   主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。   外键:外键用于关联两个表。   复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。   索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。   参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。

2、数据类型

  1. 数值型

类型字节数用途
tinyint1小整数
smallint2大整数
mediumint3大整数
int4大整数
bigint8极大整数
float4单精度浮点
double8双精度浮点
decimaldecimal(M,D)小数值
  1. 日期时间

类型大小格式
date3YYYY-MM-DD
time3HH:MM:SS
year1YYYY
datetime8YYYY-MM-DD HH:MM:SS
timestamp4YYYYMMDD HHMMSS
  1. 字符串

类型大小用途
char0-255定长字符串
varchar0-65535变长字符串
text0-65535长文本型

3、数据库管理语句

  1. 数据库操作  

查看所有数据库

show databases;

创建数据库

create database 数据库名称 charset=utf8;

查看数据库创建时的详情

show create database `数据库名称`;

删除数据库

drop database 数据库名称

修改数据库编码

alter database `数据库名` charset=utf8;

注意:要修改数据库名称,只能删库重建.  

选择当前要操作的数据库

use `数据库名`

2. 表管理  

查看表

show tables

创建表

create table if not exists `表名`(
 字段名 类型(长度) 属性...,
 ...
)engine=innodb charset=utf8;

案例:创建用户表

create table if not exists `users`(
   -> uid int(10) auto_increment primary key comment'用户id',
   -> name varchar(30) not null default'',
   -> phone char(11) not null default'',
   -> email varchar(50) not null default'',
   -> regist_time datetime,
   -> card char(18) not null default''
   -> )engine=innodb charset=utf8;

--说明:   if not exists: 表不存在则创建,存在则忽略。   auto_increment:自增   primary key:主键(索引)---不能重复,不能为空   comment:设置备注   not null: 不允许为空   default: 默认值   engine: 表的存储引擎  

查看建表详情

show create table `表名`;
desc 表名;  #查看表结构

修改表名

alter table `old name` rename to `new name`;
alter table 表名 charset=utf8;  #修改表字符集

删除字段

alter table 表名 drop 字段名;

添加字段

alter table 表名 add 字段名 字段属性... [first|after] 字段;

修改字段

alter table 表名 change 旧字段 新字段 新字段属性;
alter table 表名 modify 字段 属性;  ##修改字段属性

删除表

drop table 表名;


3. 数据管理  

添加数据

insert into 表名 (字段列表) value (值列表);
例如:
insert into classes (`cid`,`cname`) value (1,'大数据1班');

说明:
 字段列表与值列表一一对应
-----------------------------------------------------------

insert into 表名 value (值列表);
例如:
insert into classes value (2, '大数据2班');

说明:
 如果插入的数据包含了所有字段,则字段列表可以不写。
 但是值列表顺序必须参照表字段顺序。
-----------------------------------------------------------

批量插入:
insert into 表名 values (值列表1),(值列表2)...;
例如:
insert into classes values (null, '人工智能1班'),
 (null, '人工智能2班'),(null, '人工智能3班'),
 (null, '软件开发1班');

数据查询

select 字段列表 from 表名
例如:
select cid,cname from `classes`;
说明:
 如果要查询所有字段,可以使用*表示匹配所有字段。
 select * from `classes`;
 但是在实际工作中,不推荐使用。应尽量列举需要的字段。
--------------------------------------------------------
完整语法结构:
select 字段列表
from 表
where 条件
group by 字段,分组
having 条件,与group by子句成对出现
order by 字段 [ASC/DESC],排序ASC正序(默认值),DESC倒排序
limit n,m   n起始下标,m查询条数; limit m  m显示条数

删除数据

delete from 表名 where 条件;
说明:
条件必须要加,否则会导致全表删除。该删除为物理删除。
-------------------------
擦除表:
truncate 表名;

修改数据

update 表名 set 修改的字段列表 where 条件;
 ----------------------
案例:将cid为6的班级名改为大数据3班
update classes set cname='大数据3班' where cid=6;
  1. SQL语句分类  

  • DQL: 数据查询语言(select)

  • DML: 数据操作语言(insert,update,delete)

  • DDL: 数据定义语言(create,alter...)

  • DCL: 数据控制语言(权限分配...)

  1. 常用子句

  • where

表示条件筛选  

  • 基本句式

select field1,field2... from table1,table2...
[where 条件1 or|and 其他条件]
  • 运算符

>  大于   <  小于   \=  等于   !=,<> 不等于   >= 大于等于   <=  小于等于   <=> 等于,可用于比较空值,相等返回1,否则返回0  

  • like

用法:   1、like可以在条件筛选中表示模糊匹配。

#匹配姓张的同学
select * from student_info where std_name like '张%';
说明:
 %----匹配任意多个字符
 _----匹配1个字符

2、用于表的复制或创建

#复制student_info表的结构到新表student_info_bak
create table `student_info_bak` like `student_info`;

#将student_info的表数据备份到student_info_bak1
create table student_info_bak1 select * from student_info;
  • between...and

表示范围:  

#查找sid在3-6之间的记录
select * from student_info where sid between 3 and 6;
  • in(,,)

表示包含  

#查找sid是3,6,8的信息
select * from student_info where sid in(3,6,8);
  • group..by

分组:分组后,只会显示每组中的第一条记录。  

select * from student_info group by cid;
  • order..by

表示排序  

#根据出生日期正序排列
select * from student_info order by std_birth asc;
  • limit

表示限定: limit m;  limit n,m     n表示起始位置,m表示条数

#查询年龄最大的学生信息
select * from student_info order by std_birth asc limit 1;

#从第5条数据开始查询5条记录
select * from student_info limit 4,5;
  • union

连接多表查询,使用unioin查询会自带去重操作,如果不需要去重则可以使用 union all

select * from student_info
   -> union all
   -> select * from student_info_bak;
  • 多表联查

[left|right|inner] join on

  • inner join

内连接查询,在两个关联表中都有对应数据时显示。

#内连接查询: 表1 inner join 表2 on 关联条件
select * from student_info join classes on student_info.cid=classes.cid;
#多表查询
select * from student_info,classes where student_info.cid=classes.cid;
  • left|right join

主表 left join 附表 on 连接条件 左连接;
附表 right join 主表 on 连接条件 右连接;
-------
说明:
   主表的数据会全部显示,附表中如果没有对应数据时显示为null。
   通常小表作为主表大表作为附表。
  • null处理

在对空值做判断时,不应使用“=”,而应该使用 is null 或者 is not null   is null 为空则返回true   is not null 不为空则返回true   也可以使用“<=>”判断空值

#查询出表中cname不为空的所有记录
select * from test_cls where cname is not null;
  1. mysql中的正则

与java中正则的元字符类似  

#匹配以“人工智能”开头的所有记录
select * from test_cls where cname regexp '^人工智能.+';