MySQL 数据库语法快速学习2

65 阅读7分钟

大家好我是程序员_蓝天, 本文是为了方便初学者能够快速学习MySQL,写的可能不是很好,希望大家多多包涵。 每个赞都是我前进的动力

关系型数据库

关系型数据库就是建立在关系模型基础上的数据库,简单来说,关系型数据库是由多张相互连接的二维表组成的数据库。

优点

  1. 都是使用表结构,格式一致,易于维护
  2. 使用通用的 SQL 语言操作,使用方便,可用于复杂查询
  3. 数据存储在磁盘中,安全

SQL 通用语法

  1. SQL 语言可以单行或多行书写,以分号(;)结尾。
  2. MySQL 数据库的 SQL 语言不区分大小写,关键字建议使用大写。
  3. 注释

​ 单行注释: --注释内容或#注释内容(MySQL,特有)

​ 多行注释:/注释内容/

  • DDL:操作数据库,表等。
  • DML:对表中数据进行增删改
  • DQL:对表中数据进行查询
  • DCL: 对数据库进行权限控制
  1. 查询

    SHOW DATABASES;
    
  2. 创建

    • 创建数据库
    CREATE DATABASE 数据库名称;
    
    • 创建数据库(判断,如果不存在则创建)
    CREATE DATABASE IF NOT EXISTS 数据库名称;
    
  3. 删除

    • 删除数据库
    DROP DATABASE 数据库名称;
    
    • 删除数据库(判断,如果不存在则删除)
    DROP DATABASE IF NOT EXISTS 数据库名称;
    
  4. 使用数据库

    • 查看当前使用的数据库

      SELECT DATABASE();
      
    • 使用数据库

      USE 数据库名称;
      

DDL 操作表

  • 创建(Create)

    CREATE TABLE 表名(
    		字段名1 类型数据1,
    		字段名2 类型数据2
    		……
    		字段名n 类型数据n    //最好一行不能加,
    );
    

image-20241024194026006.png

image-20241024194150490.png

注意 double

image-20241024194621994.png

image-20241024195036507.png

案例:

image-20241024195316793.png

```mysql
create table student(
	id int,
	name varchar(10),
	sex char(1),
	birthday date,
	score double(5,2),
	email varchar(64),
	tel varchar(15),
	status tinyint
);
```
  • 查询(Retrieve)

    查 mysql 里面的表

    use mysql;
    show tables;
    

    查看 mysql 里面的表 func

    desc func;
    
  • 修改(Update)

    1.修改表名

    ALTER TABLE 表名 RENNAME TO 新的表名;
    

    2.添加一列

    ALTER TABLE 表名 ADD 列名 数据类型;
    

    3.修改数据类型

    ALTER TABLE 表名 MODIFY 列名 新数据类型;
    

    4.修改列名和数据类型

    ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型;
    

    5.删除列

    ALTER TABLE 表名 DROP 列名;
    
  • 删除(Delete)

    1.删除表

    DROP TABLE 表名;
    

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

    DROP TABLE IF EXISTS 表名;
    

DML

  • 添加(insert)

    1.给指定的类添加数据

    INSERT INTO 表名(列名1,列名2,……) VALUES(值1,值2,……);
    

    案例

    INSERT INTO stu(id,name) VALUES(1,'张三');
    

    2.给全部列添加数据

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

    案例:

    INSERT INTO stu(id,name,birthday,score,email,tel,status) VALUES(2,'李四','男','2003-03-01',88.8,'list@qq.com','14567890890');
    
    INSERT INTO stu VALUES(2,'李四','男','2003-03-01',88.8,'list@qq.com','14567890890');
    

    3.批量添加数据

    INSERT INTO 表名(列名1,列名2,……) VALUES(值1,值2,……),(值1,值2,……);
    INSERT INTO 表名 VALUES(值1,值2,……),(值1,值2,……),(值1,值2,……);
    
  • 修改(update)

    1.修改数据表

    UPDATE 表名 SET 列名1=值1,列名2=值2,…… WHERE 条件;
    

    案例:

    update stu set sex='女' where name='张三';
    
    update stu set brithday='1999-11-02',score=99.5 where name='张三';
    

    如果没写 while 条件就都会全部修改

  • 删除(delete)

    DELECT FROM 表名 [WHERE 条件];
    

    案例:

    delect from stu where name='张三';
    

    如果没写 while 条件就都会全部删除

DQL

SELECT
	字段列表
FROM
	表名列表
WHERE
	条件列表
GROUP BY
	分组字段
HAVING
	分组后条件
ORDER BY
	排序字段
LIMIT
	分页限定
  • 基础查询

    1.查询多个字段

    SELECT 字段列表 FROM 表名;
    SELECT *FROM 表名;  --查询所有数据
    

    案例:

    select name,age from stu;
    
    select *from stu;
    

    2.去除重复记录

    SELECT DISTINCT 字段列表 FROM 表名;
    

    案例:

    select distinct id from stu;
    

    3.起别名

    AS: AS可以省略
    
    select name as 姓名,age as 年龄 from stu;
    
    select name 姓名,age 年龄 from stu;
    
  • 条件查询(WHERE)

    1.条件查询语法

    SELECT 字段列表 FROM 表名 WHERE 条件列表;
    

    案例:

    查询年龄大于等于 20,小于等于 30

    select * from stu where age>=20 && age<=30;
    
    select * from stu where BETWEEN 20 and 30;
    

    日期查询

    select * from stu where BETWEEN 1990-02-04 and 2003-03-01;
    

    查询年龄等于 20

    select * from stu where age = 20;
    

    查询年龄不等于 20

    select * from stu where age != 20;
    select * from stu where age <> 20;
    

    查询年龄 18 或 20 的

    select * from stu where age=20 or age=30;
    select * from stu where age in {18,20};
    

    查询 null,要使用 is is not

    select * from stu where age is null;
    

    查询不为 null

    select * from stu where age is not null;
    

    2.条件

image-20241024220544540.png

模糊查询 like

1.查询姓'马'的

```mysql
select * from stu where name like '马%';
```

2.查询第二个字是'花'的同学

```mysql
select * from stu where name like -'花%';
```

3.查询名字中包含'德'的同学

```mysql
select * from stu where name like -'%德%'; --最常用
```
  • 分组查询(GROUP BY)

    聚合函数

    1.概念:将一列数据作为一个整体,进行纵向计算

    2.聚合函数分类:

    count:统计数量(一般选用部位null的列)
    max:最大值
    min:最小值
    sum:求和
    avg:平均值
    

    3.聚合函数语法

    SELECT 聚合函数名(列名) FROM 表;
    

    注意:null 值不参与所有聚合函数运算

    案例:统计班级有多少学生

    select count(id) from stu;  --统计列名不能为null
    select count(*) from stu;   --建议使用或者为主键
    

1.分组查询语法

SELECT 字段列表 FROM 表名 WHERE 分组前条件限定 GROUP BY 分组字段名 HAVING 分组后过滤条件;

注意:分组之后,查询的字段为聚合函数和分组字段,查询任何字段无任何意义。

where 和 having 区别:

​ 1.执行时机不一样:where 是分组之前进行限定,不满足 where 条件,则不参与分组, 而 having 是分组之后对结果进行过滤。

​ 2.可判断条件不一样:where 不能对聚合函数进行判断,having 可以。

​ 执行顺序:where > 聚合函数 > having

​ 案例:

​ 查询男女同学各自数学平均分

select sex, avg(math) from stu group by sex;
select name,sex, avg(math) from stu group by sex;  --无意义

查询男女同学各自数学平均分和人数:

select sex, avg(math),count(*) from stu group by sex;

查询男女同学各自数学平均分和人数, 低于 70 不算:

select sex, avg(math),count(*) from stu where math > 70 group by sex;

查询男女同学各自数学平均分和人数, 低于 70 不算, 分组之后大于 2 人:

select sex, avg(math),count(*) from stu where math > 70 group by sex having count(*)>2;
  • 排序查询(ORDER BY)

    语法:

    SELECT 字段列表 FROM 表名 ORDER BY 排序字段名1 排序方式1,排序字段名2 排序方式2,……;
    

    排序方式:

    1.ASC: 升序排列(默认值)

    2.DESC:降序排列

    注意:如果有多个排序条件,当前面的条件值一样时,才会根据第二条件进行排序

    案例:

    按照年龄升序排序

    select *from stu order by age asc;
    

    数学成绩按降序排列

    select *from stu order by math desc;
    

    数学成绩按降序排列, 如果数学成绩一样,再按照英语成绩升序排列

    select *from stu order by math desc,english asc;
    
  • 分页查询(LIMIT)

    语法:

    SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询条数目;
    

    起始索引:从 0 开始

    计算公式:起始索引 =(当前页码-1)*每页显示条数

    tips:

    1.分页查询 limit 是 MySQL 数据库的方言

    2.Oracle 分页查询使用 rownumber

    3.SQL sever 分页查询使用 top

案例:

从 0 开始查询 3 条数据

select * from stu limit 0,3;

每页显示 3 条数据,查询第一页数据

select * from stu limit 0,3;

每页显示 3 条数据,查询第二页数据

select * from stu limit 3,3;

每页显示 3 条数据,查询第三页数据

select * from stu limit 6,3;

原创-程序员_蓝天