MySQL 学习笔记(一)

MySQL 学习笔记(一)

本人从今天开始学习mysql数据库,目前学习数据库主要为了完成一个小项目,想利用暑假时间突击一下,希望通过这种方式记录一下进步。持续更新

(2019.7.19)

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

1、如何登陆数据库服务器?

先前已经在系统的环境变量中配置过了数据库,使用win10操作系统,调出cmd
输入:
C:\Windows\system32> net start mysql  用来启动数据库

C:\Windows\system32> mysql -uroot -p 用来登陆数据库,回车后输入密码可进入数据库

mysql> exit 用来退出数据库(命令用大写和小写都可以,关键字一般都大写)

2 、如何查询数据库服务器中所有数据库?

输入 mysql> show databases; 注意最后的分号 ; 不要丢

3、如何选中某一个数据库进行操作?
Ps:在这之前我们先了解一下怎么创建、删除数据库

a、创建一个数据库 create database +‘数据库名字’ + character set utf8
mysql> create database `test` character set utf8;

  • 其中的character set utf8 用来设定编码,可以防止数据出现乱码*
  • 注意这里 数据库的名字 用键盘上Esc下面那个在英文模式下的单引号括起来!!!

b、删除一个数据库 drop databases + 数据库的名字 ;
mysql> drop databases test; 删除我们刚才创建的表

  • 注意删除时数据库不要用单引号括起来!!!

这时候已经可以创建删除数据库了,再把刚才的数据库创建回来,对这个test数据库操作前需要 mysql> use test; 我们就选中了这个数据库

4、数据表

a、查看一下我们这个数据库里面的表 mysql> show tables;
显然结果是: Empty set (0.00 sec)里面没有表

b、创建一个数据表

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

表就创建好了,再 show table;可以看到我们创建的表。

c、查看数据表的结构 mysql> describe pet;   #其中describe可以简写成desc

d、查看数据表中的记录 mysql> select * from pet;   #selsct表示查询,*表示所有,from指查询的表   显然返回时空的

e、向数据表中添加数据记录,方法为 INSERT INTO + 表名


mysql> INSERT INTO pet     
    -> VALUES('xiaoming','father','human','m','1999-01-23',NULL);  #按照数据字段的顺序输入
Query OK, 1 row affected (0.73 sec)

OK~添加成功,再 select * from pet ;看一眼,果然添加进去了

最后再皮一下 ~ ~

mysql> INSERT INTO pet
    -> VALUES('蔡徐坤','篮球','人','公','1998-08-08',NULL);
Query OK, 1 row affected (0.63 sec)

mysql> select * from pet;
+-----------+--------+---------+------+------------+-------+
| name      | owner  | species | sex  | birth      | death |
+-----------+--------+---------+------+------------+-------+
| xiaoming  | father | human   | m    | 1999-01-23 | NULL  |
| 蔡徐坤    | 篮球   | 人      | 公   | 1998-08-08 | NULL  |
+-----------+--------+---------+------+------------+-------+
2 rows in set (0.00 sec)

今天就先写到这里啦,明天继续接着写 ~

(2019.7.20)

5、mysql常用的数据类型?

mysql支持多种类型,大致分为三类:数值、日期/时间、字符串(字符)类型。

a数值
  这里参考 [ https://www.runoob.com/mysql/mysql-data-types.html ]菜鸟教程里面的内容
里面有各种数据类型,和它的取值范围;举例如下:
还是用昨天建立的数据库 text ,use它,再show tables看一下

mysql> use test;
Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| pet            |
+----------------+
1 row in set (0.01 sec)

由资料可是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

b日期和时间
具体格式看菜鸟教程中的格式进行输入

c字符串
参考菜鸟教程

总之一句话:数值、字符串按照大小,日期时间按照格式.
6、如何删除、修改数据?

a删除数据
首先我们先添加点数据进去

mysql> select * from pet;
+-----------+-----------+---------+------+------------+-------+
| name      | owner     | species | sex  | birth      | death |
+-----------+-----------+---------+------+------------+-------+
| xiaoming  | father    | human   | m    | 1999-01-23 | NULL  |
| 蔡徐坤    | 篮球      | 人      | 公   | 1998-08-08 | NULL  |
| 张三      | 小明    | 人      | 公   | 2019-07-15 | NULL  |
| 李四      | 小明    | 人      | 公   | 2019-07-16 | NULL  |
| 王二娘    | 小明   | 人      | 雌   | 2019-07-20 | NULL  |
| 王二娘    | 小明   | 人      | 雌   | 2019-07-20 | NULL  |
+-----------+-----------+---------+------+------------+-------+
6 rows in set (0.00 sec)

王二娘重复了,执行命令 `mysql> delete from + 表 + where name=’ 要删除的数据 ’ ;

mysql> delete from pet where name='王二娘';
Query OK, 2 rows affected (0.17 sec)

再看一眼表,发现所有关于王二娘的信息都没有了,无奈再加进去…(加上id可以只删除其中一个,后期补上)
b修改数据
假如我们要修改蔡徐坤的性别 mysql> update pet set sex='雌' where name='蔡徐坤';
通过name来进行定位修改sex !!

小结一下:数据记录的常见操作: (增删改查)

增加:INSERT
删除:DELETE
修改: UPDATE
查询:SELECT

二、mysql约束建表

约束包括:(主键约束、自增约束),(外键约束),(唯一约束),(非空约束),(默认约束)
1主键约束
它能够唯一确定一张表中的一条记录,也就是我们给某个字段添加约束,就可以使得该字段不重复且不为空。

mysql> create table user(
    -> id int primary key,      #添加一个主键约束
    -> name varchar(20)
    -> );
Query OK, 0 rows affected (0.88 sec)

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| pet            |
| testtype       |
| user           |
+----------------+
3 rows in set (0.01 sec)

向表里添加数据:

mysql> INSERT INTO user VALUES(1,'吴亦凡');
Query OK, 1 row affected (0.62 sec)

# 但是再输入相同的内容时,mysql会提示你重复了,因为有了主键约束!!
mysql> INSERT INTO user VALUES(1,'吴亦凡');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

这样就可以添加了
mysql> INSERT INTO user VALUES(2,'吴亦凡');
Query OK, 1 row affected (0.17 sec)

那么id可不可以为空呢?

mysql> INSERT INTO user VALUES(NULL,'吴亦凡');
ERROR 1048 (23000): Column 'id' cannot be null

当然不可以为空,主建约束可是为了唯一确定一张表中的一条记录,id不可以为空。

下面介绍一种概念 - - -联合主键

mysql> create table user2(
    -> id int,
    -> name varchar(20),
    -> password varchar(20),
    -> primary key (id,name)
    -> );
Query OK, 0 rows affected (1.13 sec)

其中id和name只要他们两个加起来不重复就OK,例子如下:

mysql> insert into user2 values(1,'张三','123');     
#给user2表添加数据
Query OK, 1 row affected (0.58 sec)

mysql> insert into user2 values(1,'张三','123');       
 #给user2表添加相同数据  
ERROR 1062 (23000): Duplicate entry '1-张三' for key 'PRIMARY'

mysql> insert into user2 values(2,'张三','123');
 #id和名字只要有一个不重复就行了
Query OK, 1 row affected (0.42 sec)

mysql> insert into user2 values(2,'李四','123');
Query OK, 1 row affected (0.55 sec)

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

大家可以理解成 ‘’或‘’,注意 联合主键任何一个键都不能为空!!!
联合主键:就是用多个字段一起作为一张表的主键
这里引用一篇文章[ https://blog.csdn.net/qq_34741578/article/details/89393578 ],这里面讲解了主键和的唯一性和联合主键的辨析,不理解的key看下。

OK~,今天结束,明天继续更新…

(2019.7.22)
2自增约束
AUTO_INCREMENT
当插入第一条记录时,自增字段没有给定一个具体值,可以不赋值 可以写成DEFAULT/NULL,那么以后插入字段的时候,该自增字段就是从1开始,每插入一条记录,该自增字段的值增加1。当插入第一条记录时,给自增字段一个具体值,那么以后插入的记录在此自增字段上的值,就在第一条记录该自增字段的值的基础上每次增加1。
例子如下:

mysql> create table user3(
    -> id int primary key AUTO_INCREMENT,
    -> name varchar(20)
    -> );
    Query OK, 0 rows affected (0.95 sec)

mysql> insert into user3(name) values('zhangsan');      #添加一个数据
Query OK, 1 row affected (0.63 sec)

mysql> select * from user3;
+----+----------+
| id | name     |
+----+----------+
|  1 | zhangsan |
+----+----------+
1 row in set (0.00 sec)             #这里发现默认给了id=1

mysql> insert into user3(name) values('zhangsan');      #再添加一个
Query OK, 1 row affected (0.71 sec)

mysql> select * from user3;
+----+----------+
| id | name     |
+----+----------+
|  1 | zhangsan |
|  2 | zhangsan |
+----+----------+
2 rows in set (0.00 sec)         

自增约束------就是管控id的增长

倘若我们建表的时候忘记创建主键约束怎么办?
alter table +表+ add primary key (id);
mysql> create table user4(
    -> id int,
    -> name varchar(20)
    -> );
Query OK, 0 rows affected (0.90 sec)

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

mysql>

从上面可以看到主键是空的(key)

mysql> alter table user4 add primary key (id);
Query OK, 0 rows affected (1.40 sec)
Records: 0  Duplicates: 0  Warnings: 0

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

mysql>

这里添加了主键,那嘛如何删除呢?

mysql> alter table +表+ drop primary key;
mysql> alter table user4 drop primary key;
Query OK, 0 rows affected (1.41 sec)
Records: 0  Duplicates: 0  Warnings: 0

这里再查询下表的信息,发现主键约束已经被删除了

3唯一约束
约束修饰字段的值 不可以 重复
我们先创建一个表

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

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

除了先创表再添加约束,也可以在创表的时候就添加约束

mysql> create table user6(
    -> id int,
    -> name varchar(20),
    -> unique(name)
    -> );
Query OK, 0 rows affected (0.87 sec)

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)

再看一眼user5,效果是一样的·

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的key中的UNI表示name不可重复~~

mysql> insert into user5 values(1,'zhangsan');  #添加一个数据
Query OK, 1 row affected (0.61 sec)

mysql> insert into user5 values(1,'zhangsan');   #不可以重复添加
ERROR 1062 (23000): Duplicate entry 'zhangsan' for key 'name'

mysql> insert into user5 values(1,'lisi');
Query OK, 1 row affected (0.17 sec)

mysql> select * from user5;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
|    1 | lisi     |
+------+----------+
2 rows in set (0.00 sec)

这里就有一个疑惑,这不和我们前面学的主键约束很像吗?

简单来说,就是主键约束不允许为空,而唯一约束可以为空,他们俩的相同之处就是都不可以重复。
mysql> insert into user5 values(NULL,'NULL');
Query OK, 1 row affected (0.68 sec)

mysql> select * from user5;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
|    1 | lisi     |
| NULL | wanger   |
| NULL | NULL     |
+------+----------+
4 rows in set (0.00 sec)

上面显示,唯一约束可以为空(NULL)而上面的主键约束就不可以为空,
这里注意

mysql> insert into user5 values(1,'NULL');
ERROR 1062 (23000): Duplicate entry 'NULL' for key 'name'
这就很有灵性,注意这里我把NULL写成’NULL’,当成了字符,所以会导致重复报错。唯一键是可以存在多个null的,因为根据NULL的定义,NULL表示的是未知,因此两个NULL比较的结果既不相等,也不不等,结果仍然是未知。根据这个定义,多个NULL值的存在应该不违反唯一约束,所以是合理的。

这里有个细节,就是在创建表的时候
可以像刚才那样,也可以这样:

mysql> create table user7(
    -> id int,
    -> name varchar(20) unique    
    -> );

但是这样只能设置一个唯一约束(或者在id int 后也加上unique)

mysql> create table user7(
    -> id int,
    -> name varchar(20),
    -> unique(id,name)
    -> );
Query OK, 0 rows affected (0.85 sec)

这样id 加 name都是不可以重复的了,其实这就和联合主键有相似了

注意这里又有区别了,唯一约束可以设置多个唯一键,下面我们分开看:

倘若我们这样设置表的唯一主键unique(id,name)这就和前面的联合主键效果是一样的。
但是我们要是这样设置,分别设置唯一约束,就和联合主键不同了,这样id和name分别都不可以重复了。

mysql> create table user8(
    -> id int unique,
    -> name varchar(20) unique
    -> );
如何删除唯一约束呢?

mysql> alter table +表名+ drop index +要删除的约束(name);

mysql> alter table user6 drop index name;
Query OK, 0 rows affected (0.66 sec)
Records: 0  Duplicates: 0  Warnings: 0

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

4非空约束

保证修饰的字段不能为空,NULL 。在建表的时候加上not null

mysql> create table user9(
    -> id int,
    -> name varchar(20) not null             #加上了not null
    -> );
Query OK, 0 rows affected (0.89 sec)

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)

可以看到在Null,那一列name上面是NO

5默认约束
就是当我们插入字段值的时候,如果没有传值,就会使用默认值。

mysql> create table user10(
    -> id int,
    -> name varchar(20),
    -> age int default 10     #default后面加上默认值
    -> );
Query OK, 0 rows affected (1.15 sec)

mysql> 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.00 sec)

可以看到age的Default的为10,实例如下:

mysql> insert into user10 (id,name) values(1,'zhangsan'); 
 #并没有给age传值,如果写了age就按照写的值为准
Query OK, 1 row affected (0.55 sec)

mysql> select * from user10;
+------+----------+------+
| id   | name     | age  |
+------+----------+------+
|    1 | zhangsan |   10 |
+------+----------+------+
1 row in set (0.00 sec)

6外键约束
涉及到两个表:主表和副表(也可以说是父表和子表),一个表引用另一个表
下面我们建两个表:

班级表
mysql> create table classes(
    -> id int primary key,
    -> name varchar(20)
    -> );
Query OK, 0 rows affected (0.88 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 (1.20 sec)

学生表中的 class_id 的值必须来自 classs 表中的 id 字段,且定义的时候就要确定类型相同。
现在向班级表中插入数据:

mysql> insert into classes values(1, '一班');
Query OK, 1 row affected (0.64 sec)

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

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

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

再向学生表添加数据:

mysql> insert into students values(181,'张三',1);
Query OK, 1 row affected (0.64 sec)

mysql> insert into students values(182,'张三',2);
Query OK, 1 row affected (0.08 sec)

mysql> insert into students values(183,'张三',3);
Query OK, 1 row affected (0.18 sec)

mysql> select * from studengts;
ERROR 1146 (42S02): Table 'test.studengts' doesn't exist
mysql> select * from students;
+-----+--------+----------+
| id  | name   | class_id |
+-----+--------+----------+
| 181 | 张三   |        1 |
| 182 | 张三   |        2 |
| 183 | 张三   |        3 |
+-----+--------+----------+
3 rows in set (0.00 sec)
小结:

1、主表中没有的数据值,在副表中是不可以使用的。
2、当主表中的记录被副表引用时,主表中被引用的值是不可以被删除的。

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`))

终于把约束的内容完结了,明天开始学习新的知识。

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值