SamWeb

   数据库,就是数据的集合(a collection of data),存储数据用的。存储数据呢?通常会进行分类,同类的数据放到一起,比如订单数据和用户数据肯定是分开放,以后找的时候好找,每一个类就构成了数据库的一张表,对应的数据放到表中。数据放到表中时,通常会做出规定,哪一列放什么数据,真正存储数据的时候,就按规定依次存储。可以把表想像成excel 表格,存放用户名和密码的表格,第一列存放网站,第二列存放用户名,第三列存入密码, 网站,用户名,密码就也称为表的字段。当在excel 表格的第一行中第一列写上淘宝, 第二列写上li123 ,第三列写上123456时,我们向数据库中插入了一条记录,这一条记录也称之为行。把数据库对应到电脑上的文件系统,可以把数据库比作文件夹,表比作文件夹里面的excel 表格,表格的内容就是数据,数据库只是简单的一个物理位置,用来存放数据。

  简单说明一下一个误解,就是我们经常听到的MySQL数据库,Oracle数据库,实际上它们并不是数据库,MySQL和Oracle是数据库管理软件(Database Management System(DBMS)),它们是用来管理数据库的,比如创建数据库,创建表,从数据库中获取数据等等,它们的存在大大简化了对数据库的操作。MySQL和Oracle 只是软件,要使用它们,就要先安装,安装完成后,才能使用它们。假设安装了MySql, 还要启动MySQL 服务,然后登录,才能对数据库进行操作。管理员身份打开命令行工具,net start  mysql 启动服务,mysql -u 用户名 -p 密码,登录数据库

  现在就可以操作数据库了,比如创建数据库,创建表等。操作数据库用的是SQL语言。在命令行中写SQL语句,  MySQL来执行这个SQL语句,从而实现对数据库的操作。首先创建数据库,定义一个存放数据的地方。创建数据库的Sql语句 如下:

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

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

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

  最简单的创建数据库的语法是CREATE DATABASE db_name ,CREATE DATABASE myFirstDatabase, 创建myFirstDatabase 数据库

  CREATE DATABASE myFirstDatabase, 按回车,换行了,并没有执行Sql语句,这里要注意,MySQL每一条语句都要以分号结尾,MySQL见分号执行语句。其次,还有大小写,有两条规范:

关键字与函数名称全部大写, 比如上面的create database 都要大写; 数据库名,表名,字段名全部小写, 比如上面我们自定义的数据库名称。但MySQL并不区分大小写,所有的Sql 语句都写成小写也没有关系。

  [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, 设置我们数据使用的字符编码,如果不写,就是使用默认的系统编码(UTF-8).

  创建数据库后,可以查询一下数据库有没有创建成功,SHOW DATABASES 命令, 显示创建了哪些数据库。

  创建数据库成功,就要创建表了,真正存储数据的地方。不过创建表之前,指定使用哪个数据库,因为有很多数据库可以使用,就像上图展示,有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)

  没有问题,插入成功。

  

 

  

分类:

技术点:

相关文章: