黑马mysql教程笔记(mysql8教程)基础篇——数据库相关概念、mysql安装及卸载、数据模型、SQL通用语法及分类(DDL、DML、DQL、DCL)

参考文章1:https://www.bilibili.com/video/BV1Kr4y1i7ru/

参考文章2:https://dhc.pythonanywhere.com/article/public/1/

在这里插入图片描述

文章目录

  • 基础篇
    • 数据库相关概念
      • (数据库DataBase(DB)、数据库管理系统DataBase Management System(DBMS)、结构化查询语言SQL(Structured Query Language))
      • 主流的关系型数据库管理系统(SQL统一语言标准)
    • mysql安装及卸载
      • 安装
      • 卸载
    • 数据模型
      • 关系型数据库RDBMS(建立在关系模型基础上,由多张相互连接的二维表组成的数据库)
    • SQL通用语法及分类
      • 通用语法
      • DDL(Data Definition Language): 数据定义语言,用来定义数据库对象(数据库,表,字段)
        • 数据库操作
          • 查询所有数据库:show databases
          • 查询当前数据库:select
          • 创建数据库:create
          • 删除数据库:drop
          • 使用数据库:use
          • 注意事项
        • 表操作
          • mysql数据类型
            • 数值类型
            • 字符串类型
            • 日期时间类型
          • 查询当前数据库所有表:show tables
          • 查询表结构:desc
          • 查询指定表的建表语句:show create table(可展示表的详细信息,包括创建时的comment)
          • 创建表:create table
          • 添加字段:`ALTER TABLE ttt ADD fff ttt COMMENT 'xxx';`。MySQL中的字段可以在创建表时创建,也可以在创建表后单独添加
          • 修改字段数据类型(`ALTER TABLE 表名 MODIFY`)(主要用于修改列的数据类型或更改默认值等。它只能用来修改已经存在的列的属性,不能修改列的名称)
          • 修改字段名和字段数据类型(`ALTER TABLE 表名 CHANGE`)(不仅可以修改列的数据类型或更改默认值,还可以更改列的名称)
          • 删除字段(`ALTER TABLE 表名 DROP 字段名;`)
          • 修改表名(`ALTER TABLE 表名 RENAME TO 新表名`)
          • 删除表(`DROP TABLE [IF EXISTS] 表名;`)
          • 删除表,并重新创建该表(`TRUNCATE TABLE 表名`)(可用于清理表数据)
      • DML(Data Manipulation Language): 数据操作语言,用来对数据库`表中`的数据进行增删改
        • 添加数据`INSERT`
          • 指定字段:`INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...);`
          • 全部字段:`INSERT INTO 表名 VALUES (值1, 值2, ...);`
          • 批量添加数据
          • 注意事项
        • 更新数据(修改数据):`UPDATE`
          • `UPDATE 表名 SET 字段名1 = 值1, 字段名2 = 值2, ... [ WHERE 条件 ];`(注意:如果不带where条件修改的是整张表的数据)
        • 删除(某条)数据:`DELETE`
          • `DELETE FROM 表名 [ WHERE 条件 ];`(不带where条件将会删除整张表数据)
      • DQL(Data Query Language): 数据查询语言,用来查询数据库中表的记录
        • 基础查询
          • 查询指定(单个或多个)字段:`SELECT 字段1, 字段2, 字段3, ... FROM 表名;`
          • 查询所有字段:``SELECT * FROM 表名;``(建议开发中不要直接写`*`)
          • 设置别名:`SELECT 字段1 [ AS 别名1 ], 字段2 [ AS 别名2 ], 字段3 [ AS 别名3 ], ... FROM 表名;`或者`SELECT 字段1 [ 别名1 ], 字段2 [ 别名2 ], 字段3 [ 别名3 ], ... FROM 表名;`
          • 去除重复记录:`SELECT DISTINCT 字段列表 FROM 表名;`
          • 转义:`ESCAPE`关键字定义转义字符
        • 条件查询:`WHERE`关键字
          • 语法
          • 条件运算符
          • 逻辑运算符
          • 例子
        • 聚合查询(聚合函数)(count、max、min、avg、sum)(将一列数据作为一个整体,进行纵向计算 )
          • 常见聚合函数
          • 语法
          • 注意:所有的null值不参与聚合函数计算
          • 示例
        • 分组查询:`GROUP BY`关键字、`HAVING`关键字(可用`AS`关键字设置别名)
          • 语法
          • where 和 having 的区别
          • 例子
          • 注意事项
        • 排序查询:ORDER BY关键字、ASC: 升序(默认)、DESC: 降序
          • 语法
          • 排序方式
          • 例子
          • 注意事项
        • 分页查询:LIMIT关键字
          • 语法
          • 例子
          • 注意事项
        • DQL查询语句小结练习
        • `DQL`语句编写顺序和执行顺序
          • `DQL`编写顺序:`SELECT -> FROM -> WHERE -> GROUP BY -> HAVING -> ORDER BY -> LIMIT`
          • DQL执行顺序:`FROM -> WHERE -> GROUP BY -> SELECT -> ORDER BY -> LIMIT`
          • 示例:验证DQL执行顺序
      • DCL(Data Control Language): 数据控制语言,用来管理数据库用户、控制数据库的访问权限
        • 管理用户
          • 查询用户
          • 创建用户
          • 修改用户密码
          • 删除用户
          • 例子
          • 注意事项
        • 权限控制
          • 常用权限
          • 查询权限:`SHOW GRANTS FOR`
          • 授予权限:`GRANT `关键字
          • 撤销权限:`REVOKE`关键字
          • 注意事项
          • 示例

基础篇

数据库相关概念

(数据库DataBase(DB)、数据库管理系统DataBase Management System(DBMS)、结构化查询语言SQL(Structured Query Language))

在这里插入图片描述

主流的关系型数据库管理系统(SQL统一语言标准)

在这里插入图片描述

mysql安装及卸载

安装

在这里插入图片描述

教程在windows上安装mysql社区版8.0.26版本

windows上安装方法参考视频:https://www.bilibili.com/video/BV1Kr4y1i7ru?p=3

我用的是linux,我就介绍Ubuntu20.04上的安装mysql服务的方法:

  1. 首先,打开一个终端窗口。

  2. 更新包列表以确保获取最新的软件版本。可以通过运行以下命令来完成这一步:

    sudo apt update
    
  3. 安装MySQL服务器,运行以下命令:

    sudo apt install mysql-server
    
  4. 在安装完毕后,MySQL服务应该会自动启动。可以使用以下命令来确认MySQL正在运行:

    sudo systemctl status mysql
    

    在这里插入图片描述

  5. 对于初次安装MySQL,需要运行mysql_secure_installation脚本来提高MySQL的安全性。运行以下命令:

    sudo mysql_secure_installation
    

    这个脚本将会引导你设置root用户的密码、删除匿名用户、禁止root远程登录,并删除测试数据库。

    这个我们就不设置了,反正是调试用,设置太多影响效率

卸载

在Ubuntu 20.04中完全卸载MySQL,可以按照以下步骤操作:

  1. 首先,需要停止正在运行的MySQL服务。打开终端并输入以下命令:

    sudo systemctl stop mysql
    
  2. 然后,使用apt来卸载MySQL。输入以下命令:

    sudo apt-get remove --purge mysql-server mysql-client mysql-common
    sudo apt-get autoremove
    sudo apt-get autoclean
    
  3. 最后,为了确保所有相关的文件和配置都被删除,可以手动删除数据目录。默认情况下,这个目录通常是/var/lib/mysql。但是,应该检查系统以确认正确的位置。删除之前,请确保不再需要其中的任何数据。可以使用以下命令来删除这个目录:

    sudo rm -rf /var/lib/mysql
    

注意:这将永久删除所有MySQL数据库和相关数据,所以在执行此操作前请确保已备份重要数据。

数据模型

在这里插入图片描述

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

在这里插入图片描述

同理,不通过表结构存储的数据库称为非关系型数据库

SQL通用语法及分类

通用语法

在学习具体的SQL语句之前,先来了解一下SQL语言的通用语法。

  1. SQL语句可以单行或多行书写,以分号结尾。
  2. SQL语句可以使用空格/缩进来增强语句的可读性。
  3. MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。
  4. 注释:
    单行注释:-- 注释内容 或 # 注释内容
    多行注释:/* 注释内容 */

DDL(Data Definition Language): 数据定义语言,用来定义数据库对象(数据库,表,字段)

数据库操作
  • 先登录数据库:
    mysql -u root -p
    
    在这里插入图片描述
查询所有数据库:show databases

SHOW DATABASES;

  • 示例:

    show databases;
    

    在这里插入图片描述

查询当前数据库:select

SELECT DATABASE();

  • 示例:

    select database();
    

    在这里插入图片描述

创建数据库:create

CREATE DATABASE [ IF NOT EXISTS ] 数据库名 [ DEFAULT CHARSET 字符集] [COLLATE 排序规则 ];

  • 示例:

    create database itcast;
    

    在这里插入图片描述
    在这里插入图片描述

  • 不能创建名称已经存在的数据库:
    在这里插入图片描述

  • 可以加if not exists判断选项,这样数据库存在不会创建,同时也不会报错:

    create database if not exists itcast;
    

    在这里插入图片描述
    在这里插入图片描述

  • 创建时指定默认字符集(建议使用utf8mb4,占4个字节;而utf8只占3个字节):

    create database if not exists itcast3 dafault charset utf8mb4;
    

    在这里插入图片描述

    当创建数据库时,选择utf8mb4字符集的原因主要有以下几点:

    1. 完整的Unicode支持utf8mb4(UTF-8 Multibyte 4)是一个在MySQL中用于表示UTF-8字符的字符集。与早期的utf8实现相比,它提供了对4字节长的Unicode字符的全面支持。这意味着它可以存储任何标准的Unicode字符。而原始的utf8实现只支持最多3字节长的字符,无法处理某些特殊字符,例如Emoji表情符号或者某些特殊的汉字。

    2. 数据安全性:由于utf8不能正确处理4字节长的字符,如果试图插入这样的字符,可能会导致数据截断和丢失。使用utf8mb4可以避免这种情况,确保数据的完整性。

    3. 未来兼容性:随着更多的新的Unicode字符和Emoji表情符号的出现,utf8mb4能够保证未来的兼容性。

    因此,为了确保你的数据库能够处理所有类型的Unicode字符,一般建议在创建数据库时使用utf8mb4字符集。

注意:字符集主要影响文本类型数据,例如 CHAR, VARCHAR, TEXT 等的存储和处理。通常它不会影响非字符串数据类型,如整型、浮点型、日期时间类型等的存储和处理。

删除数据库:drop

DROP DATABASE [ IF EXISTS ] 数据库名;

  • 示例

    drop database itcast;
    

    在这里插入图片描述

使用数据库:use

USE 数据库名;

  • 示例

    use myDatabase;
    

    在这里插入图片描述

  • 可以使用select查询当前正在使用的数据库:
    在这里插入图片描述

注意事项
  • UTF8字符集长度为3字节,有些符号占4字节,所以推荐用utf8mb4字符集
表操作
mysql数据类型
数值类型

在这里插入图片描述

  • 示例:
    年龄:age tinyint unsigned
    分数:score double(4,1),表示最长四位有效数字(100.0),然后1表示有1位小数。
字符串类型

在这里插入图片描述
定长字符串性能较好,变长字符串性能较差。

  • 示例:
    用户名:username varchar(50)
    性别:gender char(1)
日期时间类型

在这里插入图片描述

  • 示例:
    生日:birthday date
查询当前数据库所有表:show tables

SHOW TABLES;

  • 示例

    show tables;
    

    在这里插入图片描述

查询表结构:desc

DESC 表名;

  • 示例

    desc tb_user;
    

    在这里插入图片描述

查询指定表的建表语句:show create table(可展示表的详细信息,包括创建时的comment)

SHOW CREATE TABLE 表名;

  • 示例

    show create table tb_user;
    

    在这里插入图片描述

    上面代码显示的是tb_user表的创建语句。这个语句包含了表的名称、字段定义、存储引擎和字符集等信息。

    具体解释如下:

    • CREATE TABLE tb_user:创建名为tb_user的表。

    • 下面是四个字段的定义:

      • id int DEFAULT NULL COMMENT ‘编号’:创建一个名为id的字段,数据类型为整型(int),默认值为NULL,注释为’编号’。
      • name varchar(50) DEFAULT NULL COMMENT ‘姓名’:创建一个名为name的字段,数据类型为可变长字符串(varchar),最大长度为50个字符, 默认值为NULL,注释为’姓名’。
      • age int DEFAULT NULL COMMENT ‘年龄’:创建一个名为age的字段,数据类型为整型(int),默认值为NULL,注释为’年龄’。
      • gender varchar(1) DEFAULT NULL COMMENT ‘性别’:创建一个名为gender的字段,数据类型为可变长字符串(varchar),最大长度为1个字符, 默认值为NULL,注释为’性别’。
    • ENGINE=InnoDB:指定表的存储引擎为InnoDB。MySQL支持多种存储引擎,每种存储引擎都有自己的优点和特性,InnoDB是最常用的一种,支持事务处理和行级锁定。

    • DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci:指定表的默认字符集为utf8mb4,排序规则为utf8mb4_0900_ai_ci。字符集决定了表中文本数据的存储和处理方式,而排序规则决定了如何比较字符。

    • COMMENT='用户表':给表添加注释,说明这是一个’用户表’。

创建表:create table
CREATE TABLE 表名(字段1 字段1类型 [COMMENT 字段1注释],字段2 字段2类型 [COMMENT 字段2注释],字段3 字段3类型 [COMMENT 字段3注释],...字段n 字段n类型 [COMMENT 字段n注释]
)[ COMMENT 表注释 ];

注意:最后一个字段后面没有逗号

  • 示例1
    在这里插入图片描述

    create table tb_user(id int comment '编号',name varchar(50) comment '姓名',age int comment '年龄',gender varchar(1) comment '性别') comment '用户表';
    

    在这里插入图片描述
    在这里插入图片描述

https://www.bilibili.com/video/BV1Kr4y1i7ru?p=8

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

    1. 编号(纯数字)
    2. 员工工号 (字符串类型,长度不超过10位)
    3. 员工姓名(字符串类型,长度不超过10位)
    4. 性别(男/女,存储一个汉字)
    5. 年龄(正常人年龄,不可能存储负数)
    6. 身份证号(二代身份证号均为18位,身份证中有X这样的字符)
    7. 入职时间(取值年月日即可)

    对应的建表语句如下:
    在这里插入图片描述

create table emp (id int comment '编号',workno varchar(10) comment '工号',name varchar(10) comment '姓名',gender char(1) comment '性别',age tinyint unsigned comment '年龄',idcard char(18) comment '身份证号',entrydate date comment '入职时间'
) comment '员工表';

把这个粘贴到终端就能添加了。

root@ubuntu:~#
root@ubuntu:~# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 18
Server version: 8.0.34-0ubuntu0.20.04.1 (Ubuntu)Copyright (c) 2000, 2023, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql>
mysql>
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| myDatabase         |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.01 sec)mysql>
mysql>
mysql> use myDatabase;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql>
mysql>
mysql>
mysql> select database();
+------------+
| database() |
+------------+
| myDatabase |
+------------+
1 row in set (0.00 sec)mysql>
mysql>
mysql> show tables;
+----------------------+
| Tables_in_myDatabase |
+----------------------+
| tb_user              |
+----------------------+
1 row in set (0.00 sec)mysql>
mysql>
mysql> create table emp (->     id int comment '编号',->     workno varchar(10) comment '工号',->     name varchar(10) comment '姓名',->     gender char(1) comment '性别',->     age tinyint unsigned comment '年龄',->     idcard char(18) comment '身份证号',->     entrydate date comment '入职时间'-> ) comment '员工表';
Query OK, 0 rows affected (0.10 sec)mysql>
mysql> show tables;
+----------------------+
| Tables_in_myDatabase |
+----------------------+
| emp                  |
| tb_user              |
+----------------------+
2 rows in set (0.01 sec)mysql>
mysql> desc emp;
+-----------+------------------+------+-----+---------+-------+
| Field     | Type             | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+-------+
| id        | int              | YES  |     | NULL    |       |
| workno    | varchar(10)      | YES  |     | NULL    |       |
| name      | varchar(10)      | YES  |     | NULL    |       |
| gender    | char(1)          | YES  |     | NULL    |       |
| age       | tinyint unsigned | YES  |     | NULL    |       |
| idcard    | char(18)         | YES  |     | NULL    |       |
| entrydate | date             | YES  |     | NULL    |       |
+-----------+------------------+------+-----+---------+-------+
7 rows in set (0.00 sec)mysql>

https://www.bilibili.com/video/BV1Kr4y1i7ru?p=8

添加字段:ALTER TABLE ttt ADD fff ttt COMMENT 'xxx';。MySQL中的字段可以在创建表时创建,也可以在创建表后单独添加

ALTER TABLE 表名 ADD 字段名 类型(长度) [COMMENT 注释] [约束];

例:ALTER TABLE emp ADD nickname varchar(20) COMMENT '昵称';

  • 示例:给表添加email字段
# 列出所有数据库
show databases;
# 切换到指定数据库
use myDatabase;
# 查看当前使用的数据库
select database();
# 列出当前数据库所有表
show tables;
# 查看指定表结构
desc tb_user;
# 为指定表增加指定字段
alter table tb_user add email varchar(255);
# 查看指定表结构
desc tb_user;

在这里插入图片描述

修改字段数据类型(ALTER TABLE 表名 MODIFY)(主要用于修改列的数据类型或更改默认值等。它只能用来修改已经存在的列的属性,不能修改列的名称)

ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);

修改字段名和字段数据类型(ALTER TABLE 表名 CHANGE)(不仅可以修改列的数据类型或更改默认值,还可以更改列的名称)

ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度) [COMMENT 注释] [约束];

  • 例:将emp表的nickname字段修改为username,类型为varchar(30)
    ALTER TABLE emp CHANGE nickname username varchar(30) COMMENT '昵称';
    在这里插入图片描述
    在这里插入图片描述
删除字段(ALTER TABLE 表名 DROP 字段名;

ALTER TABLE 表名 DROP 字段名;

示例:
在这里插入图片描述
在这里插入图片描述

修改表名(ALTER TABLE 表名 RENAME TO 新表名

ALTER TABLE 表名 RENAME TO 新表名

  • 示例:
    在这里插入图片描述
    在这里插入图片描述
删除表(DROP TABLE [IF EXISTS] 表名;

DROP TABLE [IF EXISTS] 表名;

  • 示例:
    在这里插入图片描述
删除表,并重新创建该表(TRUNCATE TABLE 表名)(可用于清理表数据)

TRUNCATE TABLE 表名;

  • 示例:
    在这里插入图片描述

DML(Data Manipulation Language): 数据操作语言,用来对数据库表中的数据进行增删改

添加数据INSERT
指定字段:INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...);

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

  • 示例
    给employee表所有的字段添加数据:
insert into employee(id,workno,name,gender,age,idcard,entrydate) values(1,'1','Itcast','男',10,'123456789012345678','2000-01-01');
  • 用DataGrip:
    点击表右键 --> New --> Query Console:
    在这里插入图片描述
    将上面的sql语句粘贴进去,全选sql语句(不然软件不知道你要执行哪一句),然后点击运行:
    在这里插入图片描述
    在这里插入图片描述
    查询表数据,双击表即可查看,或者执行select * from xxx表查询表数据:
    在这里插入图片描述
    执行:

    select * from emp;
    

    在这里插入图片描述

全部字段:INSERT INTO 表名 VALUES (值1, 值2, ...);

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

  • 示例:
insert into emp values(3,'3','Itcast','男',10,'12345','2000-01-01');

在这里插入图片描述

批量添加数据

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

  • 示例:

    insert into emp values(4,'4','Itcast','男',10,'123456789012345681','2000-01-01'),(5,'5','Itcast','男',10,'123456789012345682','2000-01-01');

    在这里插入图片描述

注意用逗号,分隔不同条(行)的数据。

注意事项
  • 字符串和日期类型数据应该包含在引号中
  • 插入的数据大小应该在字段的规定范围内
更新数据(修改数据):UPDATE
UPDATE 表名 SET 字段名1 = 值1, 字段名2 = 值2, ... [ WHERE 条件 ];(注意:如果不带where条件修改的是整张表的数据)

UPDATE 表名 SET 字段名1 = 值1, 字段名2 = 值2, ... [ WHERE 条件 ];

  • 例:
    UPDATE emp SET name = 'Jack' WHERE id = 1;
    在这里插入图片描述
删除(某条)数据:DELETE
DELETE FROM 表名 [ WHERE 条件 ];(不带where条件将会删除整张表数据)

DELETE FROM 表名 [ WHERE 条件 ];

  • 示例1

    DELETE FROM emp WHERE name = 'Jack';
    

    在这里插入图片描述

  • 示例2

    DELETE FROM emp WHERE name = 'Jack';
    

    上面语句将会删除整张表数据:
    在这里插入图片描述

DQL(Data Query Language): 数据查询语言,用来查询数据库中表的记录

  • 语法:

    SELECT字段列表
    FROM表名字段
    WHERE条件列表
    GROUP BY分组字段列表
    HAVING分组后的条件列表
    ORDER BY排序字段列表
    LIMIT分页参数
    
  • 数据准备
    表结构:

    create table emp (id int comment '编号',workno varchar(10) comment '工号',name varchar(10) comment '姓名',gender char(1) comment '性别',age tinyint unsigned comment '年龄',idcard char(18) comment '身份证号',workaddress varchar(50) comment '工作地址',entrydate date comment '入职时间'
    ) comment '员工表';
    

    表数据:

    INSERT INTO emp (id, workno, name, gender, age, idcard,workaddress, entrydate)
    VALUES 
    (1,'1','柳岩','女',20,'123456789012345678' ,'北京','2000-01-01'),
    (2,'2','张无忌','男',18,'123456789012345670' ,'北京' ,'2005-09-01'),
    (3,'3','韦一笑','男',38,'123456789712345670' ,'上海' ,'2005-08-01'),
    (4,'4','赵敏','女',18,'123456757123845670' ,'北京' ,'2009-12-01'),
    (5,'5','小昭','女',16,'123456769012345678' ,'上海' ,'2007-07-01'),
    (6,'6','杨道','男',28,'12345678931234567X' ,'北京' ,'2006-01-01'),
    (7,'7','范瑶','男',40,'123456789212345670' ,'北京' ,'2005-05-01'),
    (8,'8','黛绮丝','女',38,'123456157123645670' ,'天津' ,'2015-05-01'),
    (9,'9','范凉凉','女',45,'123156789012345678' ,'北京' ,'2010-04-01'),
    (10,'10','陈友谅','男',53,'123456789012345670' ,'上海' ,'2011-01-01'),
    (11,'11','张士诚','男',55,'123567897123465670' ,'江苏' ,'2015-05-01'),
    (12,'12','常遇春','男',32,'123446757152345670' ,'北京' ,'2004-02-01'),
    (13,'13','张三丰','男',88,'123656789012345678' ,'江苏' ,'2020-11-01'),
    (14,'14','灭绝','女',65,'123456719012345670' ,'西安' ,'2019-05-01'),
    (15,'15','胡青牛','男',70,'12345674971234567X' ,'西安' ,'2018-04-01'),
    (16,'16','周芷若','女',18,null ,'北京' ,'2012-06-01');

在这里插入图片描述

基础查询
查询指定(单个或多个)字段:SELECT 字段1, 字段2, 字段3, ... FROM 表名;

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

  • 示例
    查询以下指定字段

    select name,workno,age from emp;
    

    在这里插入图片描述

查询所有字段:SELECT * FROM 表名;(建议开发中不要直接写*
  • 示例:
    SELECT * FROM emp;
    
    在这里插入图片描述
设置别名:SELECT 字段1 [ AS 别名1 ], 字段2 [ AS 别名2 ], 字段3 [ AS 别名3 ], ... FROM 表名;或者SELECT 字段1 [ 别名1 ], 字段2 [ 别名2 ], 字段3 [ 别名3 ], ... FROM 表名;

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

  • 示例:

    SELECT workaddress as '工作地址' FROM emp;
    

    或者:

    SELECT workaddress '工作地址' FROM emp;
    

    在这里插入图片描述

去除重复记录:SELECT DISTINCT 字段列表 FROM 表名;

SELECT DISTINCT 字段列表 FROM 表名;

  • 示例:

    select distinct workaddress from emp;
    

    在这里插入图片描述

转义:ESCAPE关键字定义转义字符

SELECT * FROM 表名 WHERE name LIKE '/_张三' ESCAPE '/'
/ 之后的_不作为通配符

在SQL查询中,LIKE操作符用于搜索某列的模式。其中,百分号(%)和下划线(_)是特殊字符。百分号表示任意数量的字符,包括零字符;而下划线代表一个单独的任意字符。

有时,我们可能需要搜索包含这些特殅字符的数据。为了使这些特殊字符被识别为普通字符,我们需要使用ESCAPE关键字。它定义了一个转义字符,让你能够在LIKE模式中搜索百分号或下划线。

在你给出的例子中,ESCAPE '/'声明了斜杠(/)作为转义字符。然后,在WHERE子句中,name LIKE '/_张三'表示搜索以“张三”开头且前面有任意一个字符的所有名字。因此,/_张三匹配到的可能是“1张三”,“a张三”等等。

总的来说,加上ESCAPE '/'是为了明确指定在该查询中,我们希望把斜杠(/)视为转义字符,使得在LIKE模式中可以正确解析其后的下划线。

条件查询:WHERE关键字
语法

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

条件运算符
比较运算符功能
>大于
>=大于等于
<小于
<=小于等于
=等于
<> 或 !=不等于
BETWEEN … AND …在某个范围内(含最小、最大值)
IN(…)在in之后的列表中的值,多选
LIKE 占位符模糊匹配(_匹配单个字符,%匹配任意个字符)
IS NULL是NULL
逻辑运算符
逻辑运算符功能
AND 或 &&并且(多个条件同时成立)
OR 或 ||或者(多个条件任意一个成立)
NOT 或 !非,不是
例子
# 查找年龄等于20的员工信息
select * from emp where age = 20;# 查找年龄等于20的员工信息
select * from emp where age < 20;# 查找身份证号为null的员工信息
select * from emp where idcard is null;# 查找身份证号不是null的员工信息
select * from emp where idcard is not null;# 查找年龄不等于88的员工信息
select * from emp where age != 88;
select * from emp where age <> 88;# 查询年龄在15到20岁之间的员工信息
select * from emp where age > 15 and age < 20;
select * from emp where age > 15 && age < 20;
# 注意between为闭区间
select * from emp where age between 15 and 20;# 查询性别为女且年龄小于25岁的员工
select * from emp where gender = '女' and age < 25;
select * from emp where age in(18,19,40);# 查询姓名为两个字的员工信息
select * from emp where name like '__';# 查询身份证号最后一位为X的员工信息
select * from emp where emp.idcard like '%X';
select * from emp where emp.idcard like '_________________X';

在这里插入图片描述

聚合查询(聚合函数)(count、max、min、avg、sum)(将一列数据作为一个整体,进行纵向计算 )
常见聚合函数
函数功能
count统计数量
max最大值
min最小值
avg平均值
sum求和
语法

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

注意:所有的null值不参与聚合函数计算
示例
-- 统计企业员工数量(注意:不会统计字段值为null的行,所以不要把可能为null的字段来用于统计)
SELECT count(*) FROM emp;
SELECT count(id) FROM emp;-- 统计员工的平均年龄
SELECT avg(age) FROM emp;-- 统计员工的最大年龄
SELECT max(age) FROM emp;-- 统计员工的最小年龄
SELECT min(age) FROM emp;-- 统计西安地区的年龄之和
SELECT sum(age) FROM emp where workaddress = '西安';
分组查询:GROUP BY关键字、HAVING关键字(可用AS关键字设置别名)
语法

SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组后的过滤条件 ];

where 和 having 的区别
  • 执行时机不同:where是分组之前进行过滤,不满足where条件不参与分组;having是分组后对结果进行过滤。
  • 判断条件不同:where不能对聚合函数进行判断,而having可以。
例子
-- 根据性别分组,统计男性和女性数量(只显示分组数量,不显示哪个是男哪个是女)
select count(*) from emp group by gender;-- 根据性别分组,统计男性和女性数量(会显示哪个是男,哪个是女)
select gender, count(*) from emp group by gender;-- 根据性别分组,统计男性和女性的平均年龄
select gender, avg(age) from emp group by gender;-- 统计根据工作地址分组的人数
select workaddress, count(*) from emp group by workaddress;-- 统计年龄小于45,根据工作地址分组的人数
select workaddress, count(*) from emp where age < 45 group by workaddress;-- 统计年龄小于45,根据工作地址分组的人数,输出员工数量大于等于3的组(可设置别名as,as关键字可省略)
select workaddress, count(*) from emp where age < 45 group by workaddress having count(*) >= 3;
select workaddress, count(*) address_count from emp where age < 45 group by workaddress having address_count >= 3;
select workaddress, count(*) as address_count from emp where age < 45 group by workaddress having address_count >= 3;
注意事项
  • 执行顺序:where > 聚合函数 > having
  • 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义
排序查询:ORDER BY关键字、ASC: 升序(默认)、DESC: 降序
语法

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

排序方式
  • ASC: 升序(默认)
  • DESC: 降序
例子
-- 根据年龄升序排序
SELECT * FROM emp ORDER BY age ASC;
SELECT * FROM emp ORDER BY age;-- 根据入职时间降序排序
SELECT * FROM emp ORDER BY entrydate desc ;-- 两字段排序,根据年龄升序排序,入职时间降序排序
SELECT * FROM emp ORDER BY age ASC, entrydate DESC;
注意事项

如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序

分页查询:LIMIT关键字
语法

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

例子
-- 查询第一页数据,展示10条
SELECT * FROM emp LIMIT 0, 10;
-- 查询第一页时,索引可省略
SELECT * FROM emp LIMIT 10;-- 查询第二页
SELECT * FROM emp LIMIT 10, 10;
注意事项
  • 起始索引从0开始,起始索引 = (查询页码 - 1) * 每页显示记录数
  • 分页查询是数据库的方言,不同数据库有不同实现,MySQL是LIMIT
  • 如果查询的是第一页数据,起始索引可以省略,直接简写 LIMIT 10
DQL查询语句小结练习

在这里插入图片描述
在这里插入图片描述

注意,第五个问题可能有歧义:

它可能有以下两种理解:

1、查询emp表中性别为男,且年龄在20到40岁(含20和40)的前5个员工信息,对查询的结果按年龄升序排序,年龄相同按入职时间升序排序。
2、1、查询emp表中性别为男,且年龄在20到40岁(含20和40),年龄升序排序,年龄相同按入职时间升序排序,获取前5个员工信息。

对于第一种理解,“查询emp表中性别为男,且年龄在20到40岁(含20和40)的前5个员工信息,对查询的结果按年龄升序排序,年龄相同按入职时间升序排序。” 因为SQL的限制,不能直接先取前5条然后再排序,但可以通过子查询实现,如下:

SELECT *
FROM (SELECT *FROM empWHERE sex = '男' AND age BETWEEN 20 AND 40LIMIT 5
) AS subquery
ORDER BY age ASC, join_time ASC;

对于第二种理解,“查询emp表中性别为男,且年龄在20到40岁(含20和40),年龄升序排序,年龄相同按入职时间升序排序,获取前5个员工信息。” 这个问题是先排序,然后取前五个记录。对应的SQL语句为:

SELECT *
FROM emp
WHERE sex = '男' AND age BETWEEN 20 AND 40
ORDER BY age ASC, join_time ASC
LIMIT 5;
DQL语句编写顺序和执行顺序

在这里插入图片描述

DQL编写顺序:SELECT -> FROM -> WHERE -> GROUP BY -> HAVING -> ORDER BY -> LIMIT
DQL执行顺序:FROM -> WHERE -> GROUP BY -> SELECT -> ORDER BY -> LIMIT
示例:验证DQL执行顺序
-- 查询年龄大于15的员工的姓名、年龄,并根据年龄进行升序排序
select name,age from emp where age > 15 order by age asc ;
-- 验证执行顺序
select e.name e_name,e.age e_age from emp e where e.age > 15 order by e_age asc ;

DCL(Data Control Language): 数据控制语言,用来管理数据库用户、控制数据库的访问权限

管理用户
查询用户
USE mysql;
SELECT * FROM user;

在这里插入图片描述
localhost,root的含义是这个root只能通过本机访问数据库,无法通过远程方式访问数据库

创建用户

CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';

修改用户密码

ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码';

删除用户

DROP USER '用户名'@'主机名';

例子
-- 创建用户arnoldtest1,只能在当前主机localhost访问,密码123456# create user 'arnoldtest1'@'localhost' identified by 'Reaishenghuo';
-- 提示:[2023-10-02 02:07:26] [HY000][1819] Your password does not satisfy the current policy requirements
-- 用:SHOW VARIABLES LIKE 'validate_password%';查看当前密码规则
SHOW VARIABLES LIKE 'validate_password%';
# validate_password.changed_characters_percentage,0
# validate_password.check_user_name,ON
# validate_password.dictionary_file,""
# validate_password.length,8
# validate_password.mixed_case_count,1
# validate_password.number_count,1
# validate_password.policy,MEDIUM
# validate_password.special_char_count,1
CREATE USER 'arnoldTest1'@'localhost' IDENTIFIED BY 'Reai#2023shenghuo';-- 创建用户arnoldTest1,能在任意主机访问
create user 'arnoldTest1'@'%' identified by 'Reai#2023shenghuo';-- 修改密码
alter user 'arnoldTest1'@'localhost' identified with mysql_native_password by 'Reai#2024shenghuo';-- 删除用户
drop user 'arnoldTest1'@'localhost';
drop user 'arnoldTest1'@'%';
注意事项
  • 主机名可以使用 % 通配,此时创建的账号可从任意主机访问数据库
  • 这类SQL开发人员操作的比较少,主要是DBA(Database Administrator数据库管理员)使用
权限控制
常用权限
权限说明
ALL, ALL PRIVILEGES所有权限
SELECT查询数据
INSERT插入数据
UPDATE修改数据
DELETE删除数据
ALTER修改表
DROP删除数据库/表/视图
CREATE创建数据库/表

更多权限请看权限一览表

查询权限:SHOW GRANTS FOR

SHOW GRANTS FOR '用户名'@'主机名';

授予权限:GRANT 关键字

GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';

撤销权限:REVOKE关键字

REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';

注意事项
  • 多个权限用逗号分隔
  • 授权时,数据库名和表名可以用 * 进行通配,代表所有
示例

-- 创建用户
CREATE USER 'arnoldTest'@'localhost' IDENTIFIED BY 'Reai#2023shenghuo';-- 查询权限
SHOW GRANTS FOR 'arnoldTest'@'localhost';-- 授予权限(授予'arnoldTest'@'localhost'用户对myDatabase所有表的所有权限)
grant all on myDatabase.* to 'arnoldTest'@'localhost' ;-- 撤销权限
revoke all on myDatabase.* from 'arnoldTest'@'localhost' ;-- 删除用户
drop user 'arnoldTest'@'localhost';

不知道为啥授予和撤销权限的时候,老提示:

myDatabase> grant all on myDatabase.* to 'arnoldTest'@'localhost'
[2023-10-02 02:44:57] [42000][1044] Access denied for user 'root'@'%' to database 'myDatabase'
[2023-10-02 02:44:57] [42000][1044] Access denied for user 'root'@'%' to database 'myDatabase'
myDatabase> revoke all on myDatabase.* from 'arnoldTest'@'localhost'
[2023-10-02 02:44:59] [42000][1044] Access denied for user 'root'@'%' to database 'myDatabase'
[2023-10-02 02:44:59] [42000][1044] Access denied for user 'root'@'%' to database 'myDatabase'

莫名其妙的问题,以后遇到再说了!。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/96360.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决Ubuntu18.04安装好搜狗输入法后无法打出中文的问题

首先下载安装 搜狗拼音输入法 &#xff0c;下载选择&#xff1a; x86_64 在ubuntu中设置 fcitx 最后发现安装好了&#xff0c;图标有了 &#xff0c;但是使用时不能输入中文&#xff0c;使用下面的命令解决&#xff1a; sudo apt install libqt5qml5 libqt5quick5 libqt5qu…

学习笔记|串口通信的基础知识|同步/异步|常见的串口软件的参数|STC32G单片机视频开发教程(冲哥)|第二十集:串口通信基础

目录 1.串口通信的基础知识串口通信(Serial Communication)同步/异步&#xff1f;全双工&#xff1f;常见的串口软件的参数 2.STC32的串口通信实现原理引脚选择模式选择 3.串口通信代码实现编写串口1通信程序测试 总结 1.串口通信的基础知识 百度百科&#xff1a;串口通信的概…

【dp】背包问题

背包问题 一、背包问题概述二、01背包问题&#xff08;1&#xff09;求这个背包至多能装多大价值的物品&#xff1f;&#xff08;2&#xff09;若背包恰好装满&#xff0c;求至多能装多大价值的物品&#xff1f; 三、完全背包问题&#xff08;1&#xff09;求这个背包至多能装多…

抄写Linux源码(Day19:读取硬盘前的准备工作有哪些?)

回忆我们需要做的事情&#xff1a; 为了支持 shell 程序的执行&#xff0c;我们需要提供&#xff1a; 1.缺页中断(不理解为什么要这个东西&#xff0c;只是闪客说需要&#xff0c;后边再说) 2.硬盘驱动、文件系统 (shell程序一开始是存放在磁盘里的&#xff0c;所以需要这两个东…

1.6.C++项目:仿muduo库实现并发服务器之channel模块的设计

项目完整版在&#xff1a; 文章目录 一、channel模块&#xff1a;事件管理Channel类实现二、提供的功能三、实现思想&#xff08;一&#xff09;功能&#xff08;二&#xff09;意义&#xff08;三&#xff09;功能设计 四、代码&#xff08;一&#xff09;框架&#xff08;二…

【Python从入门到进阶】38、selenium关于Chrome handless的基本使用

接上篇《37、selenium关于phantomjs的基本使用》 上一篇我们介绍了有关phantomjs的相关知识&#xff0c;但由于selenium已经放弃PhantomJS&#xff0c;本篇我们来学习Chrome的无头版浏览器Chrome Handless的使用。 一、Chrome Headless简介 Chrome Headless是一个无界面的浏览…

Kaggle - LLM Science Exam(二):Open Book QAdebertav3-large详解

文章目录 前言&#xff1a;优秀notebook介绍三、Open Book Q&A3.1 概述3.2 安装依赖&#xff0c;导入数据3.3 数据预处理3.3.1 处理prompt3.3.2 处理wiki数据 3.4 使用faiss搜索获取匹配的Prompt-Sentence Pairs3.5 查看context结果并保存3.6 推理3.6.1 加载测试集3.6.2 定…

FFmpeg 基础模块:AVIO、AVDictionary 与 AVOption

目录 AVIO AVDictionary 与 AVOption 小结 思考 我们了解了 AVFormat 中的 API 接口的功能&#xff0c;从实际操作经验看&#xff0c;这些接口是可以满足大多数音视频的 mux 与 demux&#xff0c;或者说 remux 场景的。但是除此之外&#xff0c;在日常使用 API 开发应用的时…

低代码平台如何借助Nginx实现网关服务

摘要&#xff1a;本文由葡萄城技术团队于CSDN原创并首发。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 前言 在典型的系统部署架构中&#xff0c;应用服务器是一种软件或硬件系统&#xff0c…

在VS Code中优雅地编辑csv文件

文章目录 Rainbow csv转表格CSV to Tablecsv2tableCSV to Markdown Table Edit csv 下面这些插件对csv/tsv/psv都有着不错的支持&#xff0c;这几种格式的主要区别是分隔符不同。 功能入口/使用方法Rainbow csv按列赋色右键菜单CSV to Table转为ASCII表格指令CSV to Markdown …

C++(反向迭代器)

前言&#xff1a; 上一章我们介绍了适配器&#xff0c;也提了一下迭代器适配器&#xff0c;今天我们就从反向迭代器把迭代器适配器给解释一下。 既然 都叫迭代器容器了 就说名只要接口合适他可以封装实现各种容器需求包括vector list 。 目录 1.反向迭代器设计 1.1反向迭代…

模型压缩部署概述

模型压缩部署概述 一&#xff0c;模型在线部署 1.1&#xff0c;深度学习项目开发流程 1.2&#xff0c;模型训练和推理的不同 二&#xff0c;手机端CPU推理框架的优化 三&#xff0c;不同硬件平台量化方式总结 参考资料 一&#xff0c;模型在线部署 深度学习和计算机视觉…

windows 任务计划自动提交 笔记到github 、gitee

一、必须有个git仓库托管到git上。 这个就不用说了&#xff0c;自己在github或者码云上新建一个仓库就行了。 二、创建自动提交脚本 这个bat脚本是在windows环境下使用的。 注意&#xff1a;windows定时任务下 调用自动提交git前&#xff0c;必须先进入该git仓库目录&#x…

R语言实现竞争风险模型(1)

#竞争风险模型 tmp <- data.frame(gene tiaoxuan[,5:6],OS.Time Train[,"Survival_months"], OS Train[,"CSS"],stringsAsFactors F) colnames(tmp) #方法1&#xff1a;riskregression library(riskRegression) fgr1<-FGR(Hist(OS.Time,OS)~gen…

法国乐天下单支付流程,自养号测评技术环境揭秘。

Rakuten的前身是PriceMinister一家法国公司&#xff0c;经营电子商务网站PriceMinister&#xff0c;按访问量计算&#xff0c;该网站是法国第五大电子商务网站。2010年&#xff0c;它被乐天公司收购&#xff0c;2018年&#xff0c;它更名为Rakuten。乐天法国Rakuten France&…

小谈设计模式(17)—状态模式

小谈设计模式&#xff08;17&#xff09;—状态模式 专栏介绍专栏地址专栏介绍 状态模式关键角色上下文(Context)抽象状态(State)具体状态(Concrete State) 核心思想Java程序实现首先&#xff0c;我们定义一个抽象状态类 State&#xff0c;其中包含一个处理请求的方法 handleRe…

【开发篇】十七、消息:模拟订单短信通知

文章目录 1、消息2、JMS3、AMQP4、案例&#xff1a;模拟订单短信通知 相关文章&#xff1a; 【同步通讯与异步通讯】 1、消息 消息的发送方&#xff0c;即生产者。消息的接收方&#xff0c;即消费者。同步通信就行打视频&#xff0c;等着对方接电话才能继续往下&#xff0c;而…

微服务moleculer03

1. Moleculer 目前支持SQLite&#xff0c;MySQL&#xff0c;MariaDB&#xff0c;PostgreSQL&#xff0c;MSSQL等数据库&#xff0c;这里以mysql为例 2. package.json 增加mysql依赖 "mysql2": "^2.3.3", "sequelize": "^6.21.3", &q…

Dijkstra 邻接表表示算法 | 贪心算法实现--附C++/JAVA实现源码

以下是详细步骤。 创建大小为 V 的最小堆,其中 V 是给定图中的顶点数。最小堆的每个节点包含顶点编号和顶点的距离值。 以源顶点为根初始化最小堆(分配给源顶点的距离值为0)。分配给所有其他顶点的距离值为 INF(无限)。 当最小堆不为空时,执行以下操作: 从最小堆中提取…

MIPI接口协议及规范理解

什么是MIPI接口 MIPI&#xff0c;英文全称为Mobile Industry Processor Interface&#xff0c;即移动行业处理器接口。它是MIPI联盟发起的为移动应用处理器制定的开放标准。MIPI接口是一种专为移动设备和嵌入式系统设计的串行通信接口&#xff0c;定义了一系列的接口标准&…