前言
数据库语言分类:DDL语句、DML语句、DQL语句、DCL语句。
DDL语句 数据库定义语言: 数据库、表、视图、索引、存储过程,例如CREATE DROP ALTER。
DML语句 数据库操纵语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE
DQL语句 数据库查询语言: 查询数据SELECT
DCL语句 数据库控制语言: 例如控制用户的访问权限GRANT、REVOKE
什么是数据库?
数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。
一个数据库有若干个表,这些表记录着各种信息。
数据表的各列表示字段,属性。
数据表的各行记录着各种数据,各种信息
DDL语句
创建库
打开之前安装的MySQL环境登录到MySQL中进行操作。
语法:
CREATE DATABASE 库名; //创建库
SHOW DATABASES; //查看所有库;
创建school数据库,通过show databases;进行查看所有数据库这里有默认的一些库,不要随意去动这些。
information_schema: 虚拟库,主要存储了系统中的一些数据库对象的信息,例如用户表信息、列信息、权限信息、字符信息等
performance_schema: 主要存储数据库服务器的性能参数
mysql: 授权库,主要存储系统用户的权限信息
sys: 主要存储数据库服务器的性能参数
创建表
语法:CREATE TABLE 表名(字段1 类型 约束,字段2 类型 约束,.....)ENGINE=引擎;
字段后面约束可写可不写,但是字段后面必须要跟字段的数据类型。
ENGINE设置引擎,默认是INNODB,所以可以不用写。
类型
数据类型:
整型:int整数
浮点型:float
日期类型:
年:YEAR
日期:DATE
时间:TIME
日期和时间:DATETIME
字符串类型:
字符:CHAR和VARCHAR
枚举:ENUM
多选:SET
测试
创建表(不加约束)
use 库名 //进入库,如果不进入库,创建表之前要加上库名.表名创建。
select database(); //查看当前库
语法:CREATE TABLE 表名(字段1 数据类型,字段2 数据类型。。。); //创建表
不进入库创建:CREATE TABLE 库名.表名(字段1 数据类型,字段2 数据类型。。。);
desc 表名 //查看表结构
向student表中插入数据
插入语句是DML语句:INSERT
语法:INSERT INTO 表名 VALUES(数据1,数据2。。。);
注意:这里id位置插入数据如果不是整数会报错,sxe位置插入的如果不是b或这个g也会报错。
约束
主键PRIMARY KEY :标识该字段为该表的主键,可以唯一的标识记录,不可以为空。
外键FOREIGN KEY :标识该字段为该表的外键,实现表与表(父表主键/子表1外键/子表2外键)之间的关联
UNIQUE KEY :标识该字段的值是唯一的,可以为空,一个表中可以有多个UNIQUE KEY
AUTO_INCREMENT:标识该字段的值自动增长(整数类型,而且为主键)
DEFAULT:为该字段设置默认值
NOT NULL :标识该字段不能为空
UNSIGNED:无符号,正数
ZEROFILL :使用0填充,例如0000001
测试
语法:CREATE TABLE 表名(字段1 数据类型 约束,字段2 数据类型 约束。。。);
主键
创建p1表设置id为主键,主键不能为空,一般设置为自增。
使用desc查看表结构可以看到id的key列和extra有了内容 。
插入正确数据
插入错误数据
插入重复的id数会报错。因为设置了id自增所以在不输入id的情况下,会默认在前一个数据的基础上加1所以不会报错,如果不给自增约束,这里不填写id的数据会报错。
外键
测试外键需要两个表,一个主表一个副表,外键要绑定主键的,所以主表要加主键,外键是假在副表上的。这里主表用刚刚的p1表因为已经创建了主键,接下来创建副表来增加外键。
语法:create table 表名(字段1 数据类型 约束,foreign key(字段) references 主表名(主键字段) on 需求 cascade);
需求可以是update 或者 delete等操作可以同时加多个需求
向p2插入数据
向p2插入两条数据。
注意:这里插入的数据pid部分必须要和主表的id数据匹配负责将报错,因为要保证副表的外键部分要和主表的主键部分有联系。
测试主外键联系
对主表内容进行修改。
发现主表id为1的数据改为3之后对应的副表pid为1的数据也同时改为了3。
唯一约束 UNIQUE
UNIQUE唯一约束,和主键的区别在于UNIQUE可以为空。
语法:create table 表名(字段 数据类型 UNIQUE);
id部分插入非空数据
没有报错。
id部分不插入内容
id位置不插入数据,仍然不会报错。
DEFAULT设置默认值
一般在一些字段,当用户不输入任何值时,需要给一个默认值,比如在学校选课时,当你不做任何操作默认选课选项为否。
语法:create table 表名(字段 数据类型 default(默认值));
在choose出不插入数据测试
只在obj处插入数据不在choose插入数据,在查询表内容的时候choose有数据‘no’。
无符号正数UNSIGNED
该约束,要求输入的字段只能是正数。
注意这个约束要紧跟数据类型之后。
这里创建了两个id字段,一个是正常int 另一个是加了unsigned约束的id。
测试插入正确数据
int数据类型是支持负数的。
测试在id_unsigned录入负数
可以发现都是int数据类型,但是id_unsigned录入负数就会报错,这就是unsigned约束的作用。
ZEROFILL零填充
使用0填充,例如0000001
这里顺便介绍int类型的使用,在定义数据类型为int或者float类型的时候可以使用int(10)这个10表示该数据的长度,但不会限制,这个在0填充部分可以体现。
发现在约束0填充的同时会默认加上正数约束。
插入数据
在插入数据长度不到定义的数据长度时会自动在前面填充0。
这个约束往往会用在学生的学号以及人员编码上,为了美观。
实战
使用已学的数据类型以及约束来创建完善的学生表。
创建表
学生信息表:
要求:学生表存储学生学号、姓名、性别、年龄、籍贯。
学生成绩表:
要求:创建姓名外键,存储学生学号、姓名、学科、成绩。
创建学生信息表
mysql> create table studentmsg(id int(3) zerofill not null auto_increment, -> name varchar(20) not null, -> sex enum('b','g') not null, -> age int, -> area varchar(100), -> primary key(id,name));
创建学生成绩表
因为主表使用的是复合主键所以这边也要用复合主键做外键。
create table score( -> id int(3) zerofill not null auto_increment, -> name varchar(20) not null, -> obj varchar(50) not null, -> score float(5,2), -> primary key(id), -> foreign key(id,name) references stuudentmsg(id,name) on update cascade on delete cascade);
插入数据
mysql> insert into studentmsg values(1,'tom','b',16,'江苏'),(2,'lucy','g',18,'浙江'); mysql> insert into score values(1,'tom','Math',89),(2,'lucy','English',93);
利用主外键联系更新主表学生信息
需求:需要将001号学生姓名改为jack。
mysql> update studentmsg set name='jack' where id=1;
改完之后score表的该学生信息也发生了变化。