目录
数据库是使用各种数据结构设计出来的一种用于存储、组织和管理数据的软件系统。数据库可以提供远程服务,即通过远程连接来使用数据库,因此也称为数据库服务器。
注:数据库中的数据通常是存储在硬盘或固态硬盘等持久性存储介质中,故数据库中的数据能持久化保存,断电后也不会丢失。
数据库可以分为关系型数据库和非关系型数据库两种:
♪关系型数据库
关系型数据库(RDBMS)是一种基于关系模型的数据库。其中数据以表格的形式组织并保留在多个相关联的表格之间的关系中,每个表格代表一个实体类别(如顾客、产品或订单),并且每个表格之间的关系通过共享键实现。关系型数据库使用结构化查询语言(SQL)进行数据访问和管理。常见的非关系型数据库有MySQL、Oracle和Microsoft SQL Server。
♪非关系型数据库
非关系型数据库是一类非关系型的数据存储技术,与关系型数据库相对。非关系型数据库通常采用键值对或文档形式存储数据,具有可扩展、高可用、高性能和灵活的特点。非关系型数据库不要求使用SQL语言进行数据访问和管理。常见的非关系型数据库有MongoDB、Cassandra、Redis、Couchbase等。
知道了数据库是什么之后 ,我们接下来就来以关系型数据库MySQL为例,学习管理关系型数据库的SQL语言~
MySQL中可以有多个数据库,每个数据库可以有多个表,每个表可以有多个行和列,我们先用SQL来查询当前MySQL中已有的数据库:
语法:show databases;
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec)表格里的四个数据库就是MySQL自带的系统数据库,通常情况下我们是不会直接使用这四个数据库的,也不介意去动这几个数据库,不然可能会出现一系列bug。
既然系统库不能动,那我们就得自己来创建个数据库:
语法:create database 数据库名;
mysql> create database test; Query OK, 1 row affected (0.01 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | test | +--------------------+ 5 rows in set (0.03 sec)可以看到,我们已经创建好了一个test的数据库了。
注:数据库名不能是SQL关键字,但可以是反引号括起来的关键字(如:`table`)。
在创建数据库的时候,我们还可以指定所建数据库采用的字符集以及字符集的校验规则:
语法:create database 数据库名 character set 字符集 collate 校验规则;
mysql> create database test2 character set utf8mb4 collate utf8_general_ci; Query OK, 1 row affected (0.02 sec)注:①.当我们创建数据库没有指定字符集和校验规则时,系统使用默认字符集:utf8,默认校验规则:utf8_ general_ ci。②.我们可以通过 show charset; 来查询MySQL中的字符集,通过 show collation; 来查询MySQL中的校验规则。③.由于字符集和比较规则是互相有联系的,如果我们只修改了字符集,比较规则也会跟着变化,如果只修改了比较规则,字符集也会跟着变化(只修改字符集,则比较规则将变为修改后的字符集默认的比较规则;只修改比较规则,则字符集将变为修改后的比较规则对应的字符集)。④ .MySQL的utf8编码不是真正的utf8,没有包含某些复杂的中文字符。MySQL真正的utf8是使用utf8mb4。在创建数据库时,若是创建同名的数据库会报错:
mysql> create database test; ERROR 1007 (HY000): Can't create database 'test'; database exists加上if not exists的可以将错误转换为警报:
语法:create database if not exists test;
mysql> create database if not exists test; Query OK, 1 row affected, 1 warning (0.00 sec)
创建的数据库若是不需要了,也可以删除它,但是刷了就木有了,需要谨慎执行这一指令:
语法:drop database 数据库名;
mysql> drop database test2; Query OK, 0 rows affected (0.09 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | test | +--------------------+ 5 rows in set (0.00 sec)这样就已经将 test2 数据库删除了。
当然,若是删除不存在的数据库会报错:
mysql> drop database test3; ERROR 1008 (HY000): Can't drop database 'test3'; database doesn't exist加上if exists可以将错误转换为警报:
语法:drop database if exists 数据库名;
mysql> drop database if exists test3; Query OK, 0 rows affected, 1 warning (0.00 sec)
要创建表需要先选定某个数据库:
语法:use 数据库名;
mysql> use test; Database changed选定了test的数据库后,接下来的操作就都在该数据库里了。
数据库里的表每一列都是带有类型是(所有行所对应的列所对应的类型必须一致),故我们要创建表得先了解下MySQL的数据类型。
♪数值类型
数据类型 大小 说明 对应Java类型 对应C类型 BIT[(M)] M为指定位数,默认为1 二进制数,M的 范围从 1 到 64, 存储数值范围从0 到 2^M-1 常用 Boolean 对应BIT ,此时默认是1 位,即只能存 0 和 1char[] TINYINT 1字节 Byte signed char SMALLINT 2字节 Short short int INT 4字节 Integer int BIGINT 8字节 Long long long int FLOAT(M,D) 4字节 单精度, M 指定长度, D 指定小数位数。会发生精度丢失Float float DOUBLE(M,D) 8字节 Double double DECIMAL(M,D) M/D的最大值+2 双精度,M指定长度,D指定小数位数。精确数值 BigDecimal char[] NUMERIC(M,D) M/D 最大值 +2与DECIMAL一样 BigDecimal char[] 注:数值类型也可指定为unsigned,表示无符号类型
♪字符串类型
数据类型 大小 说明 对应Java类型 对应C类型 VARCHAR(SIZE) 0~65535字节 可变长度字符串 String char[] TEST 0~65535字节 长文本数据 String char[] MEDIUMTEXT 0~16777215字节 中等长度文本数据 String char[] BLOB 0~65535字节 二进制形式的长文本数据 Byte[] char[] ♪日期类型
注:由于TIMESTAMP的时间戳即将用尽,故更建议使用DATETIME
数据类型 大小 说明 对应Java类型 对应C类型 DATETIME 8字节 范围从 1000 到 9999 年,不会进行时区的检索及转换 java.util.Date 、java.sql.TimestampMYSQL_TIME TIMESTAMP 4字节 范围从 1970 到 2038 年,自动检索当前时区并进行转换。 java.util.Date 、java.sql.TimestamMYSQL_TIME
知道了数据类型后,就可以在指定的数据库中创建表了。
语法:create table 表名 (列名1 类型1, 列名2 类型2, 列名3 类型3);
mysql> create table student( -> id int, -> name varchar(20), -> age int -> ); Query OK, 0 rows affected (0.03 sec)还可以使用 comment 增加字段说明:语法: create table 表名 (列名1 类型1 comment '注释内容', 列名2 类型2 comment '注释内容', 列名3 类型3 comment '注释内容');
mysql> create table student2( -> id int comment '序列号', -> name varchar(20) comment '姓名', -> age int comment '年龄' -> ); Query OK, 0 rows affected (0.05 sec)注:comment只能在创建表时使用,其他时候想要注释可以使用-- (--后面还有个空格)或#或/* */来表示。(-- 和#都表示单行注释,/* */表示多行注释)
创建表时也可以添加if not exists预防报错:
语法:create table if not exists 表名 (列名1 类型1, 列名2 类型2, 列名3 类型3);
mysql> create table if not exists student( -> id int, -> name varchar(20), -> age int -> ); Query OK, 0 rows affected, 1 warning (0.03 sec)
创建完表后,我们可以查看下我们所创建的表。
♪查看当前数据库下所以表:
语法:show tables;
mysql> show tables; +----------------+ | Tables_in_test | +----------------+ | student | | student2 | +----------------+ 2 rows in set (0.02 sec)
♪查看指定表结构:
语法:desc 表名;
mysql> desc student; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(20) | YES | | NULL | | | age | int(11) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 3 rows in set (0.03 sec)注:int(11)中11表示的是显示的宽度(不影响存储),varchar(20)表示的是最大长度是20个字符;Null表示是否可以为空;key与列的约束有关;Default表示默认值;Extra表示额外的描述
我们将不要的student2表删掉。
语法:drop table 表名;
mysql> drop table student2; Query OK, 0 rows affected (0.06 sec)同样,删表时也可以加上if exists预防直接报错:
语法:drop table if exists 表名;
mysql> drop table if exists student3; Query OK, 0 rows affected, 1 warning (0.00 sec)删表操作还支持同时删除多个表:
语法:drop table if exists 表名;
mysql> drop table if exists a,b,c; Query OK, 0 rows affected, 3 warnings (0.02 sec)