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 类型,可存储的最大长度不同,可根据实际情况选择。
易错
- 列名应该在类型之前,不需要使用单引号: 列名(例如'编号','员工工号')应该在类型(例如 INT,VARCHAR)之前,而且不需要使用单引号。
- CHAR 类型的长度不需要指定为 1: 当使用 CHAR 类型时,不需要指定长度为 1。如果你希望性别只存储一个字符,可以保留 CHAR 类型而不用指定长度。
- UNSIGNED 关键字放在 INT 后面: 如果你希望年龄是无符号整数,应该将 UNSIGNED 放在 INT 后面。
- 去掉最后一个逗号: 列定义的最后一个后面不需要逗号。
这个修改后的语句应该能够正确创建一个名为 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