关系型数据库
1.如何登录数据库?
mysql -uroot -ppassword root(用户名)password(密码)
-
如何查询数据库服务器中所有的数据库?
MariaDB [(none)]> show databases;
±-------------------+
| Database |
±-------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
±-------------------+
4 rows in set (0.00 sec) -
如何选中一个数据库进行操作
use test (选中数据库test)
select * from ; -
如何退出服务器命令?
mysql >\q
Bye -
在数据库服务器中创建数据库?
MariaDB [(none)]> create database student;
Query OK, 1 row affected (0.00 sec) -
如何创建一个数据表?
MariaDB [student]> create table stu(name varchar(11),age varchar(20));
Query OK, 0 rows affected (0.02 sec) -
查看数据库中的数据表?
MariaDB [student]> show tables;
±------------------+
| Tables_in_student |
±------------------+
| stu |
±------------------+
1 row in set (0.00 sec) -
查看数据表的结构
MariaDB [student]> describe stu;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| name | varchar(11) | YES | | NULL | |
| age | varchar(20) | YES | | NULL | |
±------±------------±-----±----±--------±------+
2 rows in set (0.00 sec) -
向数据库中插入数据
MariaDB [student]> insert into stu values(‘l’,‘24’);
Query OK, 1 row affected (0.00 sec) -
查看表中所有数据 ·
MariaDB [student]> select * from stu;
±-----±-----+
| name | age |
±-----±-----+
| 11 | 24 |
| l | 24 |
| liu | 24 |
| lzc | 24 |
| LZC | 24 |
±-----±-----+
5 rows in set (0.00 sec) -
删除一条数据
MariaDB [student]> delete from stu where name=‘l’;
Query OK, 1 row affected (0.00 sec) -
修改数库
MariaDB [student]> update stu set name=‘xxx’ where age=‘24’;
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3 Changed: 3 Warnings: 0
总结一下,数据库常见操作
–增加
insert
–删除
deleate
–修改
update
–查询
select
mysql常用的数据类型
–数值
–日期/时间
–字符串(字符)类型
mysql建表的约束
–主键约束
能够唯一确定一张表中的一条记录,也就是我们通过某个字段添加的约束,就可以使得改字段不重复且不为空。
MariaDB [student]> create table user(id int primary key,name varchar(20));
Query OK, 0 rows affected (0.01 sec)
insert into user values(1,‘张三’);
Query OK, 1 row affected, 1 warning (0.01 sec)
MariaDB [student]> insert into user values(1,‘张三’);
ERROR 1062 (23000): Duplicate entry ‘1’ for key ‘PRIMARY’
重复插入同一id和name会出错 因为id是唯一的。
MariaDB [student]> insert into user values(2,‘张三’);
Query OK, 1 row affected, 1 warning (0.00 sec)
且不为空
MariaDB [student]> insert into user values(null,‘张三’);
ERROR 1048 (23000): Column ‘id’ cannot be null
–联合主键
–只要联合的主键加起来不重复就可以
MariaDB [student]> create table user2(id int,name varchar(20), password varchar(20), primary key(id,name));
Query OK, 0 rows affected (0.03 sec)
MariaDB [student]> insert into user2 values(1,‘zhangsan’‘123’);
ERROR 1136 (21S01): Column count doesn’t match value count at row 1
MariaDB [student]> insert into user2 values(1,‘zhangsan’,‘123’);
Query OK, 1 row affected (0.00 sec)
MariaDB [student]> insert into user2 values(2,‘zhangsan’,‘123’);
Query OK, 1 row affected (0.00 sec)
MariaDB [student]> insert into user2 values(1,‘lisi’,‘123’);
Query OK, 1 row affected (0.00 sec)
–自增约束
MariaDB [student]> create table user3(id int primary key auto_increment, name varchar(20));
Query OK, 0 rows affected (0.01 sec)
MariaDB [student]> insert into user3 (name) values(‘zhangsan’);
Query OK, 1 row affected (0.00 sec)
MariaDB [student]> insert into user3 (name) values(‘zhangsan’);
Query OK, 1 row affected (0.00 sec)
MariaDB [student]> insert into user3 (name) values(‘zhangsan’);
Query OK, 1 row affected (0.00 sec)
MariaDB [student]> select * from user3;
±—±---------+
| id | name |
±—±---------+
| 1 | zhangsan |
| 2 | zhangsan |
| 3 | zhangsan |
±—±---------+
3 rows in set (0.00 sec)
–当创建表的时候,忘记创建主键约束
MariaDB [student]> create table user4(id int, name varchar(20));
Query OK, 0 rows affected (0.01 sec)
MariaDB [student]> desc user4;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
±------±------------±-----±----±--------±------+
2 rows in set (0.00 sec)
修改表结构,添加主键
MariaDB [student]> alter table user4 add primary key(id);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [student]> describe user4;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int(11) | NO | PRI | 0 | |
| name | varchar(20) | YES | | NULL | |
±------±------------±-----±----±--------±------+
2 rows in set (0.00 sec)
–如何删除
MariaDB [student]> alter table user4 drop primary key;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [student]> describe user4;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int(11) | NO | | 0 | |
| name | varchar(20) | YES | | NULL | |
±------±------------±-----±----±--------±------+
2 rows in set (0.00 sec)
–使用modify修改字段添加约束
MariaDB [student]> alter table user4 modify id int primary key;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [student]> describe user4;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
±------±------------±-----±----±--------±------+
2 rows in set (0.00 sec)
–唯一约束
约束修饰字段的值不可以重复
MariaDB [student]> create table user5(id int,name varchar(20));
Query OK, 0 rows affected (0.01 sec)
unique(name) name不可以重复。
MariaDB [student]> alter table user5 add unique(name);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [student]> describe user5;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | UNI | NULL | |
±------±------------±-----±----±--------±------+
2 rows in set (0.00 sec)
MariaDB [student]> insert into user5 values(1,‘zhangsan’);
Query OK, 1 row affected (0.00 sec)
MariaDB [student]> insert into user5 values(1,‘zhangsan’);
ERROR 1062 (23000): Duplicate entry ‘zhangsan’ for key ‘name’
MariaDB [student]> insert into user5 values(1,‘lisi’);
Query OK, 1 row affected (0.00 sec)
直接创建表结构时使用unique(name);
MariaDB [student]> create table user6(id int,name varchar(20),unique(name));
Query OK, 0 rows affected (0.01 sec)
MariaDB [student]> describe user6;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | UNI | NULL | |
±------±------------±-----±----±--------±------+
2 rows in set (0.01 sec)
–删除唯一约束
MariaDB [student]> alter table user6 drop index name;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [student]> describe user6;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
±------±------------±-----±----±--------±------+
2 rows in set (0.00 sec)
–modify添加约束
MariaDB [student]> alter table user6 modify name varchar(20) unique;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [student]> describe user6;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | UNI | NULL | |
±------±------------±-----±----±--------±------+
2 rows in set (0.00 sec)
–非空约束
–修饰的字段不能为NULL
MariaDB [student]> create table user9(id int, name varchar(20) NOT NULL);
Query OK, 0 rows affected (0.01 sec)
MariaDB [student]> desc user9;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | NO | | NULL | |
±------±------------±-----±----±--------±------+
2 rows in set (0.00 sec)
当name为NULL时报错。
MariaDB [student]> insert into user9 values(1,NULL);
ERROR 1048 (23000): Column ‘name’ cannot be null
–默认约束
–插入字段时,如果没有传值就会使用默认参数
MariaDB [student]> create table user10(id int,name varchar(20),age int default 10);
Query OK, 0 rows affected (0.01 sec)
MariaDB [student]> desc user10 ;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| age | int(11) | YES | | 10 | |
±------±------------±-----±----±--------±------+
3 rows in set (0.01 sec)
age默认值时10.
MariaDB [student]> insert into user10 (id, name) values(1,‘zhangsan’);
Query OK, 1 row affected (0.00 sec)
MariaDB [student]> select * from user10;
±-----±---------±-----+
| id | name | age |
±-----±---------±-----+
| 1 | zhangsan | 10 |
±-----±---------±-----+
1 row in set (0.00 sec)
MariaDB [student]> insert into user10 values(1,‘lisi’,26);
Query OK, 1 row affected (0.00 sec)
传入age参数默认值改为传入参数。
MariaDB [student]> select * from user10;
±-----±---------±-----+
| id | name | age |
±-----±---------±-----+
| 1 | zhangsan | 10 |
| 1 | lisi | 26 |
±-----±---------±-----+
2 rows in set (0.00 sec)
–外键约束
–涉及到两个表:主表,副表
–班级表 主表
MariaDB [student]> create table classes(id int primary key,name varchar(20));
Query OK, 0 rows affected (0.01 sec)
MariaDB [student]> desc classes ;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
±------±------------±-----±----±--------±------+
2 rows in set (0.00 sec)
–学生表,副表
MariaDB [student]> create table students(id int primary key,name varchar(20),class_id int,foreign key(class_id) references classes(id));
Query OK, 0 rows affected (0.01 sec)
MariaDB [student]> desc students;
±---------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±---------±------------±-----±----±--------±------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
| class_id | int(11) | YES | MUL | NULL | |
±---------±------------±-----±----±--------±------+
3 rows in set (0.00 sec)
向classes插入数据。
MariaDB [student]> insert into classes values(1,‘yiban’);
Query OK, 1 row affected (0.00 sec)
MariaDB [student]> insert into classes values(2,‘erban’);
Query OK, 1 row affected (0.01 sec)
MariaDB [student]> insert into classes values(3,‘sanban’);
Query OK, 1 row affected (0.00 sec)
MariaDB [student]> insert into classes values(4,‘siban’);
Query OK, 1 row affected (0.00 sec)
MariaDB [student]> select * from classes;
±—±-------+
| id | name |
±—±-------+
| 1 | yiban |
| 2 | erban |
| 3 | sanban |
| 4 | siban |
±—±-------+
4 rows in set (0.00 sec)
向students表中插入数据。
MariaDB [student]> insert into students values(1001,‘zhangsan’,1);
Query OK, 1 row affected (0.00 sec)
MariaDB [student]> insert into students values(1002,‘zhangsan’,2);
Query OK, 1 row affected (0.00 sec)
MariaDB [student]> insert into students values(1003,‘zhangsan’,3);
Query OK, 1 row affected (0.00 sec)
MariaDB [student]> insert into students values(1004,‘zhangsan’,4);
Query OK, 1 row affected (0.00 sec)
MariaDB [student]> select * from students;
±-----±---------±---------+
| id | name | class_id |
±-----±---------±---------+
| 1001 | zhangsan | 1 |
| 1002 | zhangsan | 2 |
| 1003 | zhangsan | 3 |
| 1004 | zhangsan | 4 |
±-----±---------±---------+
4 rows in set (0.00 sec)
MariaDB [student]> insert into students values(1005,‘zhangsan’,5);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (student
.students
, CONSTRAINT students_ibfk_1
FOREIGN KEY (class_id
) REFERENCES classes
(id
))
主表classes中没有的数据值,在副标中,是不可以使用的。
主表中的记录被副表引用,是不可以被删除的。
MariaDB [student]> delete from classes where id=4;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (student
.students
, CONSTRAINT students_ibfk_1
FOREIGN KEY (class_id
) REFERENCES classes
(id
))
数据库的三大设计范式
第一范式(拆字段)
INF
数据表中的所有字段是不可分割的原子值。
范式设计的越详细,对于实际操作可能更好,但并不一定有好处。
第二范式
必须满足第一范式的前提下,第二范式要求,出主键外每一列必须完全依赖。
如果出现不完全依赖只可能发生在联合主键的情况下。
1、订单表(联合主键=>共同组成订单表的主键)
– 订单表
create table myorder(
product_id int,
customer_id int,
product_name varchar(20),
customer_name varchar(20),
primary key(product_id, customer_id) /共同组成订单表的主键/
);
2、订单表问题(不满足2NF)
product_id 只和 product_name 有关;
customer_id 只和 customer_name 有关。
出现了 联合主键,可能会出现一些列 只依赖于 主键的某一部分。
除主键以外的其它列,只依赖于主键的部分字段。
拆表:拆分 为 主表 和 副表
3、拆表
拆分成三个表之后,就满足了第二范式的设计! !
– 订单表
create table myorder(
order_id int primary key,
product_id int, /完全依赖于主键/
customer_id int /完全依赖于主键/
);
– 产品表
create table product(
id int primary key,
name varchar(20) /完全依赖于主键/
);
– 客户表
create table customer(
id int primary key,
name varchar(20) /完全依赖于主键/
);
–第三范式
–必须先满足第二范式,除开主键列的其他列之间不能有传递依赖关系。
create table myorder(
order_id int primary key,
product_id int,
customer_id int, /customer_phone与order_id有关系/
customer_phone varchar(15) /customer_phone与order_id、customer_id有关系 ===》关系冗余!/
);
– 应该这样写! –
– 客户表
create table customer(
id int primary key,
name varchar(20), /完全依赖于主键/
phone varchar(15)
);