MySQL数据库基础

发布于 2022-12-28  82 次阅读


数据库

数据库连接操作

 mysql -u root -p
host可选。规定主机名或 IP 地址。
username可选。规定 MySQL 用户名。
password可选。规定 MySQL 密码。
dbname可选。规定默认使用的数据库。
port可选。规定尝试连接到 MySQL 服务器的端口号。
socket可选。规定 socket 或要使用的已命名 pipe。

退出数据库

 exit

create database 创建数据库

登录数据库后,可以使用create创建数据库

 create database <数据库名>;
 create database mydb;
 create database mydb charset utf8; --字符集是utf-8

drop database 删除数据库

使用drop命令删除数据库

 drop database <数据库名>;
 --删除mydb数据库
 drop database mydb;

use 选择数据库

 use <数据库名>;
 --选择mydb数据库
 use mydb;

show databases 查看数据库

 --查看所有数据库
 show databases;
 ​
 --查看mydb数据库
 show create database mydb;

数据表操作

create table 创建数据表

 create table <表名>(
  <字段名1> <数据类型>,
  <字段名2> <数据类型> --最后没有逗号
 )
 --创建goods表
 create table mydb.goods(
  id int comment '编号',
  name varchar(32) comment '商品名',
  price int comment '价格',
  description varchar (255) comment '商品描述'
 )charset utf8;
  1. 建表之前,要选择库 use 数据库名;
  2. 建表之前,设置语句 set names gbk; 设置服务器和客户端字符集统一,保证中文数据统一
  3. 数据类型:变体字符型varchar(32) 固定长度字符型char(255)
  4. 如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错。

show table查看数据表

 show table [like '匹配信息'];

[ ] 代表可选项

 --查看所有数据表
 show tables;
 ​
 --查看名称中含有 new 的数据表
 show tables like '%new%';

通配符:

  • % :多个任意字符
  • _ :任意一个字符

desc 查看数据表结构

 --查看goods表表结构 3种
 ​
 desc <数据表名>;
 describe <数据表名>;
 show columns from <数据表名>;

drop table 删除数据表

删除数据表的通用语法

 drop table <数据表名>;

alter table 修改数据表

修改表名

 --修改表名2种
 ​
 alter table <旧表名> rename [to/as] <新表名>;
 rename table <旧表名1> to <新表名1>, [<旧表名2> to <新表名2>]...;

修改表选项

 alter table <表名> 表选项 [=] 值;

修改编码utf-8

 alter table mydb charset=utf8;

增加字段

 alter table <数据表名> add <字段名> <数据类型>;

修改字段名

 alter table <数据表名> change <旧字段名> <新字段名> <字段类型> [字段属性];
 alter table mydb name namae varchar(255);

修改字段类型

 alter table <数据表名> modify <字段名> <新类型> [字段属性;]

修改字段位置

 alter table <数据表名> modify <字段名1> <数据类型> [字段属性] [first/after <字段名2>] 

数据操作

insert 插入数据

以下为向MySQL数据表插入数据通用的 INSERT INTO SQL语法:

 insert [into] <数据表名> (字段名1,字段名2,……) [values] (值1,值2,……);
 insert [into] <数据表名> set 字段名1=值1,字段名2=值2,……;
 insert [into] <数据表名> [(字段列表)] [values] (值列表1),(值列表2),……; --一次添加多行数据

插入的数据顺序严格按照数据表结构(字段的位置)插入对应的值,若类型为varchar数据则要用单引号括起来,多个数据用逗号分隔,未添加数据的字段系统自动为其添加默认值NULL(空值)

 --插入多条记录
 insert into goods (id,name,price,description) values
 (1,'nshsok',4998,'hight cost performance'),
 (2,'Mobiles phone',null,null),
 (3,'Hsdgsdg phone',1,null),
 (4,'Madgfgk',12999,'2020 New Model and 13.3 inches'),
 (5,'Sagdrgr phone',null,null),
 (6,'Mrgdgrdg',8900,null);

update 更新数据

 update <数据表名> set <字段名1>=<新值1>,<字段名2>=<新值2> where <条件>;

如果没有给出where则将表中所以记录的相关字段值都修改

 --将good表中编号为3的商品价格由~改为5977
 update goods set price=5977 where id=3;
 --将price字段的所有值都改为0
 update goods set price=0;

delete 删除数据

 delete from <数据表名> [where <条件>];
 --删除goods表中id为3的数据
 delete from goods where id=3;

select 查询数据

 select <字段名> from <数据表名> [where <条件>] [order <排序字段>] [group by <分组字段> [having <分组条件>]] [limit <N>] [offset <M>];
 --查询goods表中全部数据
 select * from goods;
 ​
 --查询goods表中id和name字段
 select id,name from goods;
  • 查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。
  • SELECT 命令可以读取一条或者多条记录。
  • 使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据
  • 使用 WHERE 语句来包含任何条件。
  • 使用 LIMIT 属性来设定返回的记录数。
  • 通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。

数据类型

数值类型

类型大小范围(有符号)范围(无符号)用途
TINYINT1 Bytes(-128,127)(0,255)小整数值
SMALLINT2 Bytes(-32 768,32 767)(0,65 535)大整数值
MEDIUMINT3 Bytes(-8 388 608,8 388 607)(0,16 777 215)大整数值
INT或INTEGER4 Bytes(-2 147 483 648,2 147 483 647)(0,4 294 967 295)大整数值
BIGINT8 Bytes(-9,223,372,036,854,775,808,9 223 372 036 854 775 807)(0,18 446 744 073 709 551 615)极大整数值
FLOAT4 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)单精度 浮点数值
DOUBLE8 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的值小数值

时间和日期类型:

类型大小 ( bytes)范围格式用途
DATE31000-01-01/9999-12-31YYYY-MM-DD日期值
TIME3'-838:59:59'/'838:59:59'HH:MM:SS时间值或持续时间
YEAR11901/2155YYYY年份值
DATETIME8'1000-01-01 00:00:00' 到 '9999-12-31 23:59:59'YYYY-MM-DD hh:mm:ss混合日期和时间值
TIMESTAMP4'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:07YYYY-MM-DD hh:mm:ss混合日期和时间值,时间戳

字符串类型:

类型大小用途
CHAR0-255 bytes定长字符串
VARCHAR0-65535 bytes变长字符串
TINYBLOB0-255 bytes不超过 255 个字符的二进制字符串
TINYTEXT0-255 bytes短文本字符串
BLOB0-65 535 bytes二进制形式的长文本数据
TEXT0-65 535 bytes长文本数据
MEDIUMBLOB0-16 777 215 bytes二进制形式的中等长度文本数据
MEDIUMTEXT0-16 777 215 bytes中等长度文本数据
LONGBLOB0-4 294 967 295 bytes二进制形式的极大文本数据
LONGTEXT0-4 294 967 295 bytes极大文本数据

表的约束

默认约束

非空约束

唯一约束

主键约束

单表操作

where 语句

 select <字段名1>,<字段名2>,…… from <数据表名> [where <条件> [and/or] <条件>];
 --查询goods表中商品名称name是notebook的全部商品信息
 select * from goods where name='notebook';
  • 查询语句中你可以使用一个或者多个表,表之间使用逗号, 分割,并使用WHERE语句来设定查询条件。
  • 在 WHERE 子句中指定任何条件。
  • 使用 AND 或者 OR 指定一个或多个条件。
  • WHERE 子句也可以运用于 SQL 的 DELETE 或者 UPDATE 命令。
  • WHERE 子句类似于程序语言中的 if 条件,根据 MySQL 表中的字段值来读取指定的数据。

like 语句

 select * from <数据表名> where <字段名> like <条件>;
 select * from goods where name like '%book';

SQL LIKE 子句中使用百分号 %字符来表示任意字符,类似于UNIX或正则表达式中的星号 *。如果没有使用百分号 %, LIKE 子句与等号 = 的效果是一样的。

order by 排序

 select <字段名1>,<字段名2>,…… from <数据表名> 
 order by <字段名1> [ASC [DESC]] <字段名2> [ASC [DESC]]

可以设定多个字段来排序。使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列。

 SELECT * from mydb order by id DESC;

group by 分组

 select <字段名1>,<字段名2>,…… from <数据表名> group by <字段名>

多表操作

join 连接

可以在 SELECT, UPDATE 和 DELETE 语句中使用 Mysql 的 JOIN 来联合多表查询。

JOIN 按照功能大致分为如下三类:

  • INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
  • LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
  • RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

union 操作符

MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据。

 select <字段名1>,<字段名2>,…… from <数据表名1> [where 条件]
 union [ALL]
 select <字段名1>,<字段名2>,…… from <数据表名2> [where 条件]
 [order by <字段名>];
 --从 "Websites" 和 "apps" 表中选取所有不同的country(只有不同的值):
 SELECT country FROM Websites
 UNION
 SELECT country FROM apps
 ORDER BY country;
 --使用 UNION ALL 从 "Websites" 和 "apps" 表中选取所有的country(有重复的值):
 SELECT country FROM Websites
 UNION ALL
 SELECT country FROM apps
 ORDER BY country;
 --使用 UNION ALL 从 "Websites" 和 "apps" 表中选取所有的中国(CN)的数据(有重复的值):
 SELECT country, name FROM Websites
 WHERE country='CN'
 UNION ALL
 SELECT country, app_name FROM apps
 WHERE country='CN'
 ORDER BY country;

MySQL 事务

MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!

  • 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
  • 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
  • 事务用来管理 insert,update,delete 语句

一般来说,事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。

  • 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
  • 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
  • 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
  • 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。

事务控制语句:

  • BEGIN 或 START TRANSACTION 显式地开启一个事务;
  • COMMIT 也可以使用 COMMIT WORK,不过二者是等价的。COMMIT 会提交事务,并使已对数据库进行的所有修改成为永久性的;
  • ROLLBACK 也可以使用 ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
  • SAVEPOINT identifier,SAVEPOINT 允许在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT;
  • RELEASE SAVEPOINT identifier 删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;
  • ROLLBACK TO identifier 把事务回滚到标记点;
  • SET TRANSACTION 用来设置事务的隔离级别。InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。

MYSQL 事务处理主要有两种方法:

1、用 BEGIN, ROLLBACK, COMMIT来实现

  • BEGIN 开始一个事务
  • ROLLBACK 事务回滚
  • COMMIT 事务确认

2、直接用 SET 来改变 MySQL 的自动提交模式:

  • SET AUTOCOMMIT=0 禁止自动提交
  • SET AUTOCOMMIT=1 开启自动提交

笔记源:https://www.runoob.com/mysql/mysql-like-clause.html


THE END