MYSQL基础语法

课程链接:

MYSQL8.0零基础入门之从青铜到钻石:https://www.imooc.com/learn/1281

1、SQL语句

1.1 SQL分类

  1. DDL(Data Definition Language)数据定义语言

    定义数据库对象:数据库、表、列等。关键字:create,drop,alter等。

  2. DML(Data Manipulation Language)数据操作语言

    用来对数据库中表的数据进行增删改查。关键字:insert,delete,update等。

  3. DQL(Data Query Language)数据查询语言

    用来查询数据库中表的记录(数据)。关键字:select,where等

  4. DCL(Data Control Language)数据控制语言

    用来定义数据库的访问权限和安全级别,及创建用户。关键字:GRANT,REVOKE等。

1.2 SQL通用语法

  1. SQL语句可以单行或多行书写,以分号结尾。
  2. 可使用空格和缩进来增强语句的可读性。
  3. Mysql数据库的SQL语句不区分大小写,关键字建议使用大写(效率更高)。

1.3 DDL语句

1.3.1 DDL操作数据库

1.3.1.1 DDL操作数据库
  1. 直接创建数据库

    CREATE DATABASE 数据库名;

  2. 判断是否存在并创建数据库

    CREATE DATABASE IF NOT EXISTS 数据库名;

  3. 创建数据库并指定字符集(编码表)

    CREATE DATABASE 数据库名 CHARACTER SET 字符集;

1.3.1.2 查看数据库
  1. 查看数据库

    SHOW DATABASES;

  2. 查看数据库的定义信息

    SHOW CREATE DATABASE 数据库名

1.3.1.3 修改数据库

修改字符集

ALTER DATABASE 数据库名 DEFAULT CHARACTER SET 字符集;

1.3.1.4 删除数据库

DROP DATABASE 数据库名;

1.3.1.5 使用数据库
  1. 查看正在使用的数据库

    SELECT DATABASES();

  2. 使用、切换数据库

    USE 数据库名;

1.3.2 DDL操作表

1.3.2.1 创建表

? CREATE TABLE 表名 (字段名1 字段类型1,字段名2 字段类型2...);

? MYSQL数据类型

常用数据类型

类型 描述
int 整型
double 浮点型
varchar 字符串型
date 日期类型:yyyy-MM-dd

详细数据类型

分类 类型名称 说明
整数类型 tinyint 很小的整数
smallint 小的整数
mediumint 中等大小的整数
int(integer) 普通大小的整数
小数类型 float 单精度浮点数
double 双精度浮点数
decimal(m,d) 压缩严格的定点数
日期类型 year YYYY 1901-2155
time HH:MM:SS -838:59:59~838:59:59
date YYYY-MM-DD 1000-10-01~9999-12-31
datetime YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00~9999-12-31 23:59:59
timestamp YYYY-MM-DD HH:MM:SS 1970-01-01 00:00:01UTC~2038-01-19 03:14:07UTC
文本、二进制类型 CHAR(M) M为0~255之间的整数
VARCHAR(M) M为0~65536之间的整数
TINYBLOB 允许长度0~255字节
BLOB 允许长度0~6535字节
MEDIUMBLOB 允许长度0~167772150字节
LONGBLOB 允许长度0~4294967295字节
TINYTEXT 允许长度0~255字节
TEXT 允许长度0~65535字节
MEDIUMTEXT 允许长度0~167772150字节
LONGTEXT 允许长度0~4294967295字节
VARBINARY(M) 允许长度0~M个字节的变长字节字符串
BINARY(M) 允许长度0~M个字节的定长字节字符串
1.3.2.2 查看表
  1. 查看数据库中的所有表

    SHOW TABLES;

  2. 查看表结构

    DESC 表名;

  3. 查看创建表的SQL语句

    SHOW CREATE TABLE 表名;

1.3.2.3 快速创建一个表结构相同的表

CREATE TABLE 新表名 LIKE 旧表名;

1.3.2.4 删除表
  1. 直接删除表

    DROP TABLE 表名;

  2. 判断表是否存在并删除表

    DROP TABLE IF EXISTS 表名;

1.3.2.5修改表结构
  1. 添加表列

    ALTER TABLE 表名 ADD 列名 类型;

  2. 修改列类型

    ALTER TABLE 表名 MODIFY 列名 新的类型;

  3. 修改列名

    ALTER TABLE 表名 CHANGE 旧列名 新列名 类型;

  4. 删除列

    ALTER TABLE 表名 DROP 列名;

  5. 修改表名

    RENAME TABLE 旧表名 TO 新表名;

  6. 修改字符集

    ALTER TABLE 表名 CHARACTER SET 字符集;

1.4 DML语句

? DML(Data Manipulation Language)数据操作语言

? 用来对数据库中表的数据进行增删改。关键字:insert,delete,update等

1.4.1 插入记录

  1. 关键字说明

INSERT INTO 表名 ——表示往哪张表中添加数据

(字段名1,字段名2,...) ——要给哪些字段设置值

VALUES(值1,值2); ——设置具体的值

  1. 注意
  • 值与字段必须对应,个数相同,类型相同
  • 值的数据大小必须在字段的长度范围内
  • 除了数值类型外,其他类型字段的值必须使用引号(建议单引号)
  • 如果要插入空值,可以不写字段,或者插入null
1.4.1.1 插入全部字段
  • 所有的字段名都要写出来

    INSERT INTO 表名(字段名1,字段名2,字段名3...) VALUES(值1,值2,值3...);

  • 不写字段名

    INSERT INTO 表名 VALUES(值1,值2,值3...);

1.4.1.2 插入部分数据

? INSERT INTO 表名(字段名1,字段名2...) VALUES(值1,值2...);

? 没有添加数据点字段会使用null

1.4.1.3 蠕虫复制

? 定义:在已有的数据基础之上,将原来的数据进行复制,插入到对应的表中

? 通用格式:INSERT INTO 表名1 SELECT * FROM 表名2;

? 作用:将表名2的数据复制到表名1中

? 注意:如果只想复制表中的部分字段使用如下格式:

? INSERT INTO 表名1(字段1,字段2...) SELECT 字段1,字段2... FROM 表名2;

1.4.2 更新表记录

  1. 不带条件修改数据

    UPDATE 表名 SET 字段名=值;

  2. 带条件修改数据

    UPDATE 表名 SET 字段名=值 WHERE 字段名 = 值;

  3. 关键字说明

    UPDATE:修改数据

    SET:修改哪些字段

    WHERE:指定条件

1.4.3 删除表记录

  1. 不带条件删除数据

    DELETE FROM 表名;

  2. 带条件删除数据

    DELETE FROM 表名 WHERE 字段名=值;

truncate删除表记录

TRUNCATE TABLE 表名;

truncate和delete的区别:

  • delete是将表中的数据一条一条删除
  • truncate是将整个表摧毁,重新创建一个新的表结构和原来表结构一模一样

1.5 DQL语句

DQL(Data Query Language)数据查询语言

用来查询数据库中表的记录(数据)。关键字:select,where等

注意:查询不会对数据库这种的数据进行修改,只是一种显示数据的方式

3.5.1 简单查询

3.5.1.1 查询表所有数据
  1. 使用*标识所有列

    SELECT * FROM 表名;

  2. 写出查询每列的名称

    SELECT 字段名1,字段名2,字段名3... FROM 表名;

3.5.1.2 查询指定列

? 查询指定列的数据,多个列之间以逗号分隔

? SELECT 字段名1,字段名2... FROM 表名;

3.5.1.3 别名查询
  1. 查询时给列、指定别名需要使用AS关键字

  2. 使用别名的好处是方便观看和处理查询到的数据

    SELECT 字段名1 AS 别名,字段名2 AS 别名... FROM 表名;

    注意:AS可以省略不写

3.5.1.4 清除重复值
  1. 查询指定列并且结果不出现重复数据

    SELECT DISTINCT 字段名 FROM 表名;

3.5.1.5 查询结果参与运算
  1. 某列数据和固定值运算

    SELECT 列名1 + 固定值 FROM 表名;

  2. 某列数据和其他列数据参与运算

    SELECT 列名1 + 列名2 FROM 表名;

注意:参与运算的必须是数值类型

3.5.2 条件查询

? 语法格式:SELECT 字段名 FROM 表名 WHERE 条件;

3.5.3.1 比较运算符

? > 大于

? < 小于

? <= 小于等于

? >= 大于等于

? = 等于

? <>、!= 不等于

3.5.3.2 逻辑运算符

? and:多个条件同时满足

? or:多个条件其中一个满足

? not:不满足

? in关键字

? 语法格式:SELECT 字段名 FROM 表名 WHERE 字段名 IN (数据1,数据2...)

? in里面的每个数据都会作为一次条件,只要满足条件的就会显示

3.5.3.3 范围

? BETWEEN 值1 AND 值2:表示值1到值2范围,包头又包尾

? 如:age between 35 and 40

? 相当于:age >=35 && age <=70

3.5.3.4 模糊查询like

? like表示模糊查询

? SELECT *FROM 表名 WHERE 字段名 LIKE ‘通配符字符串‘;

? 满足通配符字符串规则的数据就会显示出来

? MySQL通配符有两个:

? %:表示0或多个字符(任意个字符)

? _:表示一个字符

3.5.3.5 排序

? 通过 order by 子句,可以将查询出的结果进行排序(排序只是显示方式,不会影响数据库中数据的顺序)

? 语法:SELECT 字段 FROM WHERE 字段 = 值 ORDER BY 字段名 [ASC|DESC];

? ASC:升序,默认升序

? DESC:降序

3.5.3.5.1 单列排序

? 单列排序就是使用一个字段排序

3.5.3.5.2 组合排序

? 组合排序就是先按第一个字段进行排序,如果第一个字段相同,才按第二个字段进行排序,以此类推。

? SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名1 [ASC|DESC],字段名2[ASC|DESC];

3.5.3.6 聚合函数

? 横向查询是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列是值进行计算,然后返回一个结果值。另外聚合函数会忽略空值。

? 五个聚合函数:

? count:统计指定列记录数,记录为NULL的不统计

? sum:计算指定列的数值和,如果不是数值类型,那么计算结果为0

? max:计算指定列的最大值

? min:计算指定列的最小值

? avg:计算指定列的平均值,如果不是数值类型,那么计算结果为0(NULL不参与计算)

? 聚合函数的使用:写在SQL语句的SELECT 后字段名的地方

? SELECT 字段名... FROM 表名;

? SELECT COUNT(字段名) FROM 表名;

3.5.3.7 分组

? 分组查询是指使用 GROUP BY 语句对查询信息进行分组,相同数据作为一组

? SELECT 字段1,字段2... FROM 表名 GROUP BY 分组字段 [HAVING 条件];

? GROUP BY 将分组字段结果中相同内容作为一组

HAVING和WHERE的区别:

  • HAVING是在分组后对数据进行过滤
  • WHERE是在分组前对数据进行过滤
  • HAVING后面可以使用聚合函数
  • WHERE后面不可以使用聚合函数

? 分组的目的是为了统计,一般分组会跟聚合函数一起使用

? 分组后聚合函数操作的就是一组数据

注意事项:当我们使用某个字段分组在查询的时候也需要将这个字段查询出来,否则看不到数据属于哪个组的

  • 查询的时候写入分组字段即可

ANY_VALUE()

  1. MySQL5.7之后,sql_mode中ONLY_FULL_GROUP_BY模式默认设置为打开状态。
  2. ONLY_FULL_GROUP_BY的语义就是确定select target list中的所有列的值都是明确语义,简单的说来,在此模式下,target list中的值要么是来自于聚合函数(sum、avg、max等)的结果,要么是来自于group by list中的表达式的值
  3. MySQL提供了any_value()函数来抑制ONLY_FULL_GROUP_BY值被拒绝
  4. any_value()会选择被分到同一组的数据里第一条数据的指定列值作为返回数据
3.5.3.8 limit语句

? LIMIT:限制查询记录的条数

? SELECT *|字段列表 [AS 别名] FROM 表名 [GROUP BY子句] [HAVING子句] [ORDER BY子句] [LIMIT子句];

? LIMIT语法格式:

? LIMIT offset,length;或limit length;

? offset是指偏移量,可以认为是跳过的记录数量,默认为0

? length是指需要显示的总记录数

注意

  • 如果第一个参数是0可以简写:

    select * from 表名 limit 0,5;

    select * from 表名 limit 5;

  • LIMIT 10,5:不够5条,有多少显示多少

2 、数据库分类

? 对表中的数据进行进一步的限制,保证数据的正确性、有效性和完整性

? 约束种类:

  • PRIMARY KEY:主键
  • UNIQUE:唯一
  • NOT NULL:非空
  • DEFAULT:默认
  • FOREIGN KEY:外键

2.1 主键

2.1.1 主键的作用

? 用来唯一标识一条记录,每个表都应该有一个主键,并且每个表只能有一个主键。

? 那个字段应该作为表的主键

? 通常不用业务字段作为主键,单独给每张表设计一个id的字段,把id作为主键。主键是给数据库和程序使用的,不是给最终的客户使用的。所以主键有没有含义没有关系,只要不重复,非空就行。

2.1.2 创建主键

? 主键:PRIMARY KEY

? 主键的特点

  • 主键必须包含唯一的值
  • 主键列不能包含NULL值创建主键创建主键的方式

? 创建主键的方式

? 在创建表的时候给字段添加主键

? 字段名 字段类型 PRIMARY KEY

2.1.3 删除主键

? ALTER TABLE 表名 DROP PRIMARY KEY;

2.1.4 主键自增

? 通常希望在每次插入新纪录时,数据库自动生成主键字段的值。

? AUTO_INCREMENT 表示自动增长(字段类型必须是正数类型)

? 字段名 类型 PRIMARY KEY AUTO_INCREAMENG

? 修改自增字段值

扩展

  • 默认AUTO_INCREMENT的起始值是1,如果希望修改自增字段的值,使用下列SQL语法:

    ALTER TABLE 表名 AUTO_INCREMENT=起始值;

delete和truncate的区别

  • delete删除表中的数据,但不重置AUTO_INCREMENT的值
  • truncate摧毁表,重建表,AUTO_INCREMENT重置为1

2.2 唯一

? 在这张表的这个字段的值不能重复

2.2.1 唯一约束的基本格式

? 字段名 字段类型 UNIQUE

非空约束字段可以有重复的NULL

2.3 非空

? 这个字段必须设置值,,不能是NULL

2.3.1 非空约束的基本语法格式

? 字段名 字段类型 NOT NULL

2.3.2 默认值

? 往表中添加数据时,如果不指定这个字段的数据,就使用默认值。

? 默认值格式:

? 字段名 字段类型 DEFAULT 默认值

?

MYSQL基础语法

上一篇:pyflink实时接收kafka数据至print


下一篇:【DB宝36】使用Docker分分钟搭建漂亮的prometheus+grafana监控