MySQL学习笔记(一)

MYSQL是一种开放源代码的关系型数据库管理系统(,使用最常用的数据库管理语言结构化查询语言SQL)进行数据库管理。

一:如何使用终端操作数据库?

1.登录数据库服务器

C:\Users\BCX>mysql -root -p #回车键之后输入密码进入数据库

exit;强制退出数据库
2.查看数据库服务器中所有数据库

show databases;# 数据库中后所有指令都需要以英文分号结尾

3.对一个库进行操作

a.如何创建数据库

  • 创建一个数据库 create database +‘数据库名字’ + character set utf8
  • 其中的character set utf8 用来设定编码,可以防止数据出现乱码
create database test 
#test为库名 注意是create ,不要写成creat了

b.删除一个数据库 drop database + 库名


drop database test;#删除我们刚创建的表 

c.选中一个数据库 use + 库名

use test; # 切换到当前test库中

4.对数据表进行操作

先查看一下 我们当前库中的表:

show tables;
Empty set (0.00 sec)里面没有表

a.创建一个数据表:

mysql> CREATE TABLE pet (      #其中pet是数据表的名字,括号内是数据字段name、owner...
name VARCHAR(20),        #VARCHAR是字符类型 
owner VARCHAR(20),       #括号内是限制字符个数
species VARCHAR(20),
sex CHAR(1),
birth DATE,
death DATE);

b.查看表结构 describe pet;
describe 可以简写称为desc

mysql> describe pet;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name    | varchar(20) | YES  |     | NULL    |       |
| owner   | varchar(20) | YES  |     | NULL    |       |
| species | varchar(20) | YES  |     | NULL    |       |
| sex     | char(1)     | YES  |     | NULL    |       |
| birth   | date        | YES  |     | NULL    |       |
| death   | date        | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
6 rows in set (0.01 sec)

此时表已经存在,但是表中内容为空,可以用mysql> select * from pet;发现Empty set (0.00 sec)确实为空

c.向表中插入数据
insert into 表名 values (按照表结构字段顺序输入);

mysql> insert into pet
    -> values ('puff','bcx','dog','m','1999-03-07',NULL);
Query OK, 1 row affected (0.00 sec)

再次查看表中数据 ,发现数据已经插入了

mysql>select * from pet;
+------+-------+---------+------+------------+-------+
| name | owner | species | sex  | birth      | death |
+------+-------+---------+------+------------+-------+
| puff | bcx   | dog     | m    | 1999-03-07 | NULL  |
+------+-------+---------+------+------------+-------+
1 row in set (0.00 sec)

5 数据库常用的几种类型

大致可以分为 数值,日期,字符
具体类型可参考菜鸟教程:https://www.runoob.com/mysql/mysql-data-types.html

  • 日期:0000-00-00
  • char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符。
  • char定长字符,varchar是变长字符

举个栗子:
看一下数值:TINYINT类型有符号范围为(-128,127);这里创建一个表,插入数据时要看之前创建表时所用到的类型的范围,超过范围就会报错。

创建一个表
mysql> CREATE TABLE testType(
    -> number TINYINT
    -> );        
Query OK, 0 rows affected (0.98 sec)


#添加内容(127在范围内)
mysql> INSERT INTO testType VALUES(127);
Query OK, 1 row affected (0.57 sec)
mysql> select * from testType;     
+--------+
| number |
+--------+
|    127 |
+--------+
1 row in set (0.00 sec)


当添加128时会报错,注意范围!
mysql> INSERT INTO testType VALUES (128);   
ERROR 1264 (22003): Out of range value for column 'number' at row 1`

总结:日期看格式,数值和字符看大小。

6.如何对数据表进行删除和修改?

a.删除数据
先在之前的数据表中准备一些数据

mysql> insert into pet
    -> values ('旺财','周星驰','狗','公','1987-3-19',NULL);
Query OK, 1 row affected (0.00 sec)
mysql> insert into pet
    -> values ('旺财','周星驰','狗','公','1987-3-19',NULL);
Query OK, 1 row affected (0.00 sec)

此时表中数据为:

mysql> select * from pet;
+------+--------+---------+------+------------+-------+
| name | owner  | species | sex  | birth      | death |
+------+--------+---------+------+------------+-------+
| puff | bcx    | dog     | m    | 1999-03-07 | NULL  |
| 旺财 | 周星驰 ||| 1987-03-19 | NULL  |
| 旺财 | 周星驰 ||| 1987-03-19 | NULL  |
+------+--------+---------+------+------------+-------+
3 rows in set (0.00 sec)

旺财的数据重复了,删除name 为旺财的数据

mysql> delete from pet where name = '旺财';
Query OK, 2 rows affected (0.01 sec)

mysql> select * from pet;
+------+-------+---------+------+------------+-------+
| name | owner | species | sex  | birth      | death |
+------+-------+---------+------+------------+-------+
| puff | bcx   | dog     | m    | 1999-03-07 | NULL  |
+------+-------+---------+------+------------+-------+
1 row in set (0.00 sec)

注意:这里因为是根据name删除的,所以会删除所有name值匹配的数据,也可加id,再根据id进行删除就只会删除对应id的一条数据

b.修改操作

update 表名 set name= ‘汪汪财’ where owner =‘周星驰’(根据where后面的owner来定位修改name的值);

mysql> update pet set name= '汪汪财' where owner ='周星驰';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from pet;
+--------+--------+---------+------+------------+-------+
| name   | owner  | species | sex  | birth      | death |
+--------+--------+---------+------+------------+-------+
| puff   | bcx    | dog     | m    | 1999-03-07 | NULL  |
| 汪汪财 | 周星驰 ||| 1987-03-19 | NULL  |
+--------+--------+---------+------+------------+-------+
2 rows in set (0.00 sec)

小结:数据记录的常见操作(CURD)

insert 增
delete 删
updata 改
select 查

二 .MYSQL建表约束

约束包括:(主键约束)(自增约束),(外键约束),(唯一约束),(非空约束),(默认约束)

1.主键约束 ( primary key)唯一确定

他能够唯一确定一张表中的一条记录,我们通过给一个字段增加约束,就可以使这个字段不重复且不为空

  • 创建一个表,给id这个字段加上主键约束
mysql> create table user(id int primary key,name char(20));
Query OK, 0 rows affected (0.02 sec)

可以看到id的key栏显示PRI
mysql> describe user;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | NO   | PRI | NULL    |       |
| name  | char(20) | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
  • 给表中插入数据,当id重复或者为空时就会报错
mysql> insert into user values (1,'王');
Query OK, 1 row affected (0.01 sec)

id重复会报错
mysql> insert into user values (1,'王');
ERROR 1062 (23000): Duplicate entry '1' for key 
'PRIMARY'

name重复不会报错,因为name没有约束
mysql> insert into user values (2,'王');
Query OK, 1 row affected (0.00 sec)

id为空会报错
mysql> insert into user values (null,'王');
ERROR 1048 (23000): Column 'id' cannot be null

常与主键约束在一起使用:
联合主键的关系,只要了联合主键中有一个不重复即可,但是任何一个键都不允许为空

对id和name使用联合主键约束
mysql> create table user3 (id int,name char(20),password char(20),primary key(id,name));
Query OK, 0 rows affected (0.02 sec)

可以看到表结构中对于id和name和nullkey的设定
mysql> desc user3;
+----------+----------+------+-----+---------+-------+
| Field    | Type     | Null | Key | Default | Extra |
+----------+----------+------+-----+---------+-------+
| id       | int(11)  | NO   | PRI | NULL    |       |
| name     | char(20) | NO   | PRI | NULL    |       |
| password | char(20) | YES  |     | NULL    |       |
+----------+----------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> insert into user3 values(1,'张三','123');
Query OK, 1 row affected (0.01 sec)

id和姓名都重复,插入失败
mysql> insert into user3 values(1,'张三','123');
ERROR 1062 (23000): Duplicate entry '1-张三' for key 'PRIMARY'

id重复但姓名不重复。插入成功
mysql> insert into user3 values(1,'李四','123');
Query OK, 1 row affected (0.00 sec)

姓名重复但id不重复,插入成功
mysql> insert into user3 values(2,'张三','123');
Query OK, 1 row affected (0.00 sec)

id和name任一为null,则都不成功
mysql> insert into user3 values(null,'张三','123');
ERROR 1048 (23000): Column 'id' cannot be null
mysql> insert into user3 values(1,null,'123');
ERROR 1048 (23000): Column 'name' cannot be null

这里手误给NULL加了‘’,所以把NULL识别成名字了
mysql> insert into user3 values(1,'NULL','123');
Query OK, 1 row affected (0.00 sec)

经过上操作后,看一下表中内容,联合主键约束中只要有一个不重复即可

mysql> select * from user3;
+----+------+----------+
| id | name | password |
+----+------+----------+
|  1 | NULL | 123      |
|  1 | 张三 | 123      |
|  1 | 李四 | 123      |
|  2 | 张三 | 123      |
+----+------+----------+
4 rows in set (0.00 sec)

联合主键:使用多个字段一起作为一个表的主键。

2.自增约束 auto_increment 帮助我们自动管理数据,常与主键约束相结合
对id进行主键约束和自增约束
自动管理id值进行增长
mysql> create table user4 (id int primary key auto_increment,name varchar(20));
Query OK, 0 rows affected (0.03 sec)


指定向name中插入指定字段,而id会自动生成并且依次增加
注意user4和(name)中间并没有空格
mysql> insert into user4(name) values ('张三');
Query OK, 1 row affected (0.00 sec)

mysql> insert into user4(name) values ('李四');
Query OK, 1 row affected (0.01 sec)

mysql> insert into user4(name) values ('李四');
Query OK, 1 row affected (0.00 sec)

mysql> insert into user4(name) values ('王麻子');
Query OK, 1 row affected (0.00 sec)

可以看到我们插入数据时,并未指定id,但id却自动增长了
mysql> select * from user4;
+----+--------+
| id | name   |
+----+--------+
|  1 | 张三   |
|  2 | 李四   |
|  3 | 李四   |
|  4 | 王麻子 |
+----+--------+
4 rows in set (0.00 sec)

注:

  • 虽然对id进行了主键约束,但是搭配了自增约束,所以id会自动增长。
  • 如果插入未指定id的具体值写成DEFAULT或者NULL(像上例中),那么在以后的插入操作中,自增字段就是从1开始依次增1.
  • 如果首次插入已经给了初始值,那么在以后的插入中,自增字段会在第一条记录的基础上依次加1
修改删除主键操作

a.若建表的时候,忘了设主键 怎么整?
alter table 表名 add primary key (对应字段);

未在创建表时指定主键
mysql> create table user2 (id int,name char(20),password char(20));
Query OK, 0 rows affected (0.02 sec)

查看表结构,key栏为空
mysql> desc user2;
+----------+----------+------+-----+---------+-------+
| Field    | Type     | Null | Key | Default | Extra |
+----------+----------+------+-----+---------+-------+
| id       | int(11)  | YES  |     | NULL    |       |
| name     | char(20) | YES  |     | NULL    |       |
| password | char(20) | YES  |     | NULL    |       |
+----------+----------+------+-----+---------+-------+
3 rows in set (0.00 sec)

增加主键

给id这个字段增加主键约束
mysql> alter table user2 add primary key (id);
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

此时key栏为PRI
mysql> desc user2;
+----------+----------+------+-----+---------+-------+
| Field    | Type     | Null | Key | Default | Extra |
+----------+----------+------+-----+---------+-------+
| id       | int(11)  | NO   | PRI | NULL    |       |
| name     | char(20) | YES  |     | NULL    |       |
| password | char(20) | YES  |     | NULL    |       |
+----------+----------+------+-----+---------+-------+
3 rows in set (0.00 sec)

b.添加主键之后怎么删除?
alter table 表名 drop primary key;//会删除所有主键约束

(这里没发指定值删除一个主键)

mysql> alter table user2 drop primary key ;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0


id的key栏已经为空了
mysql> desc user2;
+----------+----------+------+-----+---------+-------+
| Field    | Type     | Null | Key | Default | Extra |
+----------+----------+------+-----+---------+-------+
| id       | int(11)  | NO   |     | NULL    |       |
| name     | char(20) | YES  |     | NULL    |       |
| password | char(20) | YES  |     | NULL    |       |
+----------+----------+------+-----+---------+-------+
3 rows in set (0.00 sec)

如何修改主键?(了解即可)
alter table 表名 modify id int primary key;

3.唯一约束 (unique) 约束修饰的字段的值不可以重复

创建一张表,再添加唯一约束

创建表的时候没有给约束
mysql> create table user5(     
    -> id int,
    -> name varchar(20)
    -> );
Query OK, 0 rows affected (0.66 sec)

添加一个唯一约束
mysql> alter table user5 add unique(name); 

查看key栏
mysql> desc 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)



也可以在创建表的时候就设置唯一约束

对name字段进行唯一约束设置
mysql> create table user6(
    -> id int,
    -> name varchar(20),
    -> unique(name)
    -> );
Query OK, 0 rows affected (0.87 sec)

查看key栏
mysql> desc 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)

name栏的key值为UNI,代表唯一约束,所以在后续插入数据中name的值是不能重复的。

mysql> insert into user6 values (1,'张三');
Query OK, 1 row affected (0.00 sec)

姓名重复插入失败
mysql> insert into user6 values (2,'张三');
ERROR 1062 (23000): Duplicate entry '张三' for key 'name'
id重复姓名不重复,插入成功
mysql> insert into user6 values (2,'李四');
Query OK, 1 row affected (0.00 sec)

唯一主键的设置方式除了上述例子还有:
a.直接写在字段屁股后面

对name进行唯一约束
mysql> create table user7 (id int,name varchar(20),unique(name));
Query OK, 0 rows affected (0.02 sec)


mysql> desc user7;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(20) | YES  | UNI | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

b.类似于联合主键,也是或的关系

对id和name进行联合唯一约束
mysql> create table user8 (id int,name varchar(20),unique(id,name));
Query OK, 0 rows affected (0.02 sec)

id的key显示为MUL,多重
mysql> desc user8;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  | MUL | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

这样看的话,就是分类似于我们第一条主键约束
那这两者的区别?

  • 主键约束搭配联合约束,任一受约束字段都不能为空
  • 而唯一约束允许一个约束字段为null,这样也满足唯一性。
  • 相同之处是都不可以重复

注:

  • 使用这样的方式:unique(id,name)类似于联合主键的方式,两者重复性为或的关系
  • 但当我们分别对这两个字段进行unique设置时,那么这两个字段后期插入的值就都不能够重复,但是可以为null。
对id name 分别进行唯一约束
mysql> create table user12(
    -> id int unique,
    -> name varchar(20) unique);
Query OK, 0 rows affected (0.02 sec)

mysql> desc user12;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  | UNI | NULL    |       |
| name  | varchar(20) | YES  | UNI | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

mysql> insert into user12 values(1,'张三');
Query OK, 1 row affected (0.00 sec)

id name都重复
mysql> insert into user12 values(1,'张三');
ERROR 1062 (23000): Duplicate entry '1' for key 'id'

name重复
mysql> insert into user12 values(2,'张三');
ERROR 1062 (23000): Duplicate entry '张三' for key 'name

id不重复 name为null
mysql> insert into user12 values(3,null);
Query OK, 1 row affected (0.00 sec)

id为null 那么不重复
mysql> insert into user12 values(null,'王五');
Query OK, 1 row affected (0.00 sec)

当插入字段为null时,唯一约束中是可以存在多个null值的!!!

mysql> insert into user12 values(null,'王五');
Query OK, 1 row affected (0.00 sec)

mysql> insert into user12 values(null,'zhaos');
Query OK, 1 row affected (0.00 sec)

mysql> desc user12;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  | UNI | NULL    |       |
| name  | varchar(20) | YES  | UNI | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> select * from user12;
+------+-------+
| id   | name  |
+------+-------+
|    1 | 张三  |
|    2 | null  |
|    3 | NULL  |
| NULL | 王五  |
| NULL | zhaos |
+------+-------+
5 rows in set (0.00 sec)
4.非空约束 (not null)修饰的字段不能为空
mysql> create table user9 (
    -> id int ,
    -> name varchar(20) not null);
Query OK, 0 rows affected (0.02 sec)

可以看到name值不能为null
mysql> 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)

只给id进行插入,此时name未赋值并且name没有默认值,报错
mysql> insert into user9(id) values(1);
ERROR 1364 (HY000): Field 'name' doesn't have a default value

只对name进行赋值,id可以为null,插入成功
mysql> insert into user9 (name) values ('张三');
Query OK, 1 row affected (0.00 sec)

mysql> select * from user9;
+------+------+
| id   | name |
+------+------+
| NULL | 张三 |
+------+------+
1 row in set (0.00 sec)
5.默认约束(default) 当我们插入字段时,如果没有进行赋值,该受默认约束的字段就会使用默认值
mysql> create table user10 (
    -> id int,
    -> name varchar(20),
    -> age int default 40);
Query OK, 0 rows affected (0.02 sec)

当有传值时,使用插入的值
mysql> insert into user10 values (1,'张三',60);
Query OK, 1 row affected (0.01 sec)

当未传值时,使用默认值
mysql> insert into user10 (id,name) values (1,'李四');
Query OK, 1 row affected (0.00 sec)

mysql> select * from user10;
+------+------+------+
| id   | name | age  |
+------+------+------+
|    1 | 张三 |   60 |
|    1 | 李四 |   40 |
+------+------+------+
2 rows in set (0.00 sec)
6.外键约束 (foreign key (子表) references (父表))

两个表,主表&副表 / 父表&子表
在一个表中引用另一个表的字段,在增加和删除数据时会受到父表的约束。

来个栗子看看趴,注意 子表中class_id 和父表中 id在最初定义时就要类型相同

父表:班级表
mysql>  create table classes(
    -> id int primary key,
    -> name varchar(20));
Query OK, 0 rows affected (0.04 sec)

子表:学生表
mysql> 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.02 sec)

因为外键约束的存在:子表中class_id 必须来自父表中 id字段

给父表中插入信息
mysql> insert into classes values(1,'一班');
Query OK, 1 row affected (0.00 sec)

mysql> insert into classes values(2,'二班');
Query OK, 1 row affected (0.00 sec)

mysql> insert into classes values(3,'三班');
Query OK, 1 row affected (0.00 sec)

mysql> select * from classes;
+----+------+
| id | name |
+----+------+
|  1 | 一班 |
|  2 | 二班 |
|  3 | 三班 |
+----+------+
3 rows in set (0.00 sec)

此时子表中的class_id只能是父表中的id字段
mysql> insert into students values(1,'张三',1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into students values(2,'李四',2);
Query OK, 1 row affected (0.00 sec)

mysql> insert into students values(3,'王五',3);
Query OK, 1 row affected (0.00 sec)


5在父表id中并没有,所以插入失败
mysql> insert into students values(3,'王五',5);
ERROR 1062 (23000): Duplicate entry '3' for key 'PRIMARY'

小结:

  1. 当主表中没有数据值时,在副表中是不能够被使用的
5在父表id中并没有,所以插入失败
mysql> insert into students values(3,'王五',5);
ERROR 1062 (23000): Duplicate entry '3' for key 'PRIMARY'

2.当主表中的记录被副表引用时,主表中被引用的字段时不能被删除的。

id为3的字段已经被子表引用了,所以删除失败
mysql> delete from classes where id=3;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`students`, CONSTRAINT `students_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `classes` (`id`))

学习视频:https://www.bilibili.com/video/BV1Vt411z7wy?t=56&p=19 (老师的川普依旧很搞笑)
参考博客:https://blog.csdn.net/qq_44483394/article/details/96489065

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值