基于MySQL语言的数据库操作,首先需要安装MySQL服务端,可以直接安装绿色版,我安装的是MySQL8.0。其次需要一个图形化工具来实现数据库的操作,可以使用navicat premium或者小海豚SQLyog.我使用的是navicate premium 12.0。接下来就认识一下什么是数据库吧!
数据库就是存储数据,管理数据的仓库。
常见的数据库分为:
结构化查询语言(Structured Query Language)简称SQL,是一种数据库查询和程序设计语言,用于对关系数据库中的数据进行对应的增、删、改、查以及更新操作。
数据类型决定了数据在计算机中的存储格式,常用的数据类型包括整数数据类型、浮点数据类型、精确小数类型、二进制数据类型、日期/时间数据类型、字符串数据类型。
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
TINYINT | 1Bytes | (-128,127 | 0,255) | 小数数值 |
SMALLINT | 2Bytes | (-32 768,32 767) | (0,65 535) | 大数数值 |
MEDIUMINT | 3Bytes | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
INT或INTEGER | 4Bytes | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
BIGINT | 8Bytes | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
FLOAT | 4Bytes | 单精度浮点数值 | ||
DOUBLE | 8Bytes | 双精度浮点数值 | ||
DECIMAL | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 | 小数值 |
表示时间值的日期和时间类型为DATATIME、DATE、TIMESTAMP、TIME和YEAR。
类型 | 大小 | 范围 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 1000-01-01——9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | ‘-838:59:59’/‘838:59:59’ | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | 1901/2155 | YYYY | 年分值 |
DATETIME | 8 | 1000-01-01 00:00:00 9999-12-31 23:59:59 |
YYYY-MM-DD HH:MM:SS |
混合日期和时间值 |
TIMESTAMP | 4 | 1970-01-01 00:00:00/2038 | YYYYMMDDHHMMSS | 混合日期和时间值,时间戳 |
字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT。
类型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255bytes | 定长字符串 |
VARCHAR | 0-65535bytes | 变长字符串 |
BLOB | 0-65535bytes | 二进制形式的长文本数据 |
TEXT | 0 - 65535bytes | 长文本数据 |
在进行数据库的操作之前,首先我们需要现拥有一个数据库。
/*1.创建数据库的执行语句是:
create database 数据库名;
*/
create database db1023;
//语句后面一定不能缺少 ;
/*2.操作哪个数据库就需要在哪个数据库下进行
需要以下语句来进入数据库并对数据库下的内容进行操作
use 数据库名
*/
use db1023;
//3.想要查看是否已经建好数据库,以及使用以下语句来显示所有数据库
show databases;
/*4、查看数据库的定义
show create database 数据库名;
*/
show create database db1023;
/*
数据库定义信息:
CREATE DATABASE `db1023` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */
*/
/*5.删除数据库,若指定的数据库不存在,则删除出错
drop database 数据库名
*/
drop database db1023;
3.查看数据库结果图:
4.查看数据库定义
注意:
使用DROP DATABASE命令时要非常谨慎,在执行该命令时,MySQL 不会给出任何提醒确认信息。用DROP DATABASE声明删除数据库后,数据库中存储的所有数据表和数据也将一同被删除,而且不能恢复。
在创建完数据库且知道了对数据库的基本操作后,接下来就要创建数据表了。
创建数据表就是在创建好的数据库中建立新表。创建数据表的过程是规定数据列的属性过程,同时也是实时数据完整性(包括实体完整性、引用完整性和域完整性等)约束的过程。
要对数据表进行操作就需要5.1中所提及的2.语句"use 数据库名;",指定在哪个数据库下进行操作,没有选择数据库,就会抛出“No database selected”的错误。
/*
create table 表名(
字段1 类型 约束 默认值,
字段2 类型 约束 默认值,
字段3 类型 约束 默认值
);
*/
create table student(
stu_id int,
stu_name varchar(50),
stu_sex char(3),
stu_score float
);
create table employee(
emp_id int primary key,
emp_name varchar(50),
emp_sex char(3) default '男',
emp_salary float,
emp_phone varchar(50) unique,
emp_birth date,
dept_id int
);
//使用该命令可以查看该数据库下的所有表
show tables;
使用create table 创建表时,必须指定以下信息
1.表的名称,不区分大小写,但不能用SQL语言中的关键字如:drop,insert
2.数据表中的每一列(字段)的名称和数据类型,创建多列需要用,隔开。约束可以在表创建好后再进而完善表的结构并添加
查看所有表
通过右键点击所创建的表,点击“设计表”可以查看表中的一些默认值,主键,非空等,这些就是我们接下来要讲到的表的约束。
数据的完整性是指数据的可靠性和准确性。
四种完整性约束:
实体完整性:唯一约束、主键约束、标识列
域完完整性:限制数据类型、外键约束、默认值、非空约束
引用完整性:外键
自定义完整性:过程,触发器等
约束是在表上强制执行的一些数据校验规则,被插入、修改或删除的数据必须符合在相关字段上设置的这些约束条件。
五类完整性约束:
NOT NULL 非空
UNIQUE 唯一
PRIMARY KEY 主键
FOREIGN KEY 外键
CHECKED 检查(mysql不支持的)
主键,又称主码,是表中一列或多列的组合。主键约束(Primary Key Constraint)要求主键列的数据唯一,并且不允许为空。主键能够唯一地表示表中的一条记录,可以结合外键来定义不同数据表之间的关系,并且可以加快数据库查询的速度。主键和记录之间的关系如同身份证和人之间的关系,它们之间是一一对应的。主键分为两种类型:单字段主键和多字段联合主键。
主键由一个字段组成,SQL语句格式分为以下两种情况。
字段名 字段类型 primary key
//例如:
create table employee2(
emp_id int primary key auto_increment, -- 主键自增
emp_name varchar(50),
emp_sex char(3) default '男',
emp_salary float,
emp_phone varchar(50) unique,
emp_birth date,
dept_id int
);
ALTER TABLE 表名 ADD CONSTRAINT 主键名 PRIMARY KEY(字段);
例如:
alter table employee add constraint pk_emp primary key (emp_id);-- 添加主键
主键由多个字段联合组成,语法规则如下:
primary key(字段1,字段2,…字段n)
对应外键中的多对多关系例题练习!
通过上述代码,我们还看到有个自增,自增是什么?
在数据库应用中,经常希望在每次插入新记录时,系统自动生成字段的 主键值。可以通过为表主键添加AUTO_INCREMENT关键字来实现。默认的,在MySQL中AUTO_INCREMENT的初始值是1,每新增一条记录,字段 值自动加1。一个表只能有一个字段使用AUTO_INCREMENT约束,且该字 段必须为主键的一部分。AUTO_INCREMENT约束的字段可以是任何整数 类型(TINYINT、SMALLIN、INT、BIGINT等)。
思考:主键自增,如果使用完了怎么办?
非空约束(Not Null Constraint)指字段的值不能为空。对于使用了非空 约束的字段,如果用户在添加数据时没有指定值,数据库系统会报错。
字段名 数据类型 not null
唯一性约束(Unique Constraint)要求该列唯一,允许为空,但只能出现一个空值。唯一约束可以确保一列或者几列不出现重复值。 唯一性约束的语法规则如下:
字段名 数据类型 UNIQUE
// 创建两个表 offices 和 empolyees
create table offices(
officeCode int(10) primary key ,
city varchar(50) not null,
address varchar(50),
country varchar(50) not null,
postalCode varchar(15) unique
//在建表时给postalCode添加唯一约束
);
如果定义完表后也可以给某个字段添加唯一约束,语法如下:
alter table 表名 add constraint 约束名 unique(约束字段);
//给上表中的postalCode添加唯一约束
alter table offices add constraint postalCode unique;
默认约束(Default Constraint)指定某列的默认值。如男性同学较多, 性别就可以默认为‘男’。如果插入一条新的记录时没有为这个字段赋值,那么系统会自动为这个字段赋值为‘男’。 默认约束的语法规则如下:
字段名 字段类型 default 默认值
create table student(
stu_id int,
stu_name varchar(50),
stu_sex char(3) default '男',
stu_score float
);
DESCRIBE/DESC语句可以查看表的字段信息,其中包括字段名、字段 数据类型、是否为主键、是否有默认值等。语法规则如下:
DESCRIBE 表名;
或者
DESC 表名;
//查看表
desc student;
show create table student;
外键用来在两个表的数据之间建立连接,可以是一列或者多列。一个表 可以有一个或多个外键。外键对应的是参照完整性,一个表的外键可以为空 值,若不为空值,则每一个外键值必须等于另一个表中主键的某个值。
外键:首先它是表中的一个字段,虽可以不是本表的主键,但要对应另 外一个表的主键。外键的主要作用是保证数据引用的完整性,定义外键后, 不允许删除在另一个表中具有关联关系的行。外键的作用是保持数据的一致 性、完整性。例如,部门表tb_dept的主键是id,在员工表tb_emp5中有一个键deptId与这个id关联。
主表(父表):对于两个具有关联关系的表而言,相关联字段中主键所 在的那个表即是主表。
从表(子表):对于两个具有关联关系的表而言,相关联字段中外键所 在的那个表即是从表。
语法:
alter table 表名 add constraint 外键名 foreign key(被添加的外键) references 所依赖的表名(所依赖的属性)
alter table idcard add constraint fk_idcard foreign key(idcard_id) references person(p_id);
//案例:一对一:人与身份证
use db1023;
create table person(
p_id int primary key auto_increment,
p_name varchar(50) not null,
p_sex char(1) not null,
p_phone varchar(15)
);
create table idcard(
idcard_id int primary key,
idcard_num varchar(50) not null,
idcard_department varchar(50)not null,
idcard_start date,
idcard_end date
);
// 添加外键
// alter table 表名 add constraint 外键名 foreign key(被添加的外键) references 所依赖的表名(所依赖的属性)
alter table idcard add constraint fk_idcard foreign key(idcard_id) references person(p_id);
//一对多:部门与员工
create table department(
departid int primary key auto_increment,
departname varchar(50),
departnum int default 0,
departdesc varchar(200)
);
create table employee(
empid int PRIMARY key auto_increment,
empname varchar(50),
empsex char(2) default '男',
empbirth date,
empphone varchar(50),
deptid int
);
alter table employee add constraint fk_emp_dept foreign key(empid) references department(departid);
/*
多对多
账号 角色
N N
有一个中间表
两个属性之间都为外键
双主键
*/
create table users(
userid int primary key auto_increment,
username varchar(50),
userpassword varchar(50),
userstatus int
);
create table roles(
roleid int primary key auto_increment,
rolename varchar(50) not null
);
create table userroles(
uid int,
rid int,
primary key(uid,rid)
);
alter table userroles add constraint fk_ur_users foreign key(uid) references users(userid);
alter table userroles add constraint fk_ur_roles FOREIGN key(rid) references roles(roleid);
/*
自关联
*/
create table cities(
id int primary key,
name varchar(50) not null,
pid int
);
//创建自关联
alter table cities add constraint fk_pid_id foreign key(pid) references cities(id);
即在表存在的情况下,对表的属性进行修改。MySQL使用 ALTER TABLE语句修改表。常用的修改表的操作有修改表名、修改字段数 据类型或字段名、增加和删除字段、修改字段的排列位置、更改表的存储引擎、删除表的外键约束等。本节将对和修改表有关的操作进行讲解。
修改表名
ALTER TABLE <旧表名> RENAME [TO] <新表名>;
alter table employee rename to emp;
修改字段的数据类型
ALTER TABLE <表名> MODIFY <字段名> <数据类型>
alter table emp modify emp_name varchar(30);
修改字段名
ALTER TABLE <表名> CHANGE <旧字段名> <新字段名> <新数据类型>;
alter table emp change id dept_id int;
添加字段
ALTER TABLE <表名> ADD <新字段名> <新字段类型> <约束条件> [FIRST|AFTER 已存在字段名];
alter table emp add empaddr varchar(20);
alter table emp add empaddr varchar(20) after empsex;
alter table emp add empnum varchar(20) first;
alter table emp add stu_sex varchar(3) not null;
删除字段
ALTER TABLE <表名> DROP <字段名> ;
alter table emp drop stu_sex;
修改字段的排序位置
ALTER TABLE <表名> MODIFY <字段1> <数据类型> FIRST|AFTER <字段2>;
alter table student modify stu_id int after stu_name;
删除表的外键约束
ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>;
alter table emp drop foreign key fk_emp_dept;
更改表的存储引擎
ALTER TABLE <表名> ENGINE=<更改后的存储引擎名>;
alter table tb_department engine = MyISAM;
删除数据表
drop table [if exists]表1,表2,表n;
drop table student;
1.创建数据库company,在库中创建两个表offices和employees表
offices表结构:
employees表结构:
2. 查看该库下几个表以及查看两张表结构。
3. 将表employees的mobile字段修改到officeCode字段后面。
4. 将表employees的birth字段改名为employee_birth。
5. 修改sex字段,数据类型为CHAR(1),非空约束。
6. 删除字段note。
7. 增加字段名favoriate_activity,数据类型为VARCHAR(100)。
8. 删除表offices。
9. 将表employees名称修改为employees_info。
//1.创建表
use exercise;
create table offices(
officeCode int(10) PRIMARY key UNIQUE,
coty VARCHAR(50) not null,
address VARCHAR(50),
country VARCHAR(50) not null,
postalCode VARCHAR(15) UNIQUE
);
create table employees(
employeeNumber int(11) PRIMARY KEY UNIQUE auto_increment,
lastName VARCHAR(50) not null,
firstName VARCHAR(50) not null,
mobile VARCHAR(25) UNIQUE,
officeCode int(10) not null,
jobTitle VARCHAR(50) not null,
birth datetime not null,
note VARCHAR(25),
sex VARCHAR(5)
);
/* 添加外键
alter table 表名 add constraint 外键名 foreign key(被添加的外键) references 所依赖的表名(所依赖的属性)
*/
ALTER TABLE employees add CONSTRAINT fk_officeCode FOREIGN KEY(officeCode) REFERENCES offices(officeCode);
//3.更改字段顺序到某一个后边
alter table employees modify mobile varchar(25) after officeCode;
//4.更改字段名
alter table employees change birth employee_birth datetime;
//5.更改字段数据类型
alter table employees modify sex char(1) not null;
//6.删除字段
alter table employees drop note;
//7.添加字段
alter table employees add favourite_activity VARCHAR(100);
//ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>;
//8.删除外键约束并删除表
alter table employees drop FOREIGN KEY fk_officeCode;
drop table offices;
//9.更改表名字
alter table employees RENAME TO employees_info;
创建数据库Market,在Market中创建数据表customers
create database Market;
//1.创建表
use Market;
create table customers(
c_num INT(11) PRIMARY KEY not NULL UNIQUE auto_increment,
c_name VARCHAR(50),
c_contact VARCHAR(50) ,
c_city VARCHAR(50) ,
c_birth datetime not NULL
);
//修改字段顺序
alter table customers MODIFY c_contact VARCHAR(50) after c_birth;
//修改字段类型
alter table customers MODIFY c_name VARCHAR(70);
//修改字段名字
alter table customers CHANGE c_contact c_phone VARCHAR(50);
//添加字段
alter table customers add c_gender CHAR(1);
//修改数据库名字
alter table customers RENAME TO customers_info;
//删除字段
alter table customers_info drop c_city;
//修改数据库引擎
-- ALTER TABLE <表名> ENGINE=<更改后的存储引擎名>;
alter table customers_info ENGINE = MyISAM;
//新建表
create table orders(
o_num INT(11) ,
o_date date,
c_id INT(11)
);
//添加主键
alter table orders ADD CONSTRAINT pk_num PRIMARY KEY(o_num) ;
//修改主键字段属性
alter table orders CHANGE o_num o_num int(11) auto_increment;
//添加外键
ALTER TABLE customers_info ENGINE = INNODB;
alter TABLE orders ADD CONSTRAINT fk_id FOREIGN KEY(c_id) REFERENCES customers_info(c_num);
//删除外键
alter table orders drop FOREIGN KEY fk_id;
//删除表
DROP TABLE customers_info;
1.创建数据库MySchool
2. 创建以下数据表
班级表:Grade表
学生表: Student表
科目表:Subjects表
成绩表:Result表
表关系:
create DATABASE MySchool;
use MySchool;
CREATE TABLE Grade(
GradeId INT PRIMARY KEY,
GradeName VARCHAR(50) not null
);
CREATE TABLE Student(
StudentNo VARCHAR(50) PRIMARY KEY,
LoginPwd VARCHAR(50),
STudentName VARCHAR(50),
Sex CHAR(2),
GradeId int,
Phone VARCHAR(255),
Address VARCHAR(255),
BornDate datetime,
Email VARCHAR(50)
);
CREATE TABLE Subjects(
SubjectId INT PRIMARY KEY,
SubjectName VARCHAR(20) NOT NULL,
ClassHour INT NOT NULL,
GradeId INT NOT NULL
);
CREATE TABLE Result(
Id int PRIMARY KEY auto_increment,
StudentNo VARCHAR(50) NOT NULL,
SubjectId INT NOT NULL,
StudentResult int ,
ExamDate datetime NOT NULL
);
ALTER TABLE Subjects ADD CONSTRAINT fk_subject_grade FOREIGN KEY(GradeId) REFERENCES Grade(GradeId);
ALTER TABLE Student ADD CONSTRAINT fk_student_grade FOREIGN KEY(GradeId) REFERENCES Grade(GradeId);
ALTER TABLE Result ADD CONSTRAINT fk_result_student FOREIGN KEY(StudentNo) REFERENCES Student(StudentNo);
ALTER TABLE Result ADD CONSTRAINT fk_result_subject FOREIGN KEY(SubjectId) REFERENCES Subjects(SubjectId);
1.在mysql中,建立外键关联,关联表必须是使用innodb,不然会报错类似于这样:Failed to open the referenced table ‘customers_info’,将数据库引擎更改为innodb即可
2.主键自增,要么在创建表示就添加上,不然就在表创建后使用修改字段属性方式去添加。而且主键自增得在字段被设置为主键时才能设置。
3.添加外键时要自己给外键起名字一般都起名为fk_被添加外键的表表名_关联的表表名,这要比较好找是哪两张表之间的关系。