本笔记来自bilibili:一天学会 MySQL 数据库
以及参考某位大佬的笔记
MySQL数据库使用笔记(一):终端使用与约束
MySQL数据库使用笔记(二):范式设计
MySQL数据库使用笔记(三):查询练习
MySQL数据库使用笔记(四):链接查询与事务
MySQL数据库使用笔记(一):终端使用与约束
如何使用终端操作数据库?
如何登陆数据库服务器?
windows安装完MySql之后,点击下图,输入密码即可进入。
如何查询数据库服务器中所有的数据库?
输入:show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| bilibili |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.02 sec)
如何选择数据库?
输入:use test;
输出:Database changed
如何查看该数据库中有哪些表?
输入:show tables;
输出:Empty set (0.00 sec)
如何查询表中的数据?
输入:select * from tableName;
如何退出数据库服务器?
输入:exit;
如何在数据库服务器中创建自己的数据库?
输入:create database databaseName;
如何创建一个数据表? 创建一个pet表
输入:
CREATE TABLE pet(
name VARCHAR(20),
owner VARCHAR(20),
specise VARCHAR(20),
sex CHAR(1),
brith DATE,
death DATE );
注意事项:
- 1:var()与varchar()的区别在于var()是定常的,哪怕存储的字符串没有达到"()“中数字的上限,var()依然会占用空格来填充空间.
而varchar()则是不定长的,没有达到”()"中的上限则会自动去掉后面的空格; - 2:性别不要用:sex 要用:gender 一个是性 一个是性别;
- 3:定义最后一个字段的时候不要加",";
- 4:上面的"VAR",“VARCHAR”,"DATE"可以用小写.不过最好用大写来表示区分关键字,若不然也许写到后面你自己都不知道这个词是数据库中的关键字还是你自己自定义的一些数据,同时一定要用英文的标点符号也必须半角输入
如何查看数据表的架构?
输入:describe pet;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name | varchar(20) | YES | | NULL | |
| owner | varchar(20) | YES | | NULL | |
| specise | varchar(20) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
| brith | date | YES | | NULL | |
| death | date | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
6 rows in set (0.02 sec)
如何插入数据?
输入:INSERT INTO pet VALUES('black','jack','dog','1','2020-05-29',null);
输出:Query OK, 1 row affected (0.02 sec)
- NULL:代表的是空,表示该字段还没有数据.千万不要主动填写’NULL’,这代表你的字段有一个值叫做
'null'
. - 还有一种写法:
INSERT INTO pet(name,owner) VALUES ('xx','cc');
。代表我只在name和owner字段上面插入的一条,其他皆为NULL/默认值的数据
查看刚刚插入的数据:select * from pet;
+-------+-------+---------+------+------------+-------+
| name | owner | specise | sex | brith | death |
+-------+-------+---------+------+------------+-------+
| kk | cc | dog | 1 | 1998-08-02 | NULL |
| black | jack | dog | 1 | 2020-05-29 | NULL |
+-------+-------+---------+------+------------+-------+
2 rows in set (0.00 sec)
mysql 常用数据类型
(来自菜鸟教程)
MySQL中定义数据字段的类型对你数据库的优化是非常重要的。
MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
- 数值类型
- 日期和时间类型
- 字符串类型
如何删除/修改数据
首先插入数据:
INSERT INTO pet VALUES('n1','o1','dog1','1','2020-1-2',null);
INSERT INTO pet VALUES('n2','o2','dog2','0','2020-2-2',null);
INSERT INTO pet VALUES('n3','o3','dog3','1','2020-3-2','2020-12-2');
INSERT INTO pet VALUES('n4','o4','dog4','0','2020-4-2',null);
-
删除语句:
delete from tablesName where 条件;
比如:delete from pet where name='n1';
-
修改数据:
update tableName set 字段1=值1,字段2=值2 ... where 条件;
比如:update pet set name='newn2' where name='n2';
数据记录常见操作?
- 增加:
INSERT
- 删除:
DELETE
- 修改:
UPDATE
- 查询:
SELECT
mysql建表中的约束
1.主键约束:
它能够唯一确定一张表中的一条记录,增加主键约束之后,就可以使得字段不重复而且不为空 。
先创建一个表:
create table user(
id int PRIMARY KEY,
name VARCHAR(20)
);
查看表的描述:describe user;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.04 sec)
插入数据:INSERT INTO user VALUES (1,'张三');
再次插入报错:ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
。这是PRIMARY KEY
造成的,所有可以改成:INSERT INTO user VALUES (2,'张三');
插入完后查看:select * from user;
+----+------+
| id | name |
+----+------+
| 1 | 张三 |
| 2 | 张三 |
+----+------+
其实id
是不可以为null
而且 key的值 也变为:PRI(primary)。
2.联合主键:
只要联合的主键值加起来不重复就可以
CREATE TABLE user2(
id INT,
name VARCHAR(20),
password VARCHAR(20),
PRIMARY key(id,name)
);
这里把id
和name
进行联合约束。
查看表的描述:describe user2;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | 0 | |
| name | varchar(20) | NO | PRI | | |
| password | varchar(20) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
插入数据:
INSERT INTO user2 VALUES (1,'老王','123456');
INSERT INTO user2 VALUES (2,'老王','123456');
INSERT INTO user2 VALUES (1,'老李','123456');
查看数据:SELECT * FROM user2;
+----+------+----------+
| id | name | password |
+----+------+----------+
| 1 | 老李 | 123456 |
| 1 | 老王 | 123456 |
| 2 | 老王 | 123456 |
+----+------+----------+
3.自增约束
先创建一个表:
CREATE TABLE user3(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20)
);
查看描述:describe user3;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
插入数据:INSERT INTO user3(name) VALUES('张三');INSERT INTO user3(name) VALUES('李四');
查看数据:SELECT * FROM user3;
+----+------+
| id | name |
+----+------+
| 1 | 张三 |
| 2 | 李四 |
+----+------+
没有自定义id
值 但是自动生成了id
,并且id
自增。
- 如果说我们创建表的时候,忘记创建主键约束了?改怎么办?
create table user4 (
id int,
name varchar(20 )
);
alter table user4 add primary key(id);
- 使用modify 修改字段,添加约束
alter table user4 modify id int primary key;
4.唯一约束:
约束修饰的字段的值不可以重复
创建表:
CREATE TABLE user5(
id INT ,
name VARCHAR(20)
);
新增name为唯一约束:alter table user5 add unique(name);
查看表:describe user5;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | UNI | NULL | |
+-------+-------------+------+-----+---------+-------+
name那个地方有了UNI
。
插入数据:insert into user5 values(1, 'jack');
,再次插入,报错:ERROR 1062 (23000): Duplicate entry 'jack' for key 'name'
,修改name
值,再次插入:insert into user5 values(1, 'rose');
查看数据:select * from user5;
+------+------+
| id | name |
+------+------+
| 1 | jack |
| 1 | rose |
+------+------+
- 如何删除一个约束?
alter table tablename drop index name ;
- modify添加约束:
alter table tablename modify name varchar(20) unique;
总结一下:
- 1、建表的时候就添加约束
- 2、可以使用alter。。。add。。。。添加约束
- 3、alter。。。modif。。。添加约束
- 4、删除约束alter。。。。drop。。。
主键约束(primary key)中包含了唯一约束
场景:业务需求:设计一张用户注册表,用户姓名必须要用手机号来注册,而且手机号和用户名称都不能为空,那么:
CREATE TABLE user_test(
id INT PRIMARY KEY AUTO_INCREMENT COMMENT'主键id',
name VARCHAR(20) NOT NULL COMMENT'用户姓名,不能为空',
phone_number VARCHAR(20) UNIQUE NOT NULL COMMENT'用户手机,不能重复且不能为空'
);
运行 DESCRIBE user_test;
+--------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| phone_number | int(11) | NO | UNI | NULL | |
+--------------+-------------+------+-----+---------+----------------+
这样的话就达到了每一个手机号都只能出现一次,达到了每个手机号只能被注册一次.
用户姓名可以重复,但是手机号码却不能重复,复合正常的逻辑需求。
5.非空约束
修饰的字段不能为空NULL
创建表:
CREATE TABLE user9(
id INT ,
name VARCHAR(20) NOT NULL
);
查看表:desc user9;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | NO | | NULL | |
+-------+-------------+------+-----+---------+-------+
插入数据:insert into user9 (id) values(1);
报错:ERROR 1364 (HY000): Field 'name' doesn't have a default value
。
重新插入:
insert into user9 values(1,'张三');
insert into user9 (name) values('jack');
查看数据:select * from user9;
+------+------+
| id | name |
+------+------+
| 1 | 张三 |
| NULL | jack |
+------+------+
6.默认约束
当插入字段值的时候,如果没有传值,就会使用默认值
创建表:
CREATE TABLE user10(
id INT ,
name VARCHAR(20),
age int default 10
);
查看表:desc user10;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| age | int(11) | YES | | 10 | |
+-------+-------------+------+-----+---------+-------+
插入数据:insert into user10 (id, name) values(1, 'zhangsan' ) ;
查看数据:select * from user10;
+------+----------+------+
| id | name | age |
+------+----------+------+
| 1 | zhangsan | 10 |
+------+----------+------+
其中age
为默认值10
传了值,就不会使用默认值:insert into user10 values(1, 'zhangsan', 19);
+------+----------+------+
| id | name | age |
+------+----------+------+
| 1 | zhangsan | 10 |
| 1 | zhangsan | 19 |
+------+----------+------+
应用场景:
业务需求:找正常的用户,对这些正常用户进行发放优惠卷或者积分之类的东西,而被禁封的用户我们不让其参加多动.
我们想要封用户只要将status的值从0改为1就行了,当然我们取用户的时候必须要先判断status是否是0.若是1.说明该用户已经被禁封.
先封手机号为’1234’的用户:
UPDATE user6 SET status = 1 WHERE phone_number= '1234';
SELECT * FROM user6;
+----+------+--------------+--------+
| id | name | phone_number | status |
+----+------+--------------+--------+
| 1 | aa | 123 | 0 |
| 2 | bb | 1234 | 1 |
| 3 | cc | 1263456 | 0 |
+----+------+--------------+--------+
status为1,说明用户已经被封,该用户不可以参加活动
我们取用户的时候加上status的判断,如:
SELECT * FROM user6 WHERE status = 0;
+----+------+--------------+--------+
| id | name | phone_number | status |
+----+------+--------------+--------+
| 1 | aa | 123 | 0 |
| 3 | cc | 1263456 | 0 |
+----+------+--------------+--------+
7.外键约束
涉及到两个表:父表,子表(主表,副表)。
创建班级表:
CREATE TABLE classes(
id INT PRIMARY KEY AUTO_INCREMENT COMMENT'班级表id',
name VARCHAR(20) COMMENT'班级名称'
);
查看班级表:
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
创建学生表:desc classes;
CREATE TABLE student(
id INT PRIMARY KEY AUTO_INCREMENT COMMENT'学生表id',
name VARCHAR(20) COMMENT'学生姓名',
class_id int COMMENT'教室id,这张表中的class_id是classes表中id的值',
FOREIGN KEY (class_id) REFERENCES classes(id)
);
//FOREIGN :外来 REFERENCES:应用,参考
查看学生表:desc student;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | | NULL | |
| class_id | int(11) | YES | MUL | NULL | |
+----------+-------------+------+-----+---------+----------------+
classes
表插入数据:
insert into classes values(1,'一班');
insert into classes values(2,'二班');
insert into classes values(3,'三班');
insert into classes values(4,'四班');
查看数据:select * from classes;
+----+------+
| id | name |
+----+------+
| 1 | 一班 |
| 2 | 二班 |
| 3 | 三班 |
| 4 | 四班 |
+----+------+
student
表插入数据:
insert into student values(1001, '张三', 1);
insert into student values(1002, '张三', 2);
insert into student values(1003, '张三', 3);
insert into student values(1004, '张三' ,4);
查看student数据:select * from student;
+------+------+----------+
| id | name | class_id |
+------+------+----------+
| 1001 | 张三 | 1 |
| 1002 | 张三 | 2 |
| 1003 | 张三 | 3 |
| 1004 | 张三 | 4 |
+------+------+----------+
再次插入数据:insert into student values(1005, 'jack' ,5);
报错:
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`bilibili`.`student`, CONSTRAINT `student_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `classes` (`id`))
classes
表中没有班级5
,所有student
不可能有班级5
。
删除数据:delete from classes where id=4;
报错:
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`bilibili`.`student`, CONSTRAINT `student_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `classes` (`id`))
这是因为student
中已经创建了class_id = 4
的数据,所以class
不能删除。
总结一下:
- 1.主表
classes
中没有的数据值,在副表中,是不可以使用的。 - 2.主表(父表)中的记录被副表(子表)引用,是不可以被删除的。
- 3.若要想删除,先将附表中的数据删除在删除主表数据
- 4.对于外键约束大家可以联想 省,市 来进行联想 (市必须要依赖于省,只要省还有一个市在引用,那么就不可以删除省,要不然市就没有省了. 那么我们想删除省,必须要将该省下所有的市全部删除之后,才可以删除这个省)
8.如何建表之后添加主键约束
CREATE TABLE user4(
id INT,
name VARCHAR(20)
);
运行DESCRIBE user4;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
加入主键约束:
ALTER TABLE user4 add PRIMARY KEY(id);
再次运行DESCRIBE user4;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
删除主键约束:
ALERT TABLE user4 DROP PRIMARY KEY;
运行DESCRIBE user4
查看表结构:
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
使用modify 修改字段.添加约束:
ALTER TABLE user4 MODIFY id INT PRIMARY key;
使用DESCRIBE user4
查看表结构:
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
给主键设置自增长:
ALTER TABLE user4 MODIFY id INT AUTO_INCREMENT;
运行 DESCRIBE user4
查看表结构:
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+