表 是mysql服务用来存储数据的文件
库 存放表的目录
语法:
库名是有命名规则? (要记牢)
仅可以使用数字、字母、下划线、不能纯数字
区分字母大小写,
具有唯一性
不可使用指令关键字、特殊字符
建库的基本命令 create database 库名;
mysql> CREATE DATABASE gamedb ;
mysql> CREATE DATABASE GAMEDB ;
mysql> CREATE DATABASE GAMEDB ; #已存在 会报错
mysql> CREATE DATABASE IF NOT EXISTS gamedb ; 如果不存在就建库 正常
mysql> show databases; # 查看有哪些库
mysql> drop database gamedb; # 删除库
Query OK, 0 rows affected (0.00 sec)
mysql> drop database gamedb;
ERROR 1008 (HY000): Can't drop database 'gamedb'; database doesn't exist
mysql> drop database if exists gamedb; 如果库存在就删除
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql>
建表命令格式 (要记牢)
create table 库名.表名(
表头名1 数据类型,
表头名2 数据类型,
表头名3 数据类型,
表头名4 数据类型
);
mysql> create database 学生库;
mysql> use 学生库;
mysql> create table 学生库.学生信息表(姓名 char(10) , 班级 char(9) , 性别 char(4) , 年龄 int );
mysql> show tables;
+---------------------+
| Tables_in_学生库 |
+---------------------+
| 学生信息表 |
+---------------------+
1 row in set (0.00 sec)
mysql> desc 学生库.学生信息表;
+--------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+----------+------+-----+---------+-------+
| 姓名 | char(10) | YES | | NULL | |
| 班级 | char(9) | YES | | NULL | |
| 性别 | char(4) | YES | | NULL | |
| 年龄 | int(11) | YES | | NULL | |
+--------+----------+------+-----+---------+-------+
4 rows in set (0.00 sec)
mysql>
mysql> drop table 学生库.学生信息表;
mysql> drop database 学生库;
使用英文命名重新建表
mysql> create database studb;
Query OK, 1 row affected (0.00 sec)
mysql> create table studb.stu(name char(10) , class char(9) , gender char(4) , age int );
Query OK, 0 rows affected (0.29 sec)
mysql> desc studb.stu;
+--------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+----------+------+-----+---------+-------+
| name | char(10) | YES | | NULL | |
| class | char(9) | YES | | NULL | |
| gender | char(4) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+--------+----------+------+-----+---------+-------+
4 rows in set (0.00 sec)
mysql>
E-R关系模型
实体——关系模型
建表范式
第一范式
- 第一范式(1NF)要求数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值。
- 若某一列有多个值,可以将该列单独拆分成一个实体,新实体和原实体间是一对多的关系。
- 在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。
第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。
第一范式的合理遵循需要根据系统的实际需求来定。比如某些数据库系统中需要用到“地址”这个属性,本来直接将“地址”属性设计成一个数据库表的字段就行。但是如果系统经常会访问“地址”属性中的“城市”部分,那么就非要将“地址”这个属性重新拆分为省份、城市、详细地址等多个部分进行存储,这样在对地址中某一部分操作的时候将非常方便。这样设计才算满足了数据库的第一范式
第二范式
- 满足第二范式(2NF)必须先满足第一范式(1NF)。
- 第二范式要求实体中没一行的所有非主属性都必须完全依赖于主键;即:非主属性必须完全依赖于主键。
- 完全依赖:主键可能由多个属性构成,完全依赖要求不允许存在非主属性依赖于主键中的某一部分属性。
- 若存在哪个非主属性依赖于主键中的一部分属性,那么要将发生部分依赖的这一组属性单独新建一个实体,并且在旧实体中用外键与新实体关联,并且新实体与旧实体间是一对多的关系。
第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
比如要设计一个订单信息表,因为订单中可能会有多种商品,所以要将订单编号和商品编号作为数据库表的联合主键
第三范式
- 满足第三范式必须先满足第二范式。
- 第三范式要求:实体中的属性不能是其他实体中的非主属性。因为这样会出现冗余。即:属性不依赖于其他非主属性。
- 如果一个实体中出现其他实体的非主属性,可以将这两个实体用外键关联,而不是将另一张表的非主属性直接写在当前表中。
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
比如在设计一个订单数据表的时候,可以将客户编号作为一个外键和订单表建立相应的关系。而不可以在订单表中添加关于客户其它信息(比如姓名、所属公司等)的字段。
修改表
语法格式:![](https://i-blog.csdnimg.cn/blog_migrate/16d957234b4d6d16982dc33c3dae3064.png)
mysql> alter table studb.stu rename studb.stuinfo; 修改表名
mysql> alter table studb.stuinfo drop age ; 删除字段
mysql> use studb;
Database changed
mysql> show tables;
+-----------------+
| Tables_in_studb |
+-----------------+
| stuinfo |
+-----------------+
1 row in set (0.00 sec)
mysql> desc stuinfo;
+--------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+----------+------+-----+---------+-------+
| name | char(10) | YES | | NULL | |
| class | char(9) | YES | | NULL | |
| gender | char(4) | YES | | NULL | |
+--------+----------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> alter table studb.stuinfo add mail char(30) ; 添加在末尾
添加在指定位置
mysql> alter table studb.stuinfo add number char(9) first , add school char(10) after name;
mysql> desc studb.stuinfo; 查看表结构
+--------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+----------+------+-----+---------+-------+
| number | char(9) | YES | | NULL | |
| name | char(10) | YES | | NULL | |
| school | char(10) | YES | | NULL | |
| class | char(9) | YES | | NULL | |
| gender | char(4) | YES | | NULL | |
| mail | char(30) | YES | | NULL | |
+--------+----------+------+-----+---------+-------+
mysql> alter table studb.stuinfo 修改字段类型
-> modify
-> mail varchar(50) not null default "plj@tedu.cn";
mysql> desc studb.stuinfo;
+--------+-------------+------+-----+-------------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+-------------+-------+
| number | char(9) | YES | | NULL | |
| name | char(10) | YES | | NULL | |
| school | char(10) | YES | | NULL | |
| class | char(9) | YES | | NULL | |
| gender | char(4) | YES | | NULL | |
| mail | varchar(50) | NO | | plj@tedu.cn | |
+--------+-------------+------+-----+-------------+-------+
mysql> alter table studb.stuinfo change class class_name char(9) ; 修改表头名
mysql> desc studb.stuinfo;查看修改
+------------+-------------+------+-----+-------------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+-------------+-------+
| number | char(9) | YES | | NULL | |
| name | char(10) | YES | | NULL | |
| school | char(10) | YES | | NULL | |
| class_name | char(9) | YES | | NULL | |
| gender | char(4) | YES | | NULL | |
| mail | varchar(50) | NO | | plj@tedu.cn | |
+------------+-------------+------+-----+-------------+-------+
mysql> alter table studb.stuinfo drop school , drop 班级 ,drop email ; 一起删除多个表头
Query OK, 0 rows affected (0.59 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc studb.stuinfo; 查看
+--------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+----------+------+-----+---------+-------+
| number | char(9) | YES | | NULL | |
| name | char(10) | YES | | NULL | |
| gender | char(4) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+--------+----------+------+-----+---------+-------+
4 rows in set (0.00 sec)
mysql>
使用modify 修改表头的位置
mysql> alter table studb.stuinfo modify age int after name ;
Query OK, 0 rows affected (0.47 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc studb.stuinfo;
+--------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+----------+------+-----+---------+-------+
| number | char(9) | YES | | NULL | |
| name | char(10) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| gender | char(4) | YES | | NULL | |
+--------+----------+------+-----+---------+-------+
4 rows in set (0.00 sec)
复制表:
复制表 (拷贝已有的表 类型系统命令 cp 的功能 )
仅仅复制表头命令格式:(只复制表结构)
表头和数据复制都复制的命令格式
复制表 (拷贝已有的表 和系统命令 cp 的功能一样 ) 作用: 备份已有的表
表头和数据复制都复制的 命令格式create table 库名.表名 select * from 库名.表名 ;
例子:拷贝 tarena库下的user表到 studb库里 表名不变
mysql> use studb;
mysql> show tables;
+-----------------+
| Tables_in_studb |
+-----------------+
| stuinfo |
+-----------------+
1 row in set (0.00 sec)
mysql> create table studb.user select * from tarena.user;
mysql> show tables;
+-----------------+
| Tables_in_studb |
+-----------------+
| stuinfo |
| user |
+-----------------+
mysql> select * from studb.user; 查看数据了
仅仅复制表头命令格式:(只复制表结构)
命令格式 CREATE TABLE 库.表 LIKE 库.表
例子
mysql> use studb;
Database changed
mysql> show tables;
+-----------------+
| Tables_in_studb |
+-----------------+
| stuinfo |
| user |
+-----------------+
2 rows in set (0.00 sec)
mysql> create table studb.user2 like tarena.user; 仅仅复制表头
Query OK, 0 rows affected (0.24 sec)
mysql> show tables;
+-----------------+
| Tables_in_studb |
+-----------------+
| stuinfo |
| user |
| user2 |
+-----------------+
3 rows in set (0.00 sec)
mysql> select * from studb.user2;
Empty set (0.00 sec)
mysql> desc studb.user2;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | char(20) | YES | | NULL | |
| password | char(1) | YES | | NULL | |
| uid | int(11) | YES | | NULL | |
| gid | int(11) | YES | | NULL | |
| comment | varchar(50) | YES | | NULL | |
| homedir | varchar(80) | YES | | NULL | |
| shell | char(30) | YES | | NULL | |
+----------+-------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)
mysql>
管理表记录
插入表记录 向表添加新行
修改表记录 对行里 列的值做记录
删除表记录
查询表记录
管理表记录 : 对表中存储的行做管理 ,操作包括 查看select 插入 insert into 更新 update 删除 delete
用来做练习的表结构
添加行 insert into
修改 update
删除行 delete
mysql> desc studb.stuinfo;
+--------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+----------+------+-----+---------+-------+
| number | char(9) | YES | | NULL | |
| name | char(10) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| gender | char(4) | YES | | NULL | |
+--------+----------+------+-----+---------+-------+
4 rows in set (0.00 sec)
mysql> select * from studb.stuinfo;
Empty set (0.00 sec)
mysql>
mysql> insert into studb.stuinfo values("nsd211101" , "bob" , 19 , "girl");
mysql> insert into studb.stuinfo
-> values
-> ("nsd211102" , "jim",21,"boy"),("nsd211103","lucy",18,"girl");
mysql> select * from studb.stuinfo;
+-----------+------+------+--------+
| number | name | age | gender |
+-----------+------+------+--------+
| nsd211101 | bob | 19 | girl |
| nsd211102 | jim | 21 | boy |
| nsd211103 | lucy | 18 | girl |
+-----------+------+------+--------+
3 rows in set (0.00 sec)
mysql> insert into studb.stuinfo(number,name) values("nsd211104","john");
mysql> select * from studb.stuinfo;
+-----------+------+------+--------+
| number | name | age | gender |
+-----------+------+------+--------+
| nsd211101 | bob | 19 | girl |
| nsd211102 | jim | 21 | boy |
| nsd211103 | lucy | 18 | girl |
| nsd211104 | john | NULL | NULL |
+-----------+------+------+--------+
4 rows in set (0.00 sec)
mysql> insert into studb.stuinfo(number,name) values("nsd211105","jerry"),("nsd211106","lilei");
mysql> select * from studb.stuinfo; +-----------+-------+------+--------+
| number | name | age | gender |
+-----------+-------+------+--------+
| nsd211101 | bob | 19 | girl |
| nsd211102 | jim | 21 | boy |
| nsd211103 | lucy | 18 | girl |
| nsd211104 | john | NULL | NULL |
| nsd211105 | jerry | NULL | NULL |
| nsd211106 | lilei | NULL | NULL |
+-----------+-------+------+--------+
6 rows in set (0.00 sec)
mysql> insert into studb.stuinfo set number="nsd211107" , age=23 , gender="boy";
mysql> select * from studb.stuinfo;
+-----------+-------+------+--------+
| number | name | age | gender |
+-----------+-------+------+--------+
| nsd211101 | bob | 19 | girl |
| nsd211102 | jim | 21 | boy |
| nsd211103 | lucy | 18 | girl |
| nsd211104 | john | NULL | NULL |
| nsd211105 | jerry | NULL | NULL |
| nsd211106 | lilei | NULL | NULL |
| nsd211107 | NULL | 23 | boy |
+-----------+-------+------+--------+
7 rows in set (0.00 sec)
mysql> insert into studb.stuinfo(number,name) (select number,name from studb.stuinfo where name in ("bob","jim","lucy") );
mysql> select * from studb.stuinfo;
+-----------+-------+------+--------+
| number | name | age | gender |
+-----------+-------+------+--------+
| nsd211101 | bob | 19 | girl |
| nsd211102 | jim | 21 | boy |
| nsd211103 | lucy | 18 | girl |
| nsd211104 | john | NULL | NULL |
| nsd211105 | jerry | NULL | NULL |
| nsd211106 | lilei | NULL | NULL |
| nsd211107 | NULL | 23 | boy |
| nsd211101 | bob | NULL | NULL |
| nsd211102 | jim | NULL | NULL |
| nsd211103 | lucy | NULL | NULL |
+-----------+-------+------+--------+
10 rows in set (0.00 sec)
修改表记录:
更新 :修改行中列的数据 使用update
批量修改 (不加筛选条件修改)
命令格式: update 库名.表名 set 字段名 = 值 , 字段名 = 值 ;
批量修改
mysql> update studb.stuinfo set age=30,gender="no";
mysql> select * from studb.stuinfo;
+-----------+-------+------+--------+
| number | name | age | gender |
+-----------+-------+------+--------+
| nsd211101 | bob | 30 | no |
| nsd211102 | jim | 30 | no |
| nsd211103 | lucy | 30 | no |
| nsd211104 | john | 30 | no |
| nsd211105 | jerry | 30 | no |
| nsd211106 | lilei | 30 | no |
| nsd211107 | NULL | 30 | no |
| nsd211101 | bob | 30 | no |
| nsd211102 | jim | 30 | no |
| nsd211103 | lucy | 30 | no |
+-----------+-------+------+--------+
10 rows in set (0.00 sec)
仅修改与条件匹配
mysql> update studb.stuinfo set name="bob" where number="nsd211107";
mysql> select * from studb.stuinfo;
+-----------+-------+------+--------+
| number | name | age | gender |
+-----------+-------+------+--------+
| nsd211101 | bob | 30 | no |
| nsd211102 | jim | 30 | no |
| nsd211103 | lucy | 30 | no |
| nsd211104 | john | 30 | no |
| nsd211105 | jerry | 30 | no |
| nsd211106 | lilei | 30 | no |
| nsd211107 | bob | 30 | no |
| nsd211101 | bob | 30 | no |
| nsd211102 | jim | 30 | no |
| nsd211103 | lucy | 30 | no |
+-----------+-------+------+--------+
10 rows in set (0.00 sec)
删除表记录:
删除 : 删除表中行 使用delete
仅删除符合条件的行 (删除命令有筛选条件) delete from 库.表 where 筛选条件;
删除表里的所有行(删除命令有筛选条件) delete from 库.表;
只删除与条件匹配的行
mysql> delete from studb.stuinfo where name="bob";
Query OK, 3 rows affected (0.03 sec)
mysql> select * from studb.stuinfo;
+-----------+-------+------+--------+
| number | name | age | gender |
+-----------+-------+------+--------+
| nsd211102 | jim | 30 | no |
| nsd211103 | lucy | 30 | no |
| nsd211104 | john | 30 | no |
| nsd211105 | jerry | 30 | no |
| nsd211106 | lilei | 30 | no |
| nsd211102 | jim | 30 | no |
| nsd211103 | lucy | 30 | no |
+-----------+-------+------+--------+
7 rows in set (0.00 sec)
删除所有行
mysql> delete from studb.stuinfo;
Query OK, 7 rows affected (0.02 sec)
mysql> select * from studb.stuinfo;
Empty set (0.00 sec)