MySQL基础(一)


mysql基础(一)

数据库:Database,存储的数据的集合,提供数据存储的服务。

数据库管理系统:Database Manage System,DBMS,数据库管理系统,是位于用户和操作系统之间的一层数据管理软件。

SQL:操作关系型数据库的编程语言,是一套标准。

数据库系统管理员:Database Administrator,DBA,负责数据库创建、使用及维护的专门人员。

数据库系统:Database System,DBS,数据库系统管理员、数据库管理系统及数据库组成整个单元。

关系型数据库:RNDMS,建立在关系模型基础上,由多张相互连接的二维表组成的数据库。

特点

  • 使用表存储数据,格式统一,便于维护
  • 使用SQL语言操作,标准统一,使用方便,可用于复杂查询。

SQL分类

  • DDL :Data Definition Language,数据定义语言,用来定义数据库对象(数据库,表,字段)
  • DML: Data Manipulation Language,数据操作语言,用来对数据库表中的数据进行增删改
  • DQL: Data Query Language,数据查询语言,用来查询数据库中表的记录
  • DCL:Data Control Language,数据控制语言,用来创建数据库用户、控制数据库的访问权限

DDL

数据类型

数值类型

默认有符号数,后可加unsigned变为无符号数。

  • 整数
    • tinyint,占1byte
    • smallint,占2byte
    • mediumint,占3byte
    • int或integer.占4byte
    • bigint,占8byte
  • 浮点数,后加括号,括号里两个参数,一个是整个数字长度,一个是小数位个数
    • float,占4byte
    • double,占8byte
    • decimal,以字符串形式存储,精度更高,依赖于M(精度)和D(标度)的值
      • M:整体的长度
      • D:小数的长度

字符串类型

  • char:定长字符串,char(n),最多只能存储n个字符,不足n个字符,占用n个字符空间
    • 浪费空间,性能高(时间快)
  • varchar:定长字符串,varchar(n),最多只能存储n个字符,不足n个字符,按实际长度存储
    • 节省空间,性能低(时间慢)
  • tinyblob,存储二进制字符串,长度0-255字节
  • blob,存储二进制字符串,长度0-65535字节
  • mediumblob,存储二进制字符串,长度0-1677215字节
  • longblob,存储二进制字符串,长度0-4294967295字节
  • tinytext,文本数据(字符串),0-255
  • text,文本数据(字符串),0-65535
  • mediumtext,文本数据(字符串),0-1677215
  • longtext,文本数据(字符串),0-4294967295

日期类型

  • date:日期,只存储年月日,格式YYYY-MM-DD
  • time:时间,只存储时分秒,格式HH:MM:SS
  • year:年份,格式YYYY
  • datetime:日期+时间,存储年月日时分秒,格式YYYY-MM-DD HH:MM:SS
  • timestamp:日期+时间,时间戳,格式YYYY-MM-DD HH:MM:SS

数据库操作

数据库操作,以下语法中database,可以替换成schema

查询

查询所有数据库:show databases;

查询当前数据库:select database();

使用

使用数据库:use 数据库名;

创建

创建数据库:create database [if not exits] 数据库名 [default charset 字符集] [collate 排序规则];

删除

删除数据库:drop database [if exits ] 数据库名;

表操作

创建

格式

1
2
3
4
5
create table 表名(
字段1 字段类型 [约束] [commnet 字段1注释],
......
字段n 字段类型 [约束] [commnet 字段n注释]
)[commnet 表注释];

范例
设计一张员工信息表,要求如下:

  1. 编号(纯数字)
  2. 员工工号(字符串类型,长度不超过10位)
  3. 员工姓名(字符串类型,长度不超过10位)
  4. 性别(男/女,存储一个汉字)
  5. 年龄 (正常人年龄,不可能存储负数)
  6. 身份证号(二代身份证号均为18位,身份证中有X这样的字符)
  7. 入职时间(取值年月日即可)
1
2
3
4
5
6
7
8
9
create table emp(
id int unsigned comment '编号',
work_id varchar(10) comment '员工工号',
name varchar(10) comment '员工姓名',
gender char(1) comment '性别',
age tinyint unsigned comment '年龄',
id_card char(18) comment '身份证号',
entry_date date comment '入职时间'
) comment '员工信息表';

查询

  • 查询当前数据库所有表
    • show tables;
  • 查询表结构
    • desc 表名;
  • 查询建表语句
    • show create table 表名;

修改

  • 添加字段
    • alter table 表名 add 字段名 类型(长度) [comment 注释] [约束];
  • 修改字段类型
    • alter table 表名 modify 字段名 新数据类型(长度);
  • 修改字段名和字段类型
    • alter table 表名 change 旧字段名 新字段名 类型(长度) [comment 注释] [约束];
  • 删除字段
    • alter table 表名 drop column 字段名;
  • 修改表名
    • rename table 表名 to新表名;

删除

删除表时,其中数据也会被删除

  • 删除表
    • drop table [if exists] 表名;
  • 删除指定表,并重新创建该表(相当于把表中数据清除)
    • truncate table 表名;

DML

INSERT

  • 指定字段添加数据
    • insert into 表名(字段名1,字段名2) value(值1,值2);
  • 全部字段添加数据
    • insert into 表名 values(值1,值2…);
  • 批量添加数据(指定字段)
    • insert into 表名(字段名1,字段名2) values(值1,值2),(值1,值2);
  • 批量添加数据(全部字段)
    • insert into 表名 values(值1,值2…),(值1,值2)

  1. 插入数据时,指定的字段顺序需与值的顺序一一对应
  2. 字符串和日期型数据应该包含在引号中
  3. 插入的数据大小,应该在字段的规定范围内。

UPDATE

update 表名 set 字段名1=值1,字段2=值2,…[where 条件];

:修改语句的条件可以有,也可无,若无,则会修改整张表的数据

DELETE

delete from 表名 [where 条件];

  1. delete语句的条件可以有,也可无,若无,则会删除整张表的所有数据
  2. delete语句不能删除某个字段的值(若要操作,可使用update,将该字段的值值为NULL)

DQL

基本查询

  • 查询多个字段
    • select 字段1,字段2,字段3 from 表名;
  • 查询所有字段(通配符)
    • select * from 表名;
    • : * 代表所有字段,由于星号不直观且影响效率,所以在实际开发中尽量少用
  • 设置别名
    • select 字段 [as 别名1],字段2 [as 别名2] from 表名;
    • as可以省略
    • 若别名中包括特殊字符例如空格,需要将别名用引号引住
  • 去除重复记录
    • select distinct 字段列表 from 表名;

条件查询

select 字段列表 from 表名 where 条件列表;

比较运算符

1
2
3
4
5
6
7
8
9
10
> 									大于
>= 大于等于
< 小于
<= 小于等于
= 等于
<>或!= 不等于
between ... and ... 在某个范围之内(含最小,最大值)
in(...) 在in之后的列表中的值,多选一
like 占位符 模糊匹配,_匹配单个字符,%匹配任意个字符
is [not] null (不)是null,不可以用=null

逻辑运算符

1
2
3
and 或 &&							并且,多个条件同时成立
or 或 || 或者,多个条件中任意一个成立
not 或 ! 非,不是

聚合函数

聚合函数是将一列数据作为一个整体,进行纵向计算。

select 聚合函数(字段列表) from 表名;

函数

  • count:统计数量
  • max:最大值
  • min:最小值
  • avg:平均值
  • sum:求和

  • null值不参与所有聚合函数运算
  • 统计数量可以用: count(星号) count(字段) count(常量),推荐使用count(星号)

分组查询

select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件];

having和where的区别

  1. 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组,而having是分组之后对结果进行过滤。
  2. 判断条件不同:where不能对聚合函数进行判断,having可以

  • 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义
  • 执行顺序:where>聚合函数>having

排序查询

select 字段列表 from 表名 [where 条件列表] [group by 分组字段] order by 字段1 排序方式1,字段2 排序方式2…;

排序方式

  1. ASC:升序,默认值,可省略
  2. DESC:降序

注意事项:若是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。

分页查询

select 字段列表 from 表名 limit 起始索引,查询记录数;

注意事项

  1. 起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数
  2. 分页查询在不同的数据库中有不同的实现,MySQL中是LIMIT
  3. 若查询的是第一页数据,起始索引可以省略,直接简写为limit 查询记录数

编写顺序

  1. select 字段列表
  2. from 表名列表
  3. where 条件列表
  4. group by 分组字段列表 having 分组后条件列表
  5. order by 排序字段列表
  6. limit 分页参数

执行顺序

  1. from 表名列表
  2. where 条件列表
  3. group by 分组字段列表 having 分组后条件列表
  4. select 字段列表
  5. order by 排序字段列表
  6. limit 分页参数

DCL

用户管理

  1. 查询用户
1
2
use mysql;
select * from user;
  1. 创建用户
1
create user '用户名'@'主机名' identified by '密码';
  1. 修改用户密码
1
alter user '用户名'@'主机名' identified with mysql_native_password by '新密码';
  1. 删除密码
1
drop user '用户名'@'主机名';

:主机名可用%通配。

权限控制

常见权限:

  • all,all privileges:所有权限
  • select:查询数据
  • insert:插入数据
  • update:修改数据
  • delete:删除数据
  • alter:修改表
  • drop:删除数据库/表/视图
  • create:创建数据库/表

查询权限:

show grants for ‘’用户名‘@’主机名’;

授予权限:

grant 权限列表 on 数据库.表名 to ‘用户名‘@’主机名’;

撤销权限:

revoke 权限列表 on 数据库名.表名 from ‘用户名‘@’主机名’;

  1. 多个权限之间,使用逗号分隔
  2. 授权时,数据库名和表名可以通过*进行通配,代表所有

Author: ljs
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source ljs !
评论
  TOC