MySQL

SQL 语句 孰能生巧

DDL 对数据库 表结构 增加、修改 删除操作

DML 表结构中的数据 增加( insert )、修改( update ) 删除( delete ) 查询( select

DQL 用来查询所需要的信息

1 . 安装

  • 下载
  • 启动

    • 初始化 : mysqld --initialize --user=mysql --console

      账号 : root 密码 : re0oGwlny9_r(随机)

    • 添加服务 : mysqld -install
    • 启动服务 : net start mysql
    • 登录 : mysql -u root -p
    • 改密码 : ALTER USER root@localhost IDENTIFIED BY 'xxxx';
  • 通过Navicat来连接和管理

    报错的话 :

2 . DDL

1 . 基本操作

  • 查询

    -- 查询所有数据库名称
    show databases;
    -- 查询正在使用的数据库
    select database()
    -- 使用数据库
    use xxx; 
  • 创建

    -- 创建数据库
    create database xxx;
    -- 先判断再创建
    create database if not exists xxx;
    -- 创建并指定字符集
    create database xxx character set 字符集名;
  • 删除

    drop database xxx;
    -- 判断删除
    drop database if exists xxx;

2 . 表结构创建

先指定表结构在哪个数据库中

  • 创建表

    create table if not exists xxx(
        列名1 数据类型[长度] [字段约束],
        列名2 数据类型[长度] [字段约束],
        列名3 数据类型[长度] [字段约束]
    );
    eg: 
    create database if not exists Atanycosts;
    use Atanycosts;
    create table if not exists Atanycosts(
        id int,
        name varchar(20),
        create_time date,
        QQ int(10);
    );
  • 修改表

    -- 修改表名称
    alter table xxx rename to xxx;
  • 删除表

    drop table xxx;
    drop table if exists xxx;

3 . 数据类型

三种 : 数值日期/时间字符串(字符)类型

1 . 数值类型
类型大小范围(有符号)范围(无符号)用途
TINYINT1 Bytes(-128,127)(0,255)小整数值
INT或INTEGER4 Bytes(-2 147 483 648,2 147 483 647)(0,4 294 967 295)大整数值
FLOAT4 Bytes(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)0,(1.175 494 351 E-38,3.402 823 466 E+38)单精度 浮点数值
DOUBLE8 Bytes(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)双精度 浮点数值

其他不管

2 . 字符串类型

char(n)varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 char(30) 就可以存储 30 个字符

类型大小用途
CHAR0-255 bytes定长字符串
VARCHAR0-65535 bytes变长字符串
TEXT0-65 535 bytes长文本数据

其他不管

3 . 日期和时间类型

表示时间值的日期和时间类型为 yeardatetimedatetimetimestamp

类型大小(bytes)范围格式用途
YEAR11901/2155YYYY年份值
DATE31000-01-01/9999-12-31YYYY-MM-DD日期值
TIME3‘-838:59:59’/‘838:59:59’HH:MM:SS时间值或持续时间
DATETIME81000-01-01 00:00:00/9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS混合日期和时间值
TIMESTAMP41970-01-01 00:00:00 结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07YYYYMMDD HHMMSS混合日期和时间值,时间戳

2 . DML

数据操作语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性,常用的语句关键字主要包括 insertdeleteudpateselect

  • insert

    -- INSERT INTO 语句用于向表格中插入新的行
    -- 语法格式:
    -- 插入数据列与值的顺序需要一一对应
    INSERT INTO 表名称 (列名1,列名2 ...) VALUES (值1, 值2,....)
     -- 向表中插入所有列
    INSERT INTO 表名称 VALUES (值1, 值2,....)   
    
    --eg:
    INSERT INTO `Atanycosts` (`id`, `name`, `age`, `addres`, `create_time`) VALUES (1, 'mm', 1, '1', '2022-01-20 03:51:54');
    INSERT INTO `Atanycosts` VALUES (1, 'mm', 1, '1', '2022-01-20 03:51:54');
  • update

    -- 语法格式:
    -- 直接修改整张表的所有行数据
    update 表名称 set 字段=值,字段=值,...;
    -- 根据条件查找到对应行数据 修改
    update 表名称 set 字段=值,字段=值,... where 条件
    -- 例子: 
    UPDATE Atanycosts ` SET `name` = 'mm', `age` = 25  WHERE `id` = 1;
    -- 修改所有
    UPDATE Atanycosts ` SET `name` = 'mm', `age` = 25
  • delete

    -- 语法格式:
    -- 根据条件删除表中的数据
    delete from 表名称 where 条件 
    -- 清空表中所有的数据
    TRUNCATE Atanycosts;
    
    -- eg:
    --根据条件id=1 删除id=1 行数据
    delete from Atanycosts  where  where id=1; 
    -- 清空表中所有的数据
    delete from Atanycosts;
    --清空表中所有的数据
    TRUNCATE Atanycosts;

    TRUNCATEdelete 不同?

    truncate : 会清空表中所有的数据,速度快,不可回滚;实质是删除整张表包括数据再重新创建表;

    delete : 逐行删除数据,每步删除都是有日志记录的,可以回滚数据;实质是逐行删除表中的数据;

3 . 约束

用于限制表中的数据,为了保证表中数据的准确性和可靠性

约束分类

  • PRIMARY KEY :主键,用于保证该字段的值具有唯一性并且非空
  • AUTO_INCREMENT : 自动增长约束
  • NOT NULL :非空,用于保证该字段的值不能为空
  • UNIQUE :唯一,用于保证该字段的值具有唯一性,可以为空
  • DEFAULT :默认值,用于保证该字段有默认值
  • CHECK :检查约束(MySql不支持),检查字段的值是否为指定的值。
  • FOREIGN KEY :外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值,在从表添加外键约束,用于引用主表中某些的值

1 . 主键约束

1 . 单列主键

-- 语法格式:
CREATE TABLE 表的名称 (
    <字段名> <数据类型> PRIMARY KEY
}
-- eg:
CREATE TABLE `Atanycosts` (
    `id` int PRIMARY KEY ,
    `name` varchar(255) ,
    `age` int 
) ;

2 . 联合主键

联合主键(复合主键),由多个列(字段组成)

-- PRIMARY key (主键列);
CREATE TABLE `Atanycosts` (
  `id` int,
  `name` varchar(255),
  `age` int ,
  `phone` varchar(11) ,
  PRIMARY KEY (id,phone)
);

2 . 自动增长约束

注意:

1.一张表中只能有一个自动增长的字段
2.配合主键一起使用 并且只适用于整数类型
3.自动增长默认的初始值1,每增加一条记录,该字段的值会增加1

-- 语法格式如下:
-- 字段名 数据类型 AUTO_INCREMENT

CREATE TABLE `Atanycosts` (
  `id` int PRIMARY KEY AUTO_INCREMENT  ,
  `name` varchar(255),
  `age` int ,
  `phone` varchar(11) 
)AUTO_INCREMENT=1000; -- 指定初始值,可不指定

-- 创建之后指定
alter table Atanycosts AUTO_INCREMENT 2000; 

3 . 非空约束

创建表的时候

<字段名><数据类型>NOT NULL;

-- not null 非空约束用于确保当前列的值不为空
CREATE TABLE `Atanycosts` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `age` int NOT NULL,
  `phone` varchar(11) NOT NULL,
  PRIMARY KEY (`id`)
);

4 . 唯一约束

所有记录中该字段的值不能重复出现

可以有多个唯一约束

CREATE TABLE `Atanycosts` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255),
  `age` int DEFAULT NULL,
  `phone` varchar(11) ,
  PRIMARY KEY (`id`),
  UNIQUE KEY `test` (`phone`)  -- 指定约束名称和约束字段
);
-- UNIQUE KEY  约束名称 (约束字段)
-- 添加约束名称是为了方便 直接删除
-- 在修改表时添加唯一约束

ALTER TABLE <数据表名> ADD CONSTRAINT <唯一约束名> UNIQUE (<列名>);

ALTER TABLE Atanycosts ADD CONSTRAINT test UNIQUE(phone);

-- 删除约束
ALTER TABLE Atanycosts DROP INDEX test;

5 . 默认约束

在创建表时设置默认值约束

<字段名> <数据类型> DEFAULT <默认值>;

CREATE TABLE `Atanycosts` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT 'Atanycosts',
  `age` int DEFAULT 1,
  `phone` varchar(11) ,
  PRIMARY KEY (`id`)
);change column

-- 在修改表时添加默认值约束
ALTER TABLE <数据表名>
CHANGE COLUMN <字段名> <数据类型> DEFAULT <默认值>;
ALTER TABLE Atanycosts
CHANGE COLUMN phone varchar(11) DEFAULT  '1111';

6 . 零填充约束

create table 表名称
(
    字段名称 int zerofill,
    ...
);
-- eg:
-- id int(10)
-- id=1
-- 0000000001

7 . delete与truncate 删除数据区别

区别 :

  • delete

    删除数据之后,自动增长还是从最后一个删除数据的id基础上做自增;

    逐行删除数据,每步删除都是有日志记录的,可以回滚数据;实质是逐行删除表中的数据;

  • truncate

    清空数据之后 自动增长是从初始值1开始

    会清空表中所有的数据,速度快,不可回滚;实质是删除整张表包括数据再重新创建表;

-- 清空表数据
delete  from Atanycosts;
truncate  Atanycosts;

4 . DQL

1 . 如何使用

-- 创建数据库 ddl
create DATABASE if not EXISTS test;
-- 使用mayikt数据库
use test;
drop table Atanycosts;
-- 创建mayikt_student学生表
CREATE TABLE `Atanycosts` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(10) not null COMMENT '姓名',
  `age` tinyint  COMMENT '年龄',
  `address` varchar(255) COMMENT '地址',
  `class_id` int  COMMENT '班级id',
  PRIMARY KEY (`id`)
);
-- 新增测试数据 dml
INSERT INTO Atanycosts VALUES(NULL,'余胜军',28,'湖北武汉','01');
INSERT INTO Atanycosts VALUES(NULL,'小哈',21,'上海','01');
INSERT INTO Atanycosts VALUES(NULL,'张三',17,'北京','02');
INSERT INTO Atanycosts VALUES(NULL,'李四',22,'山东','02');
INSERT INTO Atanycosts VALUES(NULL,'王麻子',11,'四川','02');
-- 1.查询所有的学生
select * from Atanycosts;
-- 2.查询学生的姓名和年龄
select name,age from Atanycosts;
-- 3.别名称查询 使用关键字as 
select * from Atanycosts as student;
-- 4.列别名称
select name as 姓名,age 年龄  from Atanycosts as student;
-- 5.去重复值
select DISTINCT class_id from Atanycosts;
-- 6.查询结果是表达式(运算值);将所有的学生年龄+5岁
select name,age+5 as age  from Atanycosts;

2 . 运算符

3 . 排序

  • asc 代表 升序排列 desc 代表降序排列 默认是为升序;
  • order by 可以支持单个字段,多个字段 ;
  • order by 放在查询语句最后面,limit 分页除外;

    -- 1.根据学生年龄从小到大;
    SELECT * from Atanycosts  order by age;
    -- 2.根据学生年龄从大到小;
    SELECT * from Atanycosts  order by age desc;
    -- 3.判断学生的年龄大于18岁,在从小到大排序
    SELECT * from Atanycosts where age>18  order by age ;
    -- 4.根据学生的年龄从大到小排序,以班级id 从小到大排序 当年龄相同 则根据 班级id从小到大排序
    SELECT * from Atanycosts order by age desc ,class_id desc ;
    -- 5.根据班级id去重,根据班级id从大到小排序
    SELECT DISTINCT class_id from Atanycosts ORDER BY class_id desc;

    一般的情况下我们使用数字排序,从小到大 或者从大到小

    如果是字母排序 则 根据字母的顺序 从A到Z排序 或者Z到A顺序

    如果是汉字的拼音排序,用的比较多是在人名的排序中,按照姓氏的拼音字母,从A到Z排序

4 . 分页

-- 方式1:显示前n条
select 字段1,字段2 ... from  Atanycosts limit n 
-- 方式2:分页显示
select 字段1,字段2 ... from  Atanycosts limit m,n

SELECT * from Atanycosts limit 5; -- 前5条数据
SELECT * from Atanycosts limit 5,5; -- 从第6条开始显示 显示5条

m :表示从第几条索引开始 计算方式 ( 当前页 - 1) * 每页显示条数

n :表示查询多少条数据

5 . 聚合

不急

6 . 分组

不急

5 . 多表关系

不急

最后修改:2022 年 11 月 04 日
如果觉得我的文章对你有用,请随意赞赏