其实简单来说数据库就是一个可以用来存放数据的地方,我们平时一定都是用过文件来存储一些word文档或者图片等等,其实数据库也相当于一个“文件”;那么我们为什么不使用文件,而用创建了数据库来存储数据呢?
主要是 1. 读/写文件需要进行I/O,速度较慢
2. 文件不利于存储海量数据,且不利于数据的管理和查询
3. 在程序中控制文件也不方便
由于上面的缺点,因此出现了数据库;
其实数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。
使用数据库,我们可以有效的管理海量数据,并能快速的进行数据的查询。
我们今天涉及到的MySQL也属于数据库中的一种
SQL 是用于访问和处理数据库的标准的计算机语言。通过编写SQL语句,可以访问和处理数据库,包括数据插入、查询、更新和删除等等
每个SQL语句在结尾,都要输入一个分号(;)或者\g ,表示该语句结束了。
也可以使用\G,这种会每行显示一个值
如下图示例:
mysql -h [IP] -P [port] -u [用户] -p [密码]
如果没有-h选项,默认连接本地 没有-P选项,默认端口为3306 (mysql的默认端口为3306)
quit;
show processlist;
eg:仅有本地的一个root用户连接到数据库
eg: 创建一个名为person的数据库
mysql> create database person;
Query OK, 1 row affected (0.00 sec)
当然如果我们要创建的数据库名称与原有的数据库名称相同的话,就会产生错误
eg:我们再次执行create database preson;命令的时候,会显示:
create database person;
ERROR 1007 (HY000): Can't create database 'person'; database exists
为了避免出现这种错误,我们可以加上if not exists(如果不存在)
命令: create database if not exists [数据库名称];
mysql> create database if not exists person;
Query OK, 1 row affected, 1 warning (0.01 sec)
会显示一个警告,就是因为我们在创建数据库person之前已经有一个person数据库了,
在实际中并没有创建一个新的数据库
我们使用改名零,就会进入该库,可以对库内的表进行操作
eg: 进入person库内
mysql> use person;
Database changed
我们常说的删库跑路,其实就是使用这条命令,我们删除了数据库后,该数据库的全部数据都会丢失;因此,我们删库的时候一定要谨慎,删除任何库之前先进行备份,备份命令一会我们会提到:
eg: 删除数据库person;
mysql> drop database person;
Query OK, 0 rows affected (0.02 sec)
eg:如果存在数据库he,则删除
drop database if exists he;
Query OK, 0 rows affected, 1 warning (0.00 sec)
eg:
how create database person;
+----------+-----------------------------------------------------
| Database | Create Database
+----------+-----------------------------------------------------
| person | CREATE DATABASE `person` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+-----------------------------------------------------
1 row in set (0.00 sec)
我们观察上面的内容其实会发现有CHARCTER SET,这其实是表示数据库所使用的字符集,那什么是字符集呢?
ASCII我们都知道其实可以表示255个字符,ASCII也可以被成为一个字符集;
其实字符集就是一个字符表示的集合,而我们最常用的字符集是utf8,几乎支持所有国家的字符
和字符集紧密相关的还有一个概念 校对规则,每一个字符集都有一个默认的校对规则:校对规则的不同其实体现在对于大小写的敏感程度
有些校对规则对大小写敏感,后缀通常为_cs , _bin
而有些校对规则对大小写不敏感,后缀通常为_ci;
比如我们在一张数据表中存有数据 Shusheng ,shusheng
如果我们查询数据Shusheng
在后缀为_cs,_bin的校对规则下,我们查询的结果为 Shusheng
在后缀为_ci的校对规则下,查询的结果为Shusheng,shusheng
我们可以使用如下命令来查看系统所支持的字符集与其校对规则:
字符集:
show character set;
或
show charset;
校对规则
show collation ;
create database [数据库名称] charset=[字符集] collate [校对规则] ;
create database if not exists [数据库名称] charset=[字符集] collate [校对规则];
eg: 创建一个数据库person ,其字符集为utf8 ;
mysql> create database person charset=utf8;
Query OK, 1 row affected (0.00 sec)
创建一个数据库person ,其字符集为utf8 ,校对规则为utf8_general_ci
mysql> create database person
charset=utf8 collate utf8_general_ci;
Query OK, 1 row affected (0.00 sec)
alter database [数据库名称] charset=[字符集] collate [校对规则] ;
eg: 只修改字符集
mysql> alter database person charset=utf8 ;
Query OK, 1 row affected (0.00 sec)
eg:只修改校对规则
mysql> alter database person collate utf8_general_ci;
Query OK, 1 row affected (0.00 sec)
eg:修改字符集和校对规则
mysql> alter database person charset=utf8 collate utf8_general_ci;
Query OK, 1 row affected (0.00 sec)
mysqldump -P [端口] -u [用户] -p [密码] -B [数据库的名称] > 数据库备份存储的文件路径
注:此命令是在shell环境下运行的,并非在数据库中使用
[root]# mysqldump -P3306 -u root -p[密码] -B pra >./p.sql;
source [数据库备份存储的文件路径]
注:此命令是在数据库中使用的,如果备份数据库的时候没有使用-B选项,我们需要先建立一个新的空数据库,再使用命令还原数据库
eg:
在数据库pra存在的所有数据表(grade,stu)全部会展示出来
关于数据类型,可前往该博客:MySQL第二弹 之 表操作
MySQL第三弹 之 表的一些约束
链接:https://blog.csdn.net/weixin_43519514/article/details/107389579
https://blog.csdn.net/weixin_43519514/article/details/107413228
create table [表名称] ([列名称] [列的数据类型] comment [注释] )charset = [字符集] collate [校对规则] engine=[存储引擎] ;
create table if not exists ([列名称] [列的数据类型] comment [注释] )charset = [字符集] collate [校对规则] engine=[存储引擎] ;
注: if not exists 语句,只要存在同名的表就不会创建新表,即使两个表的结构是不一样的。
如果想一定创建新表,可以在创建表之前使用:drop table if exists [表名称] 将旧表删除;
eg:
mysql> create table student (id int comment '学号' ,
name varchar(27) comment '姓名') charset=utf8;
Query OK, 0 rows affected (0.02 sec)
MySQL 临时表在我们需要保存一些临时数据时是非常有用的。临时表只在当前连接可见,当关闭连接(即于数据库的会话关闭的时候)时,Mysql会自动删除表并释放所有空间.
换而言之,每个客户端只能看见自己创建的临时性表,所以不通的客户端可以创建同名的临时性表。
注: 临时表可以与某个已有的永久表的名字相同,已有的永久表不会因此遭到损坏。对于一个客户端而言,如果创建了一个与已有的永久表名字相同的临时表时,那个永久表将会被隐藏(无法对其访问,临时表被删除或者更改名字后,那个永久表将会再次显现出来)
创建临时性表的命令和创建表的命令差不多,只是加了修饰词temporary
create temporary table [表名称] ([列名称] [列的数据类型] comment [注释] )charset = [字符集] collate [校对规则] engine=[存储引擎] ;
eg:
同名的永久表和临时表可以同时存在
mysql> create table person (name varchar(255));
Query OK, 0 rows affected (0.02 sec)
mysql> create temporary table person (name varchar(255));
Query OK, 0 rows affected (0.01 sec)
查看数据表的列属性:
describe [表名称]; 可简写为 desc [表名称];
explain [表名称];
show columns from [表名称];
show fields from [表名称];
eg:
查看建表时的一些属性:
show create table [表名称];
eg:
eg:
mysql> drop table stu;
Query OK, 0 rows affected (0.01 sec)
注: 如果其他表利用外键于本表相关,则不能使用此命令直接删除表;
需先将设置外键的表删除,在删除此表;
//grade利用外键于stu表相关,需先删除grade才可以删除stu
mysql> drop table stu;
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails
mysql> drop table grade;
Query OK, 0 rows affected (0.01 sec)
mysql> drop table stu;
Query OK, 0 rows affected (0.01 sec)
mysql> drop temporary table person;
Query OK, 0 rows affected (0.00 sec)
注: 使用drop table [表名称] 也可以删除临时表,但是可能存在误操作:将同名的永久表也删除了
但是使用下面的命令,无法删除永久表
mysql> drop temporary table person;
ERROR 1051 (42S02): Unknown table 'pra.person'
alter table [原表名称] rename to [新表名称];
或
alter table [原表名称] rename [新表名称];
mysql> alter table person rename to per;
Query OK, 0 rows affected (0.01 sec)
rename table [原表名称] to [新表名称] ;
mysql> rename table per to person;
Query OK, 0 rows affected (0.01 sec)
alter table [表名称] engine = [存储引擎];
mysql> alter table person engine=MyISAM;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
alter table [表名称] charset=[字符集];
mysql> alter table person charset=utf8;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
alter table [表名称] modify [列名称] [新的数据类型];
mysql> alter table person modify name int;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
alter table [表名称] change [列名称] [列名称] [数据类型] ;
//仅修改列的数据类型,也一定要将列名称写两次
mysql> alter table person change name name int;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
//将name列改成id,且数据类型更改为int
mysql> alter table person change name id int;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
alter table [表名称] add [列名称] [列的数据类型] after [列名称]
alter table [表名称] drop [列名称]
备份:mysqldump -P3306 -u [用户名] -p[密码] [库名称] [表名称] >数据库文件的存储路径;
还原:source 数据库文件的存储路径;
数据表:
CREATE TABLE `student` (
`id` int(11) DEFAULT NULL COMMENT '学号',
`name` varchar(27) DEFAULT NULL COMMENT '姓名'
) ENGINE=InnoDB DEFAULT CHARSET=utf8
insert into [表名称] values (数据,需要和列对应);
如果数据和列数据类型不匹配会报错,数据类型匹配不会报错,但会出现意外的结果.
mysql> insert into student values ('书生',1);
ERROR 1366 (HY000): Incorrect integer value: '书生'
for column 'id' at row 1
mysql> insert into student values (1,'书生');
Query OK, 1 row affected (0.00 sec)
insert into [表名称] values (数据1 ) ,(数据2) , … ; 可以插入多行数据
eg:
mysql> insert into student values (1,'书生'),(2,'qq');
Query OK, 2 rows affected (0.00 sec)
insert into [表名称] (列名称) vaues (数据1),(数据2) , … ;
往指定的列插入相应的数据,未指定的列采用默认值
mysql> insert into student (name) values ('书生'),('qq');
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
insert into [表名称] set [列名称] = [该列的值] , [列名称] = [该列的值];
eg:
mysql> insert into student set id=7,name='qqqq';
Query OK, 1 row affected (0.01 sec)
select * from [表名称];
注: *表示全部内容