数据库学习(1) ----- 数据库基本概念

   数据库,字面意思理解,就是数据的仓库,存储数据的地方,最好的理解方式,就是把它想像成工厂中的仓库。只不过一个存储的是数据,一个是存储实际的货物。但存储的思想是一样的。

  在工厂仓库中存放物品的时候,我们一般不会随便乱放,因为找的时候不好找,通常会进行分类,比如,这里放水果,那里放蔬菜等。在数据库中存放数据也是同样的道理,我们要进行分类,这个放订单信息,那个放客户信息。这个,那个指的就是数据库中的一张一张的表。你可以把表想像成excel 表格,在生活中我们存放信息也是用excel 表格。比如存放用户名和密码的表格。第一列存放网站,第二列存放用户名,第三列存入密码, 网站,用户名,密码就对应的概念就是数据库的字段,对我们这个表要存放的内容做出说明。当我们在excel 表格的第一行中第一列写上淘宝, 第二列写上li123 第三列写上123456时,我们向数据库中插入了一条记录。

  简单总结一下,我们要先创建数据库来存入数据,存入数据的时候要进行分类,那就要创建表,创建表时要对表中的内容进行说明(它是存储什么的), 那就要提供字段,创建表成功后,我们就可以写入信息,每成功写入一条信息,就是插入一条记录。

  基本概念理解了,那就要实际操作了,创建数据库,创建表等。那怎么创建呢?这就要用到数据库管理软件如MySql. 这里存在一个误解,就是我们经常听到的mysql 数据库,oracle数据库,实际上它们不是数据库,而是数据库管理软件(Database Management System(DBMS)), 用它们来操作数据库,比如创建数据库,从数据库中获取数据等等。要使用数据库管理软件,那就要先安装它们,比如安装MySql数据库, 我以前写了一篇文章来说明如何安装和配置MySql, 这里就不说。安装完MySql 之后,我们打开命令行工具,就可以对数据库进行操作了。

  操作数据库用的是SQL语言。我们在命令行中写SQL语句,MySql 数据库管理软件来执行这个SQL语句,从而实现对数据库的操作。可能你已经想到了,现在要创建数据库。创建数据库,就像在计算机中创建了一个文件夹来存放数据。我们平时存文档,电影等数据时,也会先建文件夹。创建数据库的SqL语句 如下:

  CREATE {DATABASE | SCHEMA } [IF NOT EXISTS] db_name [DEFAULT] CHARSET SET [=]  charset_name

  { } 大号表示必写项,里面的 | 表示二者选其一。

  [] 表示可写可不写, DEFAULT 后面也是可写可不写.

  最简单的创建数据库的语法是CREATE DATABASE db_name  现在来创建一个数据库myFirstDatabase,那使用的命令就是CREATE DATABASE db_name

  这时当我们在命令行中输入CREATE DATABASE myFirstDatabase. 按回车时,它换行了,并没有执行我们的Sql语句,这是MySql的语法规范, 每一条语句都要以分号结尾。

  这里再提一下其它两条规范吧:

  1, 关键字与函数名称全部大写, 比如上面的create database 都要大写

  2, 数据库名,表名,字段名全部小写, 比如上面我们自定义的数据库名称

  [IF NOT EXISTS],如果不存在的意思,CREATE {DATABASE | SCHEMA } [IF NOT EXISTS] db_name,意思就是如果不存在数据库db_name, 就创建数据库 db_name。 它的主要的作用是,创建数据库的时候,如果已经存在一个同名数据库,我们再创建这个数据库,不会报错,只会警告,程序可以正常运行。如果没有[IF NOT EXISTS], 我们在创建一个同名的数据库,就会报错。现在我们再创建一次myFirstDatabase 试一试,这里先不加IF NOT EXISTS

  可以发现报错了,程序出错了。现在加上IF NOT EXISTS

  可以发现程序并没有报错,只是一个warning, 不会影响程序的正常运行。

  CHARSET SET [=]  charset_name, 设置我们数据使用的字符编码,如果不写,就是使用默认的系统编码。

  创建数据库后,我们要查一下数据库有没有创建成功,可以使用SHOW DATABASES 命令, 它显示创建了哪些数据库。

  修改数据库, 则是用的ALTER, Alter 就是更改的意思 

  ALTER {DATABASE | SCHEMA} [db_name] alter_specification ...

  alter_specification 就是我们要更改的内容,比如 [DEFAULT] CHARACTER SET [=] charset_name, 修改字符编码

  删除数据库 DROP {DATABASE | SCHEMA} [IF EXISTS] db_name,drop 去掉的意思

  IF EXISTS 和 创建数据库的 IF NOT EXISTS 的作用是一样的, 如果有这个数据库的时候,才会执行删除操作,避免程序报错。

  创建数据库成功,我们就有地方存放数据了。不过还要创建表,因为需要对数据进行分类存放。注意,创建表之前,我们一定要指定使用哪个数据库,因为有很多数据库可以使用,就像上图展示,有7个数据库可以使用。这和我们平时的操作一样,我们存放任何内容之前,也是要选择一个文件夹,比如存放电影,我们肯定是打开电影文件夹,不可能打开文档文件夹吧。 指定使用哪一个数据库的命令是USE db_name,  db_name 就是要打开的数据库的名称。

  可以看到Database change 提示,表示切换数据库成功。当然,我们也可以再次确定一下是不是切换成功,使用命令SELECT DATABASE(); 

  可以看到我们确实是在myfirstdatabase 数据库,好了,现在可以创建表来存储数据了。

  创建表

  CREATE TABLE[IF NOT EXIST] table_name( column_name data_type, .....);

  IF NOT EXIST 就不用解释了 , table_name 就是要创建的表名称。 column_name 是字段,表示要存储哪些内容,data_type, 这个字段是什么类型的,这和编程语言中变量类型一样,比如字符类型(VARCHAR),数值型(INT),浮点型(FLOAT)等。 现在我们来创建一个表保存用户信息, 只有简单的id 和name 字段。

 

  查看一下数据库有没有创建表成功,可以使用SHOW TABLES; 命令,显示数据库中所有的表。

  数据库中有了一张person表. 这时也可以使用SHOW COLUMNS FROM table_name 查看表中的字段

  创建表之后,就可以向数据表中插入记录了, 使用如下命令

  INSERT [INTO] table_name[(col_name, ...)] VALUES(val)

  当为某些字段进行赋值的时候,col_name 要写,表明我们为哪些字段赋值, 如只给name赋值,就可以这么写

  INSERT person (name) VALUES('sam');

  当为表中的所有字段进行赋值时,可以去掉col_name, 直接按照表中字段的顺序一一赋值就可以了, 下面就插入了一条记录,id的值为2, name的值为jason. 

  INSERT person VALUES(2,'jason');

  我们怎么确定数据插入成功了呢?那就用到了查询语句,查询是核心 ,我们在这里只是简单使用一下就可以了。SELECT * FROM person, 就是从person 表中查询所有的记录

  我们看到id的值为空,这有点不合理,所以在创建表的时候要对字段的值加以限制,加以限制,就是我们经常听到的约束,对字段的取值进行约束(限制)。经常用到的约束有主键约束,唯一约束,默认约束,非空约束。

  id不能为空,就是非空约束,这个比较简单,就是在创建表的时候,字段的后面加一个 NOT NULL;

    CREATE TABLE tb_name( col_name data_type NOT NULL);

  主键约束:保证每条记录的唯一性,每张表中只能有一个主键,用primary key 进行表示,当字段设为主键以后,它自动不为空NOT NULL。为什么要保证每条记录的唯一性,这主要是对于表的操作来说,如果我们删除一个记录,执行成功后,mysql返回它删除了一个记录,如果每条记录都是唯一的,那我们就非常确信,执行的没有问题。但如果记录不唯一,我们就不能确定执行的是不是没有问题?那对于我们输入学生列表来说,怎么保证记录的唯一呢?难道要手动输入id , 1, 3 ,4, 那就麻烦了,其实它可以和AUTO INCREMENT 一起使用,auto increment 自动增长的意思, 很显然,它是一个数字类型,而且也解决了字段唯一的问题。

  唯一约束(UNIQUE KEY):当把字段设为唯一约束时,每条记录的这些或这个字段不能重复,如果两条记录的唯一约束字段相同,那么就会报错,这个给我印象深刻一个是,我们的一张企业信息表设了主键是 id, 每条记录是不重复了,但是name 字段没有设唯一约束,导致不同的id 对应的是想同的企业名,两个不同的id 却对应相同的企业名称。

  默认约束(DEFAULT) ,就是给一个默认值,比如性别,就只有男和女两个选项。

 CREATE TABLE person(
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) UNIQUE KEY,
    address VARCHAR(255),
    sex ENUM('1', '2', '3') DEFAULT '3'
 );

   外键约束:它是对于表与表之间的关系而言的,当数据库中有多张表以后,表与表之间会产生关系,为了描述这种关系,就要在表中创建外键,也是为了数据的一致性。比如一张姓名表和一张籍贯表,每一个人都有一个姓名,存在姓名表中,同时,也都有籍贯,存放到籍贯表中,这两张表就要关系了,那就要在其中一个表中创建外键。但使用外键约束之前,要满足一系列前提条件

  1, 存在关系的表必须使用相同的存储引擎,且存储引擎必须为InnoDB。Mysql默认存储引擎是InnoDB,这点不用担心。

  2,外键列和参照列必须具有相同的数据类型。但对于字符型数据来说,他们的长度可以不同。外键列就是我们定义为外键的那一列,参照列则是与外键有关的另一张表中的主键。如果我们在姓名表中定义一个外键列,那么参照列 就是籍贯表中的主键

  3,外键列和参照列必须创建索引。

  那怎么定义外键列和参照列?首先创建province 籍贯表,它有俩个字段,id,pname, id 是主键,那么它就是姓名表的外键列的参照列

mysql> CREATE TABLE province(
    -> id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    -> pname VARCHAR(20) NOT NULL
    -> );

  现在创建姓名表user, 在里面创建外键,外键参考的是province 表,这时突然想起来为什么要创建外键、如果不创建外键的话,我们user 表中就要创建province 字段。那么user表就要有三个字段,id, name, province.  但是province 在其他表中已经存在了, 我们就没有必要再建了,直接使用就可以了,所以我们就可以创建一个字段来指向province 了,这个字段就是外键。其实就是没有 province表,我们在创建的时候,为了避免表的冗余,也可以把province 字段单独成一张表。怎么创建外键,使用foreign key(外键列名) references 参照的表名(参照列)

mysql> CREATE TABLE user(
    -> id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    -> username VARCHAR(10) NOT NULL,
    -> pid SMALLINT UNSIGNED,
    -> FOREIGN KEY(pid) REFERENCES province(id)
    -> );

  创建了一个外键约束的列pid, 它的参照列是province 表中的id, 这时,突然发现,外键约束的列 pid ,它的取值范围只能是province表的id 的值。pid 参考id 的值,id 约束pid。我们来试验一下,首先想province 表中插入数据,以完成参照列。

mysql> INSERT province(pname)VALUES('广东');
Query OK, 1 row affected (0.29 sec)

mysql> INSERT province(pname)VALUES('山东');
Query OK, 1 row affected (0.09 sec)

  现在再向user 表中插入数据,体验一下外键约束。插入pid的值是province表中的id 没有的,比如7,看看什么情况。

mysql> INSERT user(username, pid)VALUES('sam',7);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`user`, CONSTRAINT `user_ibfk_1` FOREIGN KEY (`pid`) REFERENCES `province` (`id`))

  直接报错了,看到外键约束的作用了。pid 的值再插入1 试一下,

mysql> INSERT user(username, pid)VALUES('sam',1);
Query OK, 1 row affected (0.19 sec)

  没有问题,插入成功。

  修改表

  添加字段(列): ALERT TABLE 表名 ADD [COLUMN] 列名 列属性[FIRST | AFTER 列名],  FIRST | AFTER  列名,定义的是把新增加的列放到什么地方,FIRST 表示新增加到第一列,AFTER 列名,表示增加到某个列的后面,当然,他们也可以省略,那么新增加的列放到所有列的后面。

mysql> ALTER TABLE user ADD age INT NOT NULL;

  新增的列age 放到了表的最后面。这是我们添加一列的方式,如果一次添加多列,那就和创建表的时候一样,使用括号,把所有的列都括起来,这时,所有的列都放到表的后面。ALTER TABLE 表名 ADD( 列名 列属性)

mysql> ALTER TABLE user ADD(
    -> score INT,
    -> job VARCHAR(20)
    -> );

  删除列:它使用的是drop 列名的方式 ALTER TABLE 表名 DROP [COLUMN] 列名, ALTER TABLE user DROP score; 就是删除user 表的score 列, 同时删除多列,则是把drop 语句用逗号隔开。ALTER TABLE user DROP  age, DROP job, 就是一次性删除age 和drop 列

  添加约束:我们添加列之外,还可以添加约束。

    添加主键约束: ALTER TABLE 表名 ADD [CONSTRAINT] PRIMARY KEY(列名)

    添加唯一约束:ALTER TABLE 表名 ADD [CONSTRAINT] UNIQUE(列名)

    添加外键约束:ALTER TABLE 表名 ADD [CONSTRAINT] FOREIGN KEY(列名) REFEREINS 列名

    添加默认约束:ALTER TABLE  表名 ALTER [COLUMN] 列名 {SET DEFAULT 值}

  删除约束

    删除主键约束:ALTER TABLE 表名 DROP PRIMARY KEY;

    删除唯一约束:  ALTER TABLE 表名 DROP {INDEX | KEY}  列名;

    删除外键约束:  ALTER TABLE 表名 DROP FOREIGN KEY 外键的名称;  那外键约束的名称怎么获取呢? 使用SHOW CREATE TABLE 表名 来获取, 在user中,我们创建了外键,SHOW CREATE TABLE user, 得到如下内容

  它有 一个 CONSTRAINT user_ibfk_1, 这个就是外键的名称,是mysql 自动创建的,这时我们就获取到了外键的名称,使用ALTER TABLE user DROP FOREIGN KEY user_ibfk_1 就可以删除外键了。

    删除默认约束:ALTER TABLE  表名 ALTER [COLUMN] 列名 {DROP DEFAULT}

  

原文地址:https://www.cnblogs.com/SamWeb/p/9300650.html