MySQL 基本用法

本文档详细介绍了MySQL的基础知识,包括数据库系统、数据库管理、MySQL基本命令和操作流程。内容涵盖数据类型、存储引擎、数据完整性、DML与DQL命令,以及联表查询等。
摘要由CSDN通过智能技术生成

MySQL

本系列为本人学习情况记录,部分资料来自老师课件或书籍摘录。


一、基础概念

1.1 实体

实体是客观存在的,可以被描述的事物

1.2 数据

数据是对事物的描述信息

1.3 数据库

数据库是按照数据结构来组织、存储和管理数据的仓库,它是存储在一起的相关数据的集合

1.4 数据库系统

数据库系统是用于描述数据库存储数据的规则

1.5 数据库管理系统

按照数据库系统描述的规则,对数据库中的数据执行管理的程序
在这里插入图片描述

补充: 数据结构

数据结构是互相之间存在一种或多种特定关系的数据元素的集合


二、数据库管理系统

2.1 数据库管理系统需要提供的功能

数据定义功能,提供数据定义语言(DDL);定义数据库对象
数据操作功能,提供数据操作语言;实现数据的CRUD
运行管理数据库
建立维护数据库

2.2 常用的数据库

MySQL、Oracle、MS SQL、Redis

三、MySQL基本命令

命令描述
mysqld --install安装MySQL服务
mysqld --remove删除当前MySQL服务
mysql -h 服务器地址 -P 端口 -u mysql账户 -p 账户密码链接数据库(-p 之后的密码可以不写,直接回车之后根据mysql的提示输入密码,可以保证密码安全不被泄漏)
show databases;查看数据库列表
use 数据库名;使用数据库
show tables;查看当前数据库表格列表
desc 表名;查看表格结构
exit;退出
help;查看帮助
\c放弃正在输入的命令
\h显示命令清单
\q退出MySQL
\s查看MySQL服务器状态信息

四、数据库操作流程

4.1 基本步骤

  1. 创建数据库
  2. 使用数据库
  3. 向数据库中添加表
  4. 给表格命名、编码、注释等
  5. 为表格的列设置名称、数据类型、长度、备注等
  6. 操作表格中的数据

4.2 基本操作(数据库中的关键字不区分大小写):

# 如果由指定的数据库存在,就删除
drop database if EXISTS `HouseSystemDB`;
# 创建新数据库
create database `HouseSystemDB`;
# 使用刚创建的数据库
use `HouseSystemDB`;
# 修改数据库的编码
alter database `HouseSystemDB` default character SET utf8 collate utf8_general_ci;

# 创建一个房东表 - 定义字段时,先书写字段名称,再书写数据类型
create table `Lorder`(
	`id` int,								# 房东编号
	`name` varchar(20),			# 房东名称
	`age` int								# 房东年龄
);

# 向表中插入数据
insert into Lorder (id, `name`, age) values(1, '包租婆', 42);
insert into Lorder (id, `name`, age) values(2, '包租公', 42);

# 查询数据
select * from Lorder;													# 查询Lorder表中的所有列
select * from Lorder where name = '包租公';   # 根据条件查询

# 修改数据
update Lorder set `name` = '星仔', age = 35 where id = 2;

# 删除数据
delete from Lorder where id = 1;

# 排序
select * from Lorder order by id DESC;			# 以id的降序排列
select * from Lorder order by id ASC;				# 以id的升序排序

select * from Lorder;													# 查询Lorder表中的所有列

4.3 MySQL中的数据类型

数值类型

类型字节数取值范围说明
tinyint1字节有符号(-2的7次方 ~ 2的7次方-1)非常小的数据
smallint2字节15较小的数据
mediumint3字节23中等大小数据
int4字节31标准整数
bigint8字节63较大的整数
float4字节单精度浮点数
double8字节双精度浮点数
decimal字符串形式的浮点数

字符串类型

数据类型说明
char[(M)]定长字符串,M为0~255之间的整数(读取该数据时要进行去两侧空格操作)
varchar[(M)]变长字符串,M为0~65535之间的整数,值的长度+1字节
tinyblob允许长度0~255字节,值的长度+1个字节
bolb允许长度0~65535字节,值的长度+2个字节
tinytext允许长度0~255字节,值的长度+2个字节
text允许长度0~65535字节,值的长度+2个字节
varbinary[(M)]允许长度0~M个字节的变长字符串,值的长度+1个字节
binary[(M)]允许长度0~M个字节的变长字符串
  • 在检索的时候,char 列删除了尾部的空格,而 varchar 则保留这些空格
  • binary 和 varbinary 类似于 char 和 varchar,不同的是它们包含二进制字符串而不包含非二进制字符串。当保存 binary 值时,在值的最后通过填充"ox00"(零字节)以达到指定的字段定义长度

日期和时间类型

数据类型字节数格式和取值范围
date3字节1000-01-01~9999-12-31
time3字节-838:59:59~838:59:59
datetime8字节1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
year1字节1901~2155

4.4 MySQL结构中的部分概念

表的列

主要对表格中某一个列信息进行描述
主要由名称、类型、长度、选项、注释等组成

列的属性

属性说明
unsigned无符号的
zerofill用0填充
auto_increment自动增长
null默认为空,不填写
not null不允许为空
default某一列的默认值

常用的存储引擎

(只介绍两种引擎)

功能InnoDBM有ISAM
支持事务支持不支持
支持全文索引不支持支持
外键约束支持不支持
数据行锁定支持不支持
表空间大小较大较小

创建表格并规定属性

drop database if exists `schooldb`;
create database if not exists `schooldb`;

use `schooldb`			# 一定记得先选择数据库再进行操作

drop table if exists `Student`;
create table if not exists `Student`(
`stuId`		int primary key auto_increment		comment '学号',
`loginPwd`	varchar(20) not null				comment '密码',
`studentName`	varchar(50) not null			comment '姓名',
`sex`		char(2)		not null default '男'	comment '性别',
`gradeId`	int		unsigned					comment '年级',
`phone`		varchar(50)							comment '电话',
`address`	varchar(255) default '地址不详'		comment '地址',
`bornDate`	datetime							comment '出生日期',
`identityCard`	varchar(18)	unique				comment '身份证号码'
)engine=innodb charset=utf8mb4 					comment='学生信息表';

drop table if exists `Score`;
create table if not exists `Score`(
`id`		int primary key auto_increment		comment '编号',
`stuId`		int not null						comment '学生学号',
`subjectId`	int not null						comment '学科编号',
`examDate`	datetime default now()				comment '考试日期',
`score`		double 								comment '考试成绩'
)engine=innodb charset=utf8mb4 					comment='学生成绩表';

drop table if exists `Grade`;
create table if not exists `Grade`(
`GradeId`	int(4) primary key auto_increment 	comment '年级编号',
`GradeName`	varchar(50) not null 				comment '年级名称'
)engine=MyISAM;

drop table if exists `Subject`;
create table if not exists `Subject`(
`SubjectID`	int(4) primary key auto_increment	comment '科目编号',
`SubjectName` varchar(50)	not NULL			comment '科目名称',
`GradeID`	int(4)								comment '所属年级编号',
`Hours`		tinyint(4)							comment '学时'
)engine=MyISAM;

图为Student表

4.5 使用数据库操作语句执行数据库操作

数据库操作语句

简称DDL,Data Definational Language
主要负责对数据结构的处理,数据库、数据表、以及表中的列

4.5.1 数据库创建
create database if not exists `t15_stu`;
4.5.2 删除数据库
drop database if exists `t15_stu`;
4.5.3 使用数据库
use `t15_stu`;
4.5.4 修改数据库
alter database `t15_stu` default charset utf8 collate utf8_general_ci;
4.5.5 数据库导出
mysqldump -uroot -p -d t15_student > t15_student_structure.sql
4.5.6 数据库导入
mysql -uroot -p t15_student < t15_student.sql
4.5.7 删除表结构
drop table if exists `student`;
4.5.8 表结构修改
# 修改表的名称
alter table `Grade` rename `NewGrade`;	
# 为表添加字段
alter table `NewGrade` add `StuCount` int not null;
# 修改字段
alter table `Subject` modify `hours` int;
# 修改字段(修改字段的名称和数据类型)
alter table `Subject` change `GradeId` `GradeNo` bigint;
# 删除字段
alter table `NewGrade` drop `StuCount`;
select * from `NewGrade`;

五、数据的完整性

5.1 概念

数据的完整性包括数据的准确性和可靠性
数据库完整性是指数据库中数据在逻辑上的一致性、正确性、有效性和相容性。数据库完整性由各种各样的完整性约束来保证,因此可以说数据库完整性设计就是数据库完整性约束的设计。数据库完整性包括以下几种形式:

  • 实体完整性:主键约束(PRIMARY KEY) 、唯一约束(UNIQUE KEY) 、标识列(AUTO_INCREAMENT)
  • 域完整性:检查约束(CHECK)、数据类型、默认值(DEFAULT)、非空约束(NOT NULL)、外键约束(FOREIGN KEY)
  • 引用完整性:外键约束
  • 自定义完整性:存储过程、触发器
    添加约束:
# 一般情况下,建议创建表时,不要添加主键及外键约束
# 如果要修改表中原本的主键,需要四步 - 了解即可
# 1. 删除自增
alter table `Student` change `stuId` `stuId` int;
# 2. 删除主键约束
alter table `Student` drop primary key;
# 3. 重新设置主键约束
alter table `Student` add constraint PK_stuNo primary key (stuId);
# 4、重新添加自增
alter table `Student` auto_increment=0;

# 为字段添加唯一约束
alter table `Student` add constraint uq_mobile unique (mobile);

# 添加默认值约束
alter table `Student` alter column `email` set default '默认电子邮件';

# 添加检查约束
alter table `Student` add constraint ck_name check (len(name) < 15);

# 添加外键约束 主表-学生信息表;子表-成绩表
select * from score;
insert into score values(default, 10, 1, now(), 98);
truncate table score;

alter table `Score` add constraint fk_stuid 
	foreign key (stuId) references `Student`(`stuId`);

复合主键

一个表可以不只有一个主键,可以有多个主键,通过这几个主键一起来确定一条记录,那么这几个主键组成的就是复合主键

primary key(id, name)

六、DML命令操作数据

插入数据
插入数据时,单行插入为一个事务,插入失败会进行回滚
多行插入也只作为一个事务,如果有其中一条失败,就会全部回滚

# 插入单行数据
insert into 表名 (字段) values();
# 插入多行数据

删除数据
删除数据时,一定要注意条件,大多数情况下不加条件直接删除都是面向监狱编程!!!!!
删除数据时,不会影响自增列的当前值
清空表时,会将自增列置默认值

# 删除单条数据
delete from 表名 [where <删除条件>];
# 清空表
truncate table 表名;

更新数据

update 表名 set 列名 = 更新值 [where 更新条件];

七、DQL命令查询命令

常用函数

字符串函数

# 返回字符串字节数;一个中文占3个字节		UTF8mb4中占4个字节
length('老九学堂');
# 返回字符串字符数
char_length('老九学堂');
# 返回下标(从1开始)
position('老' in '老九学堂');
# 大小写转换
lower('WE r FAMILY');
upper('WE r FAMILY');
# 去掉两侧空格
ltrim(rtrim('      abc      '));
trim('      abc      ');
# 返回起始与结束
left('小荷才露尖尖角', 2);
right('小荷才露尖尖角', 3);
# 字符串替换
replace('小荷才露尖尖角尖尖', '尖尖', '顿顿');
# 字符串插入、替换或删除
insert('小荷才露尖尖角', 3, 0, '方便面');
insert('小荷才露尖尖角', 4, 7, '方便面');
insert('小荷才露尖尖角', 3, 4, '');
# 字符串截取
substring('小荷才露尖尖角', 4, 3);
substring('小荷才露尖尖角' from 4 for 3);
substring('小荷才露尖尖角', 4);
# 字符串反转
reverse('小荷才露尖尖角');
# 字符串拼接
concat(11, 'asd', 'asdf23');

时间函数

# 当前日期
now();
# 日期加减
date_add(now(), interval 30 year);
date_add(now(), interval -30 year);
# 返回某日期是该月的第几天
dayofmonth(now());
# 计算日期之差
datediff(now(), '1949-10-1');
# 日期加减,返回对应的年/月/日
timestampdiff(year, now(), '1949-10-1');
timestampadd(year, 10, '1949-10-1');
# 日期格式
date_format(now(), "%y-%m-%d");

数学函数

# 取绝对值
abs(-888);
# 取整
ceiling(2.1);
floor(-4.9);
# 次方
pow(2, 3);
# 随机数
rand();
# 四舍五入
round(1.3)

类型转换

cast('88.3' as decimal);
convert('88.38', decimal);

聚合函数

# 返回最大值
max();
# 返回最小值
min();
# 返回平均数
avg();
# 返回总和
sum();
# 返回数量
count();

基本查询

全部语法
SELECT
    [ALL | DISTINCT | DISTINCTROW ]
    [HIGH_PRIORITY]
    [STRAIGHT_JOIN]
    [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
    [SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
    select_expr [, select_expr] ...
    [into_option]
    [FROM table_references
      [PARTITION partition_list]]
    [WHERE where_condition]
    [GROUP BY {col_name | expr | position}, ... [WITH ROLLUP]]
    [HAVING where_condition]
    [WINDOW window_name AS (window_spec)
        [, window_name AS (window_spec)] ...]
    [ORDER BY {col_name | expr | position}
      [ASC | DESC], ... [WITH ROLLUP]]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]
    [into_option]
    [FOR {UPDATE | SHARE}
        [OF tbl_name [, tbl_name] ...]
        [NOWAIT | SKIP LOCKED]
      | LOCK IN SHARE MODE]
    [into_option]

into_option: {
    INTO OUTFILE 'file_name'
        [CHARACTER SET charset_name]
        export_options
  | INTO DUMPFILE 'file_name'
  | INTO var_name [, var_name] ...
}

select <列名|表达式|函数|常量> from <表名>
[where <查找条件>]
[order by <排序的列名>[ASCDESC]];

# 查询整张表
select * from 表名;
# 查询某列
select <列名> from 表名;
# 按条件查询
select <列名> from 表名 where <条件>;
# 别名
select <列名> as <别名> from 表名;

模糊查询

在这里插入图片描述

分组查询

select field... from TableName
[where ...]
[order by ...]
[group by field1, field2...]
[having ...]

注意:

  • select 后面出现聚合函数和普通列名的情况下,一定是使用分组查询,将普通列明分组
  • having 通常和聚合函数搭配使用

八、联表查询

内联接

select field... from `tablename`
inner join `tablename`
[on...]
[where...]

外联接

select field... from `tablename`
left join `tablename` on ...
[where...]

区别:

  • 内联接可以没有on条件;外联接必须有on条件
  • 内联接中子表没有的数据行会直接忽略;外联接中子表没有的数据行也会强制显示,并输出null

子查询

在这里插入图片描述
在这里插入图片描述

合并

  • 使用union 时,完全相等的行,将会被合并
  • 而使用union all时,不会合并

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值