参考:
MySQL学习笔记
一天学会 MySQL 数据库
使用终端操作数据库
APPServ安装及配置(文中有资源链接)
APPServ登录和退出MySQL服务器
# 登录MySQL
1.管理员权限打开cmd
2.cd ..\..\AppServ\MySQL\bin
3.(mysqld --install) # 仅第一次需要安装
4.mysql -u root -p
5.net start mysql
# 退出MySQL数据库服务器
exit; # quit;
一、增删改查
1.查看 & 切换数据库
show databases; //查看
use databaseName; //选择
2.查看该数据库中的表 & 表中数据
show tables; //查看该数据库中的表
select * from tableName; //表中数据
3.创建数据库 & 表
create database PET;
create TABLE pet(
name VARCHAR(20),
owner VARCHAR(20),
specise VARCHAR(20),
sex CHAR(1),
brith DATAE,
death DATE );
注意事项:
1:var()与varchar()的区别:
var()长度固定,若存储的字符串未达上限,会占用空格来填充空间;
varchar()不定长,没有达到"()“中的上限则会自动去掉后面的空格;
3:定义最后一个字段的时候不要加“,”;
4:上面的"VAR”,“VARCHAR”,"DATE"可以用小写.最好用大写来表示区分关键字。
8.查看数据表结构
show create table tableName;
说明:
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
Field : 字段的名称
Type : 字段的类型,可以有int var varchar
Key : 是否是关键字 如可以定义为: primary key 或者 unique key ...
Default: : 若是该字段没有主动设置值的时候,该字段的默认值是什么?
9.插入 & 修改 & 删除
插入数据
//法1:
INSERT INTO pet VALUES('kk','cc','dog','1','1998-8-2',null);
//法2:
INSERT INTO pet(name,owner) VALUES ('xx','cc');
//只在name和owner字段上面插入的一条,其他皆为NULL/默认值的数据
修改数据
UPDATE pet SET name = 'squirrel' where owner = 'Diane';
删除数据
DELETE FROM pet where name = 'squirrel';
删除表
DROP TABLE myorder;
10.mysql 常用数据类型
1.数值;2.字符串;3.时间
注意:金钱最好用整数,单位用分,*100换成元;直接用浮点会有精度损失.
二、mysql建表中的约束
1.主键约束:
能唯一确定一张表中的一条记录,增加主键约束之后,就可以使得字段不重复而且不为空
create table users(
id int PRIMARY KEY,
name VARCHAR(20)
);
show create table users;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
发现 id不能为null 且 key 的值变为:PRI(primary)
建表后添加主键约束:
//法1:
ALTER TABLE users ADD PRIMARY KEY(id);
//法2:
ALTER TABLE users MODIFY id INT PRIMARY KEY;
删除主键:
ALTER TABLE users drop PRIMARY KEY;
2.联合主键:
每个字段都不能为空,并且加起来不能和已设置的联合主键重复。
CREATE TABLE user2(
id INT,
name VARCHAR(20),
password VARCHAR(20),
PRIMARY key(id,name)
);
show create table user2;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | NO | PRI | NULL | |
| password | varchar(20) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
INSERT INTO user2 VALUES (1,'老王','123456');
INSERT INTO user2 VALUES (2,'老王','123456');
+----+------+----------+
| id | name | password |
+----+------+----------+
| 1 | 老王 | 123456 |
| 2 | 老王 | 123456 |
+----+------+----------+
说明了复合主键只要所有的字段都不是相同的情况下可以允许其中的字段重复:
INSERT INTO user2 VALUES (1,'老李','123456');
SELECT * FROM user2;
+----+------+----------+
| id | name | password |
+----+------+----------+
| 1 | 老李 | 123456 |
| 1 | 老王 | 123456 |
| 2 | 老王 | 123456 |
+----+------+----------+
场景:
表中有班级号以及学生座位号,我们可以用班级号+学生的座位号可以准确的定位一个学生,如:(1班5号可以准确的确定一个学生)
3.自增约束:
自增约束的主键由系统自动递增分配
CREATE TABLE user3(
id INT PRIMARY KEY AUTO_INCREMENT, //插入自动递增生成id
name VARCHAR(20)
);
建表后给主键设置自增长:
ALTER TABLE users MODIFY id INT AUTO_INCREMENT;
4.唯一约束:
修饰字段不可重复
CREATE TABLE user (
id INT,
name VARCHAR(20),
UNIQUE(name)
);
建表后新增name为唯一约束:
//法1:
ALTER TABLE user ADD UNIQUE(name);
//法2:
ALTER TABLE user MODIFY name VARCHAR(20) UNIQUE;
show create table user5;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | UNI | NULL | |
+-------+-------------+------+-----+---------+----------------+
删除唯一主键
ALTER TABLE user DROP INDEX name;
主键约束(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'用户手机,不能重复且不能为空'
);
show create table 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.非空约束:
约束某个字段不能为空
CREATE TABLE user (
id INT,
name VARCHAR(20) NOT NULL
);
移除非空约束
ALTER TABLE user MODIFY name VARCHAR(20);
6.默认约束
约束某个字段的默认值
CREATE TABLE user2 (
id INT,
name VARCHAR(20),
age INT DEFAULT 10
);
移除非空约束
ALTER TABLE user MODIFY age INT;
场景:
找正常用户,对其发放优惠卷;而不让被禁封的用户参加。
若禁封用户只需将status从0改为1;故取用户时必须先判断status值。
取用户时加上status的判断即可:
SELECT * FROM users WHERE status = 0;
7.外键约束
班级
CREATE TABLE classes (
id INT PRIMARY KEY,
name VARCHAR(20)
);
学生
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(20),
-- 这里的 class_id 要和 classes 中的 id 字段相关联
class_id INT,
-- 表示 class_id 的值必须来自于 classes 中的 id 字段值
FOREIGN KEY(class_id) REFERENCES classes(id)
);
1.附表中禁用主表中没有的数据.
2.若主表中的数据正在被附表引用,那么此数据不可被删除
3.若要想删除,先将附表中的数据删除再删主表数据
三、数据库的三大设计范式
1NF
数据表中所有字段都是不可分割的原子值
只要字段值还可以继续拆分,就不满足第一范式。
范式设计得越详细,对某些实际操作可能会更好,但并非都有好处,需要对项目的实际情况进行设定。
2NF
在满足第一范式的前提下,其他列都必须完全依赖于主键列。
如果出现不完全依赖,只可能发生在联合主键的情况下:
订单表
CREATE TABLE myorder (
product_id INT,
customer_id INT,
product_name VARCHAR(20),
customer_name VARCHAR(20),
PRIMARY KEY (product_id, customer_id)
);
实际上,在这张订单表中,product_name 只依赖于 product_id ,customer_name 只依赖于 customer_id 。也就是说,product_name 和 customer_id 是没用关系的,customer_name 和 product_id 也是没有关系的。
这就不满足第二范式,因为其他列只依赖于主键部分字段。
解决方法:拆表
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)
);
拆分之后,myorder 表中的 product_id 和 customer_id 完全依赖于 order_id 主键,而 product 和 customer 表中的其他字段又完全依赖于主键。满足了第二范式的设计!
3NF
在满足第二范式的前提下,除了主键列之外,其他列之间不能有传递依赖关系。
CREATE TABLE myorder (
order_id INT PRIMARY KEY,
product_id INT,
customer_id INT,
customer_phone VARCHAR(15)
);
表中的 customer_phone 有可能依赖于 order_id 、 customer_id 两列;
而customer_id 依赖于order_id ,其他列之间有传递依赖关系,不满足3NF。
解决方法如下:
CREATE TABLE myorder (
order_id INT PRIMARY KEY,
product_id INT,
customer_id INT
);
CREATE TABLE customer (
id INT PRIMARY KEY,
name VARCHAR(20),
phone VARCHAR(15)
);
修改后就不存在其他列之间的传递依赖关系,其他列都只依赖于主键列,满足了第三范式的设计!