首页 > 数据库 >MySQL数据库基础笔记

MySQL数据库基础笔记

时间:2024-03-17 17:34:23浏览次数:20  
标签:数据库 表名 笔记 alter user MySQL table 主键

MySQL数据库

sql语句分类

分类 全称 说明
DDL 数据库定义语言,用来定义数据库(数据库,表,字段)
DML 数据操作语言,用来对数据表中的数据进行增删改
DQL 数据查询语言,用来查询数据库中的表的记录
DCL 数据控制语言,用来创建数据库、控制数据库的访问权限

DDL语句

DDL操作数据库

查询:

查询所有数据库:

SHOW DATABASES;

查询当前数据库:

select database();

创建:

create database [if not exists]数据库名 [default charset 字符集] [collate 排序规则];(字符集用utf8mb4)长度为4个字节

删除:

drop database [if exists] 数据库名;

使用:

use 数据库名;

查询当前数据库所有表:

show tables;

查询表的结构:

desc 表名;

查询指定表的建表语句:

show creata table 表名;

创建数据表:

create table 表名(
		字段1 类型[comment 字段注释],
		字段2 类型,
		字段3 类型,
		......
		字段n 类型
)[comment 表注释];

DDL-数据类型

MySQL中数据类型很多,主要分为3类:数值型、字符串型、日期时间类型

数值类型

MySQL 支持所有标准 SQL 数值数据类型。

这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL 和 NUMERIC),以及近似数值数据类型(FLOAT、REAL 和 DOUBLE PRECISION)。

关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。

BIT数据类型保存位字段值,并且支持 MyISAM、MEMORY、InnoDB 和 BDB表。

作为 SQL 标准的扩展,MySQL 也支持整数类型 TINYINT、MEDIUMINT 和 BIGINT。下面的表显示了需要的每个整数类型的存储和范围。

类型 大小 范围(有符号) 范围(无符号) 用途
TINYINT 1 Bytes (-128,127) (0,255) 小整数值
SMALLINT 2 Bytes (-32 768,32 767) (0,65 535) 大整数值
MEDIUMINT 3 Bytes (-8 388 608,8 388 607) (0,16 777 215) 大整数值
INT或INTEGER 4 Bytes (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
BIGINT 8 Bytes (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
FLOAT 4 Bytes (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度 浮点数值
DOUBLE 8 Bytes (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度 浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值

日期和时间类型

表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。

每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。

TIMESTAMP类型有专有的自动更新特性,将在后面描述。

类型 大小 ( bytes) 范围 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 '-838:59:59'/'838:59:59' HH:MM:SS 时间值或持续时间
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59' YYYY-MM-DD hh:mm:ss 混合日期和时间值
TIMESTAMP 4 '1970-01-01 00:00:01' UTC 到 '2038-01-19 03:14:07' UTC结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 YYYY-MM-DD hh:mm:ss 混合日期和时间值,时间戳

字符串类型

字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。

类型 大小 用途
CHAR 0-255 bytes 定长字符串
VARCHAR 0-65535 bytes 变长字符串
TINYBLOB 0-255 bytes 不超过 255 个字符的二进制字符串
TINYTEXT 0-255 bytes 短文本字符串
BLOB 0-65 535 bytes 二进制形式的长文本数据
TEXT 0-65 535 bytes 长文本数据
MEDIUMBLOB 0-16 777 215 bytes 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215 bytes 中等长度文本数据
LONGBLOB 0-4 294 967 295 bytes 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295 bytes 极大文本数据

注意:char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符。

CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。

char(10)最多只能放十个,不满十个用空格补全,性能较好,定长字符(空间换时间)

varchar(10)最多只能放10个,存储一个字符只占一个字符,性能较差,边长字符在使用过程中需要计算长度,(时间换空间)

BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。

BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。

有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。

易错
  1. 列名应该在类型之前,不需要使用单引号: 列名(例如'编号','员工工号')应该在类型(例如 INT,VARCHAR)之前,而且不需要使用单引号。
  2. CHAR 类型的长度不需要指定为 1: 当使用 CHAR 类型时,不需要指定长度为 1。如果你希望性别只存储一个字符,可以保留 CHAR 类型而不用指定长度。
  3. UNSIGNED 关键字放在 INT 后面: 如果你希望年龄是无符号整数,应该将 UNSIGNED 放在 INT 后面。
  4. 去掉最后一个逗号: 列定义的最后一个后面不需要逗号。

这个修改后的语句应该能够正确创建一个名为 renshi 的员工表。

MySQL中的主键

主键的定义

主键:表中经常有一个列或多列的组合,其值能唯一地标识表中的每一行。这样的一列或多列称为表的主键,通过它可强制表的实体完整性。当创建或更改表时可通过定义 PRIMARY KEY 约束来创建主键。一个表只能有一个 PRIMARY KEY 约束,而且 PRIMARY KEY 约束中的列不能接受空值。由于 PRIMARY KEY 约束确保唯一数据,所以经常用来定义标识列。

use scholldb;
create table student(
学号 char(10) not null primary key, //设置主键为学号,且是唯一主键
姓名 char(10) not null
);
联合主键

关系数据库实际上还允许通过多个字段唯一标识记录,即两个或更多的字段都设置为主键,这种主键被称为联合主键。对于联合主键,允许一列有重复,只要不是所有主键列都重复即可。

use scholldb;
create table student(
学号 char(10) not null ,
课程号 char(10) not null ,
成绩 float(5,2) ,
primary key(学号,课程号)   //联合外键为学号课程号
);
查询表中主键的命令:desc (表名);

MySQL中外键

保持数据的一致性、完整性。在一个库中使用多表中的主键定义一个外键,保持数据的完整性。

引用全部在一个表时数据太多太杂,所以拆为多个表,在表中设置唯一关字,然后作为表的主键,作为其他表的外键,当多表联合查询时作为关键字段

为了一张表记录的数据不要太过冗余。这和软件project的模块化思想差点儿相同类似,仅仅只是在数据库中是对表关系进行解耦,尽量让表 记录的数据单一化。假如一张学生表中把成绩和学生信息放在一张表中就太冗余了,成绩全然能够以学生的id作为区分标识。

列:在一个数据库中定义A表的外键来自B表中的C字段,此时A表作为B表的父表

创建表时创建外键
[CONSTRAINT <外键名>] FOREIGN KEY 字段名 [,字段名2,…]
REFERENCES <主表名> 主键列1 [,主键列2,…]
//
1、
create table student(
学号 char(11) not null foreign key,   
//在定义主键时添加外键。(在添加外键约束之前,必须确保引用表中的主键列已经定义)
姓名 char(10) not null 
);

2、
FOREIGN KEY(deptId) REFERENCES tb_dept1(id)
create table student(
学号 char(11) not null,
姓名 char(10) not nll,
foreign key (学号) references course(学号)
//创建数据表student,并在表student上创建外键约束,让它的键 学号 作为外键引表到 course表中 的学号字段
);
对已有表创建外键

单个主键

ALTER TABLE student
ADD FOREIGN KEY (班级编号) REFERENCES class(班级编号);
//将表student中的班级编号字段作为外键引用class中的班级编号作为主键

多个主键

alter table score
add foreign key (学号) references student(学号),
add foreign key (课程号) references student(课程号);

check完整性约束

Check完整性约束是一种用于限制表中数据值的约束。它定义了一个条件,该条件必须在插入或更新数据时得到满足。如果数据不符合约束条件,操作将被拒绝并抛出错误。

通过使用Check完整性约束,可以确保表中的数据满足特定的条件,例如范围、数据类型、格式等。这样可以防止非法或无效的数据进入表中,提高数据的准确性和一致性。

以下是创建Check完整性约束的一般语法:

ALTER TABLE 表名称
ADD CONSTRAINT 约束名称 CHECK (条件);

其中,"表名称" 是要添加约束的表名,"约束名称" 是约束的名称(可以自定义),"条件" 是定义约束的条件表达式。

数据插入

INSERT...VLAUES语句
insert into 表名 vlaues (值);
insert into 表名(字段1,字段2,) values(值1,值2);
REPLACE INSERT语句

此语句的作用是当我们在插入一条数据时,如果此条已经存在,那么先删除原来存在的数据再添加插入的数据,如果不存在那么直接插入新的数据。注意:却分是否存在是通过主键来确定的

replace into 表(字段) values(值);
INSERT IGNORE INTO 语句

此语句的作用是如果插入的数据已经存在那么就忽略插入的数据(也就是不改变原来的数据),如果不存在则插入新的数据。注意:却分是否存在是通过主键来确定的

insert ignore into 表(字段) values (值);
set插入

知道部分值插入数据,插入已知值,其他值为空(主键不能为空)

insert into 表 set 字段1=‘值1’ , 字段2=‘值2’ ...  ;
传递参数

MySQL中的limit

约束行数,输出约束行

其次第一行的量为0,而不是1

SELECT 字段名 FROM 表名 LIMIT offset , 列数;

mysql 中的concat函数

作用:将多个字符串连接成一个字符串

concat (str1 , str2, ...) ;
SELECT CONCAT(地区, '省或市') FROM student;  #不添加新列查看
select concat(地区,'省或市')as 新列名 from student ; #添加新列查看
UPDATE student SET 地区 = CONCAT(地区, '省或市');  # 直接更改数据

MySQL中数据更新/修改

只改想改的数据:

update 表名 set 字段名=值 where 条件子句;

update student set 出生日期='1998-02-10' where id = 1;
#在表student中把id=1的记录字段为出生日期的数据改变为1998-01-10
修改全部数据:
update 表名 set 字段名1=值1,字段名2=值2...,字段名n=值n;

#对于NULL不能用=符号,要用is null
修改表结构:

alter table 表名 修改的动作语法

列:alter table 表名 modify 字段名 数据类型 ; 
列:aller table student modify 姓名 varchar(20) not null ;
#修改student 中的姓名列的数据类型为varchar(20) 并设置为不允许包含空值

修改数据类型:

alter table 表名 modify 字段 新数据类型;
alter table c1 modify name varchar(20) not null;

修改字段名:

alter table 表名 change 旧字段名 新字段名 新数据类型;
alter table c3 change name name1 varchar(30) not null

修改表之增加主键:

alter table 表名 add constraint 约束名字 约束类型[字段];
alter table c5 add constraint PK_c5_id primary key(id);   

说明:PK_c5_id是约束名(指定主键约束为PK_c5_id,对大部分数据库有效但对于MySql无效,此主键约束名仍为primary)
在建表时给主键个性化名字较好

修改表名:

rename table 旧表名 to 新表名;
rename table c5 to cc55;

建表后添加唯一性约束:

alter table 表名 add unique(字段名)

alter table c9 add unique(id);

建表后添加默认值约束:

alter table 表名 alter 列名 set default’默认值’;

alter table c11 alter name set default “欧”;

建表后添加非空约束:

alter 表名 modify 字段名字段类型not null;

alter table c12 modify id int not null;

建表以后添加外键:

alter table 表名称 add foreign key (列名称) references关联表名称(列名称);

alter	table stuInfo add foreign key (scode) references score(studentID);

MySQL中的数据删除

Mysql删除表中的数据有三种方法,分别是delete ,drop,truncate

delete删除数据
delete from 表名 where 条件

一行一行的删除,可以滚动,删除 之后不释放空间,保留表的数据结构

列:delete from student where 出生日期<1997-01-01
drop删除数据
drop table 表名

直接删除全部删除,不可找回,删除完之后释放空间

truncat删除数据
truncate table 表名

删除表的所有数据,删除完之后释放空间,保留数据结构不可以回滚,不可以找回,不能与where连用

mysql中的数据查询

单表查询

选择表中的若干列

指定查询

select 列1,列2...form 表名;

经过计算的查询

MySQL中的视图

什么是视图:一个虚拟表,主要是select语句执行返回的结果集。视图结果动态生成主要是sql语句执行结果与联合,基于查询结果。

视图的创建

语法:create view 视图名 [列表名] as select 语句

MySQL数据库用户管理

添加和删除用户

创建用户
create user 用户名 identified by '密码';

添加一个新用户user密码为root

IDENTIFIED BY 用于设定密码,MySQL 会先将密码进行加密,在将其保存到 user 表

列:create user 'user'@'localhost' identified by 'root';
查看当前已有用户

MySQL 中所有的用户及权限信息都存储在默认数据库 mysql 的 user 表中。

进入 mysql 数据库,通过 desc user; 可以查看 user 表的结构。

use mysql;
desc user;    //查看user表的结构

host: 允许访问的主机地址,localhost 为本机,% 为任何主机。

user: 用户名

authentication_string: 加密后的密码值,哈希函数加密不可逆,在传入密码值时通过相同的加密方式加密对比加密值判断

使用 select * from user; 查看 user 表中当前有哪些用户。

select host,user,authentication_string from user;
账号重命名
rename user 原来用户名 to 新的用户名;

仅 MySQL 5及之后的版本支持 RENAME USER
MySQL 5以前的版本,要重命名一个用户,可使用 UPDATE 直接更新 user 表(谨慎操作)。

修改密码
set password for 用户= password('password');

可以使用 SET PASSWORD 语句重置账号密码。

使用 SET PASSWORD 重置账号密码。新密码必须通过 Password() 函数进行加密。

当不指定用户名时, SET PASSWORD 会重置当前登录用户的密码

SET PASSWORD = Password('password');
删除用户

drop user 用来删除一个或多个MySQL用户,并取消相关权限

Drop user 用户1,用户2,... ;

删除用户user

drop user user@localhost;

权限管理

用户认证

形式:

用户名+主机  远程主机也可链接
授权
grant [权限1,权限2,权限3] on *.* to user@'host' identified by 'password';
查看当前权限
show grants;

查看指定用户的权限

show grants for admin@localhost; 

标签:数据库,表名,笔记,alter,user,MySQL,table,主键
From: https://www.cnblogs.com/yuell/p/18078850

相关文章

  • 滴水逆向笔记系列-win32总结10-63.IAT HOOK-64.Inline HOOK
    第六十三课IATHOOK这节课得把前面PE部分的IAT表复习好,再来做就简单多了1.IATHOOK是什么其实就是找到IAT表的位置再换成自己定义的函数,只是我们替换的函数需要和原函数的结构保持一直,比如我们要HOOKMessagebox函数,那么我们需要定义一个MyMessagebox函数,他的结构应该与Messa......
  • 2.Datax数据同步之Windows下,mysql和sqlserver之间的自定义sql文数据同步
    目录前言步骤操作大纲步骤明细mysql至sqlServersqlServer至mysql前言上一篇文章实现了不同的mysql数据库之间的数据同步,在此基础上本篇将实现mysql和sqlserver之间的自定义sql文数据同步准备工作:JDK(1.8以上,推荐1.8)Python(2或3都可以)ApacheMaven3.x(Co......
  • Java学习笔记:字符串
    Java学习笔记:字符串Java学习笔记:字符串String创建String对象内存模型String比较Scanner验证键入的字符串本质是new出来的练习案例:判断账户和密码是否一致遍历字符串统计字符次数字符串反转StringBuilderStringBuilder构造方法链式编程拼接字符串StringJoiner总结必须......
  • 滴水逆向笔记系列-win32总结7-57.进程创建-58.挂起方式创建进程
    第五十七课win32进程创建1.进程创建的过程父进程创建子进程,父进程挂了子进程不会挂0x00程序、imagebuffer、进程的关系程序就是一个普通的二进制文件;imagebuffer就是程序拉伸到内存后的二进制文件,但是没有线程去执行他,进程则是有线程去运行这个imagebuffer0x01过程......
  • MySQL-03.用户管理和权限管理
    1.用户管理MySQL用户可以分为普通用户和root用户。root用户是超级管理员,拥有所有权限,包括创建用户、删除用户和修改用户的密码等管理权限。普通用户只拥有被授予的各种权限。MySQL提供了很多语句用来管理用户账号,这些语句可以用来管理包括登录和退出MySQL服务器,创建用户,删除用......
  • Tensorflow笔记(一):常用函数、张量操作、神经网络模型实现(鸢尾花分类)
    importpandasaspdimporttensorflowastfimportnumpyasnp#-----------------------------tensor张量-----------------------------------#创建张量a=tf.constant([1,5],dtype=tf.int64)print(a)#>tf.Tensor([15],shape=(2,),dtype=int64)#结果......
  • 使用JDBC查询数据库会一次性加载所有数据吗
    前几天有个小伙伴说他有个疑问:当我们发起一个查询的时候,数据库服务器是把所有结果集都准备好,然后一次性返回给应用程序服务吗(因为他们生产有个服务因为一个报表查询搞宕机了)。这样想的原因很简单,假设那个报表查询出来有几百万数据,然后一次性倾泻给应用程序了,应用没那么大内存空......
  • 在CentOS7中安装MySQL8.3.0
    MySQLCommunityServer官网:https://dev.mysql.com/downloads/mysql基础架构及系统版本:x86_64,CentOSLinuxrelease7.9.2009(Core)yum包路径:/var/cache/yum/x86_64/7/base/packagesmariadb的库:mariadb-libsrpm-ivh:installverbose(冗长)hash(哈希)——可视化。查看mysql服务......
  • 数据结构笔记(十四)二叉树的遍历(递归)
    四种访问方式:前序遍历,中序遍历,后序遍历,层序遍历这篇文章主要为前序,中序,后序遍历的递归形式,递归形式较为简单,后面更新遍历的循环形式较为复杂,建议使用递归形式#include<stdio.h>#include<stdlib.h>typedefcharE;typedefstructTreeNode*Node;structTreeNod......
  • 《A ConvNet for the 2020s》阅读笔记
    论文标题《AConvNetforthe2020s》面向2020年代的ConvNet作者ZhuangLiu、HanziMao、Chao-YuanWu、ChristophFeichtenhofer、TrevorDarrell和SainingXie来自FacebookAIResearch(FAIR)和加州大学伯克利分校初读摘要“ViT盛Conv衰”的现状:视觉识......