1、初识MySQL

  1. 启动服务
  • 本地启动 (管理员模式打开cmd)

    切换到mysql/bin目录

    1
         net start mysql
  • phpstudy启动

    直接点击启动

  1. 登陆账号

    1
         mysql -u [用户名] -p

    例子:

    1
         mysql -u root -p123456
    • p后面不能加空格,直接输入密码
    • 也可以不带内容直接-p,之后再单独输入密码
  2. 退出连接

    1
         exit;
  3. 结束服务

  • 本地结束

    1
         net stop mysql
  • phpstudy结束

    直接点击停止

2、操作数据库

1、数据库 > 数据库中的表 > 数据库中的表的数据

  1. 创建数据库

    1
         create database [if not exists] [库名]
  2. 删除数据库

    1
         drop database [if exists] [库名]
  3. 使用数据库

    1
    2
    3
         --如果表名是特殊字符,就需要带``
     use [库名]
     use `school`
  4. 查看数据库

    1
         show databases -- 查看所有的数据库

2、数据类型

  1. 数值

    int 标准的整数 4个字节 常用的intdecimal 字符串形式的浮点数 金融计算的时候,一般是使用decimal(精度问题)

  2. 字符串

    varchar 可变字符串 0~65535 常用的变量 Stringtext 文本串 2^16-1 保存大文本

  3. 时间日期

    data YYYY-MM-DD,日期格式time HH:mm:ss 时间格式datetime YYYY-MM-DD HH:mm:ss 最常用的时间格式timestam 时间戳, 1970.1.1 到现在的毫秒数 也较为常用的时间格式year 年份

  4. null

    没有值或者是未知

    不能用null进行运算,结果一定为null

3、字段属性

  1. Unsigned:
    • 无符号的整数
    • 声明了该列不能声明为负数
  2. zerofill:
    • 0填充的
    • 不足的位数,使用0来填充,int(3), 5 — 005
  3. 自增:
    • 通常理解为自增,自动在上一条记录的基础上+1(默认)
    • 通彻用来设计唯一的主键 index,必须是整数类型
    • 可以自定义设计主键的起始值和步长
  4. 非空(Null not null):
    • 假设设置为not null,如果不给他赋值,就会报错
    • NULL,如果不填写值,就会报错
  5. 默认值:
    • 设置默认的值
  6. 每一个表都必须存在以下五个字段:
  • id 主键
  • version 乐观锁
  • is_delete 伪删除
  • gmt_create 创建时间
  • gmt_update 修改时间

4、创建数据库

  • 格式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 CREATE TABLE [IF NOT EXISTS] `表名`(
    `字段名` [列类型] [属性] [索引] [注释],
    `字段名` [列类型] [属性] [索引] [注释],
    ......
    `字段名` [列类型] [属性] [索引] [注释],
 )[表类型][字符集设置][注释]
 
 CREATE TABLE `student`(
  `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
    `name` VARCHAR(20) NOT NULL DEFAULT '匿名' COMMENT '姓名',
    `password` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '',
    `sex` VARCHAR(2) NOT NULL DEFAULT '匿名' COMMENT '性别',
    `birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
    `address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
    `email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
    PRIMARY KEY(`id`)
 )ENGINE=INNODB DEFAULT CHARSET=utf8
  • 常用命令
1
2
3
 SHOW CREATE DATABASE school; -- 查看创建数据库的语句
 SHOW CREATE TABLE student; -- 查看student数据表的定义语句
 DESC student; -- 查看表的结构

5、数据表的类型

  1. 设置数据库的字符集编码
1
CHARSET=utf8

不设置的话,会是mysql默认的字符集编码,不支持中文

  1. 修改
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- 修改表名 ALTER TABLE 旧表名 RENAME AS 新表名
ALTER TABLE teacher RENAME AS teacher1
-- 增加表的字段 ALTER TABLE 表名 ADD 字段名 列属性
ALTER TABLE teacher1 ADD age INT (11)

-- 修改表的字段 (重命名,修改约束)
-- ALTER TABLE 表名 MODIFY 字段名 列属性[]
ALTER TABLE teacher1 MODIFY age VARCHAR (11) -- 修改约束
-- ALTER TABLE 表名 CHANGE 旧名字 新名字 列属性[]
ALTER TABLE teacher1 CHANGE age age1 INT (1) -- 字段重命名

-- 删除表的字段:ALTER TABLE 表名 DROP 字段
ALTER TABLE teacher1 DROP age1

-- 删除表
DROP TABLE [IF EXISTS] 表名

3、MySQL数据管理

  1. 外键

方式一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
CREATE TABLE `grade` (
`gradeid` INT (10) NOT NULL AUTO_INCREMENT,
`GRADENAME` VARCHAR (50) NOT NULL,
PRIMARY KEY (`GRADEID`)
) ENGINE = INNODB DEFAULT CHARSET = utf8;

-- 学生表的 gradeid 字段要去引用年级表的 gradeid
-- 定义外键 key
-- 给这个外键添加约束 (执行引用) references 引用
CREATE TABLE `student` (
`id` INT (4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR (20) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`password` VARCHAR (20) NOT NULL DEFAULT '123456' COMMENT '密码',
`sex` VARCHAR (2) NOT NULL DEFAULT '女' COMMENT '性别',
`birthday` date DEFAULT NULL COMMENT '出生日期',
`gradeid` INT (10) NOT NULL COMMENT '学生的年级',
`address` VARCHAR (100) DEFAULT NULL COMMENT '家庭住址',
`email` VARCHAR (50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (`id`),
KEY `FK_gradeid` (`gradeid`),
CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`)
) ENGINE = INNODB DEFAULT CHARSET = utf8;

删除有外键关系的表的时候,必须要先删除引用别人的表(从表),再删除被引用的表(主表)

方式二

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
CREATE TABLE `grade` (
`gradeid` INT (10) NOT NULL AUTO_INCREMENT,
`GRADENAME` VARCHAR (50) NOT NULL,
PRIMARY KEY (`GRADEID`)
) ENGINE = INNODB DEFAULT CHARSET = utf8;

-- 学生表的 gradeid 字段要去引用年级表的 gradeid
-- 定义外键 key
-- 给这个外键添加约束 (执行引用) references 引用
CREATE TABLE `student` (
`id` INT (4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR (20) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`password` VARCHAR (20) NOT NULL DEFAULT '123456' COMMENT '密码',
`sex` VARCHAR (2) NOT NULL DEFAULT '女' COMMENT '性别',
`birthday` date DEFAULT NULL COMMENT '出生日期',
`gradeid` INT (10) NOT NULL COMMENT '学生的年级',
`address` VARCHAR (100) DEFAULT NULL COMMENT '家庭住址',
`email` VARCHAR (50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (`id`)
) ENGINE = INNODB DEFAULT CHARSET = utf8;

-- 创建表的时候没有外键关系
ALTER TABLE `student`
ADD CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`);

-- ALTER TABLE 表 ADD CONSTRAINT 约束名 FOREIGN KEY(作为外键的列) REFERENCES 哪个表(哪个字段)

以上的操作都是物理外键,数据库级别的外键,不建议使用!

最佳实践

  • 数据库就是单纯的表,只用来存数据,只有行(数据)和列(字段)
  • 我们想使用多张表的数据,想使用外键(程序去实现)
  1. DML语言

    数据库意义:数据存储,数据管理

    • insert
    • update
    • delete
  2. 添加

    insert

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    -- 插入语句(添加)
    -- insert into 表名([字段名1,字段2,字段3])values('值1'),('值2'),('值3', ....)
    INSERT INTO grade(gradename) VALUES('大四')

    -- 由于主键自增我们可以省略 (如果不写表的字段,他就会一一匹配)
    INSERT INTO grade VALUES('大三')

    -- 一般写插入语句,我们一定要数据和字段一一对应

    -- 插入多个字段
    INSERT INTO grade(gradename)
    VALUES('大一'),('大二')

    INSERT INTO student(`name`) VALUES ('张三')

    INSERT INTO student(`name`,`password`,`sex`)
    VALUES ('李四', 'aaaaaa','男'),('王五','bbbbb','男')

    语法:-- insert into 表名([字段名1,字段2,字段3])values('值1'),('值2'),('值3', ....)

    注意事项:

    1、字段是可以省略的,但是后面的值必须要一一对应,不能少

    2、可以同时插入多条数据,VALUES后面的值,需要使用,隔开即可VALUES(),(),....

  3. 修改

    update 修改谁 (条件) set 原来的值=新值

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    -- 修改学员名字,带了条件
    UPDATE student SET `name`='紫薯球' WHERE id=1;

    -- 不指定条件的情况下,会改动所有表
    UPDATE student SET `name`='紫薯球';

    -- 修改多个属性,逗号隔开
    UPDATE student SET `name`='ZISHUQ',email='20140103@qq.com' WHERE id=1;
    -- 语法:
    -- UPADTE 表名 SET COLUMN_NAME = VALUE,[COLUMN_NAME = VALUE, ....] WHERE [条件]

    条件:where子句 运算符 id 等于某个值,大于某个值,在某个区间内修改….

    操作符会返回布尔值

    操作符 含义 范围 结果
    = 等于 5=6 false
    <> 或 != 不等于 5<>6 true
    >
    <
    >=
    <=
    BETWEEN… AND … 在某个范围内 [2,5]
    AND &&
    OR
    IS 是….
    IS NULL 是空
    NOT ~

    注意:

    • colnum_name 是数据库的列,尽量带上``
    • 条件,筛选的条件,如果没有指定,则会修改所有的列
    • value,是一个具体的值,也可以是一个变量
  4. 删除

    delete 命令

    语法:delete from 表名 [where 条件]

    1
    2
    3
    4
    5
    -- 删除数据(避免这样写,会全部删掉)
    DELETE FROM student;

    -- 删除指定数据
    DELETE FROM student WHERE id=1;

    truncate 命令

    作用:完全清空一个数据库表,表的结构和索引约束不会变

    1
    2
    -- 清空 student 表
    TRUNCATE student;

    delete 和 truncate 区别

    • 相同点:都能删除数据,都不会删除表结构
    • 不同:
      • TRUNCATE 重新设置 自增列 计数器会归零
      • TRUNCATE 不会影响事务
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    -- 测试delete 和 truncate 区别
    CREATE TABLE TEST(
    ID INT(4) NOT NULL AUTO_INCREMENT,
    COLL VARCHAR(20) NOT NULL,
    PRIMARY KEY(ID)
    )ENGINE=INNODB DEFAULT CHARSET=utf8

    INSERT INTO TEST(COLL) VALUES('1'),('2'),('3')

    DELETE FROM TEST -- 不会影响自增

    TRUNCATE TABLE TEST -- 自增会归零

4、DQL查询数据