MySQL学习笔记整理(上部)

Mysql考试整理 mysql整理 MySQL_Major_test 1、Which one of the following keyword is used if a sub-query is likely to return a list of values and you need to match a column value with any of the values in this list to obtain the final result? 如果子查询可能返回值列表,并且您需要将列值与该列表中的任何值进行匹 阅读详情

在这里插入图片描述

前言

以下是我整理了关于MySQL数据库的常用命令和使用场景,一些基本的概念,比如索引、约束和事务,以及常见的问题和解决方案,欢迎大家浏览并留言,若有错误的地方请大家指正。

下部链接

登录命令

-- 打开cmd命令窗口, 输入登录命令
mysql -h localhost -P 3306 -uroot -p123456	
# -h[ip地址]  -P[端口]  -u[用户名]  -p[密码]

mysql -uroot -proot	 # -u[用户名] -p[密码]  用户名+密码登录

登录成功界面:

mysql: [Warning] Using a password ON the command line interface can be insecure.
Welcome to the MySQL mONitor.  Commands END with ; or \g.
Your MySQL cONnectiON id is 3
Server version: 5.7.39-log MySQL Community Server (GPL)

Copyright (c) 2000, 2022, 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>

登录命令参数解析:

  1. mysql
    关键字、固定写法。(类似于java、jdk中的javac命令或java命令)

不可省略。

  1. -h localhost
    参数-h代表主机的ip地址(即host),此处的localhost即为该参数的值,表示主机ip为localhost。

-h与主机ip地址之间的空格,可有可无。

登录本地数据库时,参数-h可以省略不写。当连接远程主机的数据库时,主机ip不可省略。

  1. -P 3306
    参数-P代表数据库的端口号(注意是大写的P),此处的3306即为该参数的值,表示该数据库的端口号为3306。

-P与端口号之间的空格,可有可无。

当MySQL数据库的端口号为默认的3306时,该参数可以省略不写。如果端口号做过修改,不是默认的3306,那么端口号不可省略。

  1. -u root
    参数-u代表数据库的用户名(user),此处的root即为该参数的值,表示用户名为root。

-u与用户名之间的空格,可有可无。

  1. -p root
    参数-p代表对应用户的密码(password),此处的root即为该参数的值,表示密码为root。

-p与密码之间的空格不可省略。

补充:-p后也可以不写密码,此时回车后再输入密码,密码为不可见状态。

  1. 参数顺序
    mysql固定在最前面,-h、-P、-u、-p的位置可随意调换。

  2. 应用举例
    PS:设用户名密码均为root/123456。

①连接本地端口号默认3306的数据库:

mysql -hlocalhost -P3306 -uroot -p123456

mysql -uroot -p
#出现密码输入提示时输入密码

mysql -p -uroot
#出现密码输入提示时输入密码

②连接远程主机10.123.45.17,端口号默认3306的数据库:

mysql -h 10.123.45.17 -P3306 -u root -p123456

mysql -h 10.123.45.17 -uroot -p
#出现密码输入提示时输入密码

mysql -uroot -p -h10.123.45.17
#出现密码输入提示时输入密码

③连接远程主机172.16.0.25,端口号8808的数据库:

mysql -h 172.16.0.25 -P 8808 -u root -p123456

mysql -h 172.16.0.25 -P8808 -uroot -p
#出现密码输入提示时输入密码

mysql -uroot -p -h 172.16.0.25 -P8808
#出现密码输入提示时输入密码

DDL数据定义语言

一、操作库

-- 创建库
create database db1;
-- 创建库是否存在,不存在则创建
create database if not exists db1;
-- 查看所有数据库
show databases;
-- 查看某个数据库的定义信息 
show create database db1; 
-- 修改数据库字符信息
alter database db1 character set utf8; 
-- 删除数据库
drop database db1; 

-- 查看db1库下所有表名
use db1; 
show tables; 

二、操作表

创建表

-- 语法
create table 表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件]
);

注意:
1. 在同一张表中,字段名是不能相同
2. 宽度和约束条件可选
3. 字段名和类型是必须的

注意:表中的最后一个字段不要加逗号

字符编码问题
mysql> create database db1 charset latin1;
mysql> use db1;
mysql> create table t1(name varchar(20));
mysql> show create table t1; #查看表,发现表默认与数据db1的字符编码一致
mysql> insert into t1 values('张'); #插入中文出错,因为latin1不支持中文
ERROR 1366 (HY000): 
mysql> 

#解决方法一:删除库db1,重建db1,字符编码指定为utf8
mysql> create database db1 charset utf8;

#解决方法二:修改编码
mysql> alter table t1 charset utf8; #修改表t1的编码
mysql> insert into t1 values('张'); #虽然t1的编码改了,但是t1的字段name仍然是按照latin1编码创建的
ERROR 1366 (HY000): 
mysql> alter table t1 modify name varchar(20); #需要重新定义下字段name
mysql> insert into t1 values('张');
mysql> SELECT * FROM t1;
+------+
| name |
+------+
|  张  |
+------+

ps:不要忘记将数据库编码也改成utf8,这样以后在该数据库下创建表时,都默认utf8编码了

MySQL字符编码的设置以及MySQL中文乱码的详细解决方法

查看字符编码

首先,将中文插入到数据库乱码是因为没有将数据库编码设置为支持中文的编码,mysql的默认编码是Latin1,不支持中文,应该设置为utf8查看自己的数据库编码是否已设置好,进入数据库,输入命令查看编码是否为utf8

show variables like “char%”;

mysql> show variables like "char%";
+--------------------------+---------------------------------------------------------+
| Variable_name            | Value                                                   |
+--------------------------+---------------------------------------------------------+
| character_set_client     | utf8                                                    |
| character_set_cONnectiON | utf8                                                    |
| character_set_database   | utf8                                                    |
| character_set_filesystem | binary                                                  |
| character_set_results    | utf8                                                    |
| character_set_server     | utf8                                                    |
| character_set_system     | utf8                                                    |
| character_sets_dir       | C:\Program Files\MySQL\MySQL Server 5.7\share\charsets\ |
+--------------------------+---------------------------------------------------------+

说明你的数据库编码正确,无需修改,应该是页面或者其他编码的问题。如果跟上面的结果不同,说明需要修改数据库的编码。解决方案如下:

在windows系统下

  • 方案一

set names utf8;

mysql> set names utf8;
  • 方案二

1、在mysql的安装目录下找到my.ini文件(如果没有的话就把my-medium.ini复制,然后重命名为my.ini即可)

2、在my.ini文件中找到[client]和[mysqld]字段,在下面均加上default-character-set=utf8,保存并关闭

3、重启mysql服务

在linux系统下

1、打开配置文件,我使用的linux版本是ubuntu,配置文件在/etc/mysql/my.cnf

2、在[client]和[mysqld]字段下面均添加default-character-set=utf8,保存并关闭

3、重启mysql服务

注意:
如果重启成功,查看数据库编码,结果改为utf8则说明修改成功了

如果在linux下重启mysql服务的时候出现Job failed to start,在window下重启失败,这是因为安装了高版本的mysql(mysql5.5以上),在高版本对字符编码方式修改的办法中,在[mysqld]下的修改发生了变化,正确方式如下:

[mysqld]下添加的应该为:

-- mysql5.5以上:修改方式有所改动
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

重启mysql,再次查看字符编码,如果跟上面一致,说明成功了

查看表结构

-- 语法
describe [表名];
-- 查看表结构,可简写为desc 表名
desc [表名];

-- 查看表详细结构,可加\G
show create table [表名]\G;

数据类型

数值类型

MySQL 支持所有标准 SQL 数值数据类型。

这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL 和 NUMERIC),以及近似数值数据类型(FLOAT、REAL 和 DOUBLE PRECISION)。

关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。

BIT数据类型保存位字段值,并且支持 MyISAM、MEMORY、InnoDB 和 BDB表。

作为 SQL 标准的扩展,MySQL 也支持整数类型 TINYINT、MEDIUMINT 和 BIGINT。下面的表显示了需要的每个整数类型的存储和范围。

类型大小范围(有符号)范围(无符号)用途
TINYINT1 Bytes(-128,127)(0,255)小整数值
SMALLINT2 Bytes(-32 768,32 767)(0,65 535)大整数值
MEDIUMINT3 Bytes(-8 388 608,8 388 607)(0,16 777 215)大整数值
INT或INTEGER4 Bytes(-2 147 483 648,2 147 483 647)(0,4 294 967 295)大整数值
BIGINT8 Bytes(-9,223,372,036,854,775,808,9 223 372 036 854 775 807)(0,18 446 744 073 709 551 615)极大整数值
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)双精度 浮点数值
DECIMAL对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2依赖于M和D的值依赖于M和D的值小数值
日期和时间类型

表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。

每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。

TIMESTAMP类型有专有的自动更新特性,将在后面描述。

类型大小 ( bytes)范围格式用途
DATE31000-01-01/9999-12-31YYYY-MM-DD日期值
TIME3‘-838:59:59’/‘838:59:59’HH:MM:SS时间值或持续时间
YEAR11901/2155YYYY年份值
DATETIME8‘1000-01-01 00:00:00’ 到 ‘9999-12-31 23:59:59’YYYY-MM-DD hh:mm:ss混合日期和时间值
TIMESTAMP4‘1970-01-01 00:00:01’ UTC 到 ‘2038-01-19 03:14:07’ UTC结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07YYYY-MM-DD hh:mm:ss混合日期和时间值,时间戳
字符串类型

字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。

类型大小用途
CHAR0-255 bytes定长字符串
VARCHAR0-65535 bytes变长字符串
TINYBLOB0-255 bytes不超过 255 个字符的二进制字符串
TINYTEXT0-255 bytes短文本字符串
BLOB0-65 535 bytes二进制形式的长文本数据
TEXT0-65 535 bytes长文本数据
MEDIUMBLOB0-16 777 215 bytes二进制形式的中等长度文本数据
MEDIUMTEXT0-16 777 215 bytes中等长度文本数据
LONGBLOB0-4 294 967 295 bytes二进制形式的极大文本数据
LONGTEXT0-4 294 967 295 bytes极大文本数据

注意:

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

  • CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。

  • BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。

  • BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。

  • 有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。

表完整性约束

完整性约束(或简称“约束”)是数据库的内容必须随时遵守的规则,它们描述了对数据库的哪一次更新是被允许的。一旦定义了完整性约束,MySQL就会负责在每次更新后,测试新的数据内容是否符合相关的约束。

完整性约束的分类

主键约束
主键就是表中的一列或多个列的一组,它们能够唯一地标识表中的每一行。

通过定义PRIMARY KEY约束来创建主键,而且PRIMARY KEY约束中的列不能取空值。

可以用两种方式定义主键,作为列或者表的完整性约束。作为列的完整性约束时,只需要在列定义的时候加上关键字PRIMARY KEY 。作为表的完整性约束时,需要在定义的最后列后加上一条PRIMARY KEY(列名,…)语句。

原则上,任何列或者列的组合都可以充当一个主键。但是主键列必须遵守一些规则:

1、每个表只能定义一个主键。

2、关系模型理论要求必须为每一个表定义一个主键。mysql中并没有这样的要求,可以创建一个没有主键的表。为了安全起见,建议为每个基础表指定一个主键。

3、表中的两个不同的行在主键上不能具有相同的值。即“唯一性原则”。

4、如果从一个复合主键中删除一列后,剩下的列构成的主键仍然满足唯一性原则,那么,这个复合主键是不正确,即“最小化规则”。

5、一个列名在一个主键的列的列表中只能出现一次。

替代键约束
在关系模型中,替代键像主键一样是表的一列或者一组列,它们的值在任何时候都是唯一的。

替代键是没有被选作主键的候选键。

定义替代键的关键字是UNIQUE。

替代键与主键的主要区别:

1、一个表只能有一个主键,但可以有多个候选键,甚至可以重合。

2、主键字段的值不能为空,候选键可以。

3、都可以自动产生索引。

参照完整性约束
参照完整性约束是一种特殊的完整性约束,表现为一个外键。

当指定一个外键的时候,应遵循以下规则:

1、必须为被参照表定义主键

2、必须在被参照表的表名后面指定列名。这个列必须是这个表的之间或替代键。

3、外键中列的数目必须和被参照表的主键中列数目相同。

4、外键列的数据类型必须和被参照表主键中列的数据类型相同。

CHECK完整性约束
当我们需要限定一些数据的范围时,可以使用check完整性约束。

CHECK完整性约束在创建表的时候定义。可以定义为列完整性约束,也可以定义为表完整性约。

命名完整性约束
如果一条INSERT、UPDATE或DELETE语句违反了完整性约束,则MySql返回一条出错的消息并且拒绝更新,一个更新可能会导致多个完整性约束的违反。在这种情况下,应用程序获取几套出错消息。为了确切地表示出是违反了哪一个完整性约束,可以为每个完整性约束分配一个名字,随后,出错消息包含这个名字,从而使得消息对于应用程序更有意义。

案例演示

主键定义:创建表xs1,将姓名定义为主键:

create table wfx.xs1
(
    学号 varchar(6) null,
    姓名 varchar(8) not null primary key,
    出生日期 datetime
);

复合主键的定义: 创建course表,学号、课程号、毕业日期定义为主键:

create table course
(
    学号 varchar(6) not null,
    姓名 varchar(8) not null,
    毕业日期 date   not null,
    课程号varchar(3),
    学分tinyint,
    primary key(学号,课程号,毕业日期)
)

通常MySQL自动地为主键创建一个索引primary。我们可以重新给这个索引起名:

primary key index_primary(学号,课程号,毕业日期)

定义一个替代键:

create table xs1
(
    学号 varchar(6) null,
    姓名 varchar(8) not null unique,
    出生日期 datetime
);

定义为表的完整性约束:

create table xs1
(
    学号 varchar(6) null,
    姓名 varchar(8) not null,
    出生日期 datetime
    unique(姓名)
);

创建表xs2,xs1表中所有学生学号都必须出现在xs2表中:

create table xs2(
    学号 varchar(6) null,
    姓名 varchar(8) nut null,
    出生日期 datetime null,
    primary key(姓名)
    foreign key(学号)
    references xs1(学号)
    on delete restrict
    on update restrict
);

与外键相关的被参照表和参照表可以是同一个表,这样的表成为自参照表:

create table wfx.xs2(
    学号 varchar(6) not null,
    姓名 varchar(8) not null,
    出生日期 datetime null,
    primary key(学号),
    foreign key(学号)
    references xs2(学号)
)

创建表student,性别只能是男或女:

create table wfx.student(
    学号 varchar(6) primary key,
    gender char(6) not null
    check(gender in('男','女'))
);

创建表xs3,将姓名定义为主键:

create table xs3
(
    学号 varchar(6) null,
    姓名 varchar(8) not null ,
    出生日期 datetime
    constraint primary_key_xs3 primary key(姓名)
);

修改表

-- 修改表名语法
ALTER TABLE 表名 RENAME [TO] 新表名;

-- 增加字段语法
ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] FIRST;
ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名;
ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…], ADD 字段名 数据类型 [完整性约束条件…];
                            
-- 删除字段语法
ALTER TABLE 表名 DROP 字段名;

-- 修改字段语法
ALTER TABLE 表名 MODIFY 字段名 数据类型 [完整性约束条件…];
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…];
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];
-- 示例
-- 修改存储引擎
mysql> alter table service 
    -> engine=innodb;

-- 添加字段
mysql> alter table student10
    -> add name varchar(20) not null,
    -> add age int(3) not null default 22;
    
mysql> alter table student10
    -> add stu_num varchar(10) not null after name; #添加name字段之后

mysql> alter table student10                        
    -> add sex enum('male','female') default 'male' first; #添加到最前面

-- 删除字段
mysql> alter table student10
    -> drop sex;

mysql> alter table service
    -> drop mac;

-- 修改字段类型modify
mysql> alter table student10
    -> modify age int(3);
mysql> alter table student10
    -> modify id int(11) not null primary key auto_increment; #修改为主键

-- 增加约束(针对已有的主键增加auto_increment)
mysql> alter table student10 modify id int(11) not null primary key auto_increment;
ERROR 1068 (42000): Multiple primary key defined

mysql> alter table student10 modify id int(11) not null auto_increment;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

-- 对已经存在的表增加复合主键
mysql> alter table service2
    -> add primary key(host_ip,port);        

-- 增加主键
mysql> alter table student1
    -> modify name varchar(10) not null primary key;

-- 增加主键和自动增长
mysql> alter table student1
    -> modify id int not null primary key auto_increment;

-- 删除主键
# 删除自增约束
mysql> alter table student10 modify id int(11) not null; 

# 删除主键
mysql> alter table student10                                 
    -> drop primary key;

复制表

-- 复制表结构+记录 (key不会复制: 主键、外键和索引)
mysql> create table new_service SELECT * FROM service;

-- 只复制表结构
mysql> SELECT * FROM service WHERE 1=2; #条件为假,查不到任何记录
Empty set (0.00 sec)
mysql> create table new1_service SELECT * FROM service WHERE 1=2;  
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> create table t4 like employees;

删除表

-- 删除列
ALTER TABLE 表名 DROP 列名;
-- 删除表
DROP TABLE 表名;
DROP TABLE IF EXISTS 表名;

DML数据操作语言

一、新增数据

-- 写全所有列名
INSERT INTO 表名(列名1,列名2,...列名n) VALUES(值1,值2,...值n);
-- 不写列名(所有列全部添加)
INSERT INTO 表名 VALUES(值1,值2,...值n);
-- 插入部分数据
INSERT INTO 表名(列名1,列名2) VALUES(值1,值2);

二、删除数据

-- 删除表中数据
DELETE FROM 表名 WHERE 列名 = 值;
-- 删除表中所有数据
DELETE FROM 表名;
-- 删除表中所有数据(高效 先删除表,然后再创建一张一样的表。)
truncate table 表名;

三、修改数据

-- 不带条件的修改(会修改所有行)
UPDATE 表名 SET 列名 = 值;
-- 带条件的修改
UPDATE 表名 SET 列名 = 值 WHERE 列名=值;

DQL数据查询语言

关于查询语句有很多,这里基础的不再介绍。主要介绍排序查询、聚合函数、模糊查询、分组查询、分页查询、内连接、外连接、子查询

一、基础关键字

BETWEEN…AND(在什么之间)和 IN(集合)

-- 查询年龄大于等于20 小于等于30				
SELECT * FROM student WHERE age >= 20 && age <=30;
SELECT * FROM student WHERE age >= 20 AND age <=30;
SELECT * FROM student WHERE age BETWEEN 20 AND 30;
				
-- 查询年龄22岁,18岁,25岁的信息
SELECT * FROM student WHERE age = 22 OR age = 18 OR age = 25;
SELECT * FROM student WHERE age IN (22,18,25);

IS NOT NULL(不为null值)、 LIKE(模糊查询)和 DISTINCT(去除重复值)

-- 查询英语成绩不为null
SELECT * FROM student WHERE english IS NOT NULL;
	
 _ :单个任意字符
 % :多个任意字符
-- 查询姓马的有哪些? like
SELECT * FROM student WHERE name LIKE '马%';
-- 查询姓名第二个字是化的人			
SELECT * FROM student WHERE name LIKE "_化%";				
-- 查询姓名是3个字的人
SELECT * FROM student WHERE name LIKE '___';					
-- 查询姓名中包含德的人
SELECT * FROM student WHERE name LIKE '%德%';

-- 关键词 DISTINCT 用于返回唯一不同的值。
-- 语法:SELECT DISTINCT 列名称 FROM 表名称
SELECT DISTINCT name FROM student;

CASE WHEN 条件表达式函数:类似IF ELSE语句

建表 插入数据

CREATE TABLE course ( id INT ( 20 ), sid INT ( 20 ), course VARCHAR ( 255 ), score INT ( 20 ) );

INSERT INTO `course` VALUES (1, 1, '语文', 43);
INSERT INTO `course` VALUES (2, 1, '数学', 55);
INSERT INTO `course` VALUES (3, 2, '语文', 77);
INSERT INTO `course` VALUES (4, 2, '数学', 88);
INSERT INTO `course` VALUES (5, 3, '语文', 98);
INSERT INTO `course` VALUES (6, 3, '数学', 65);

1, 基本用法

-- 语法
CASE 
	WHEN condition THEN result
	[WHEN...THEN...]
	ELSE result
END
-- condition是一个返回布尔类型的表达式,如果表达式返回true,则整个函数返回相应result的值,
-- 如果表达式皆为false,则返回ElSE后result的值,如果省略了ELSE子句,则返回NULL。

CASE    
    WHEN 条件1 THEN 条件成立的内容
    WHEN 条件2 THEN 条件成立执行的内容
    ...
    ELSE 其他条件
END

2, 在update更新中使用

UPDATE TABLE 
  SET 字段 1 =
   		CASE
   		    WHEN 条件 1 THEN 值 1 
   		    WHEN 条件 2 THEN 值 2 
   		    ELSE 值 3 
   		END 
   AND

3, 在SELECT查询中使用

SELECT 字段1, 字段2,       
        CASE 字段3     
            WHEN 值1 THEN 新值       
            WHEN 值2 THEN 新值  
            ELSE 新值
        END AS 重新命名字段3的名字       
FROM table      

4, 在AND条件中使用

SELECT 字段1,字段2,字段3      
FROM table
WHERE
    CASE
        WHEN 条件1 THEN AND后的条件
        WHEN 条件2 THEN AND后的条件
        ELSE AND后想加的条件
    END

举例说明:语文成绩找到及格的,数学成绩找出来不及格的,相当于找到偏科偏语文的学生的学生

SELECT *       
FROM course
WHERE 
    CASE 
        WHEN course = '语文' THEN score>60
        WHEN course = '数学' THEN course<60
    END

5, 在GROUP BY分组中使用

SELECT 字段1,字段2,字段3      
FROM table
WHERE 条件
GROUP BY 
    CASE
        WHEN 条件1 THEN 字段x
        WHEN 条件2 THEN 字段y
    END

说明:满足条件1以字段x分组,满足条件2以字段y分组。

6, 在ORDER BY排序中使用

SELECT 字段1,字段2,字段3      
FROM table
WHERE 条件
ORDER BY 
    CASE
        WHEN 条件1 THEN 字段x
        WHEN 条件2 THEN 字段y
    END

说明:满足条件1以字段x排序,满足条件2以字段y排序。</font

演示: 所有数学课程成绩 大于 语文课程成绩的学生的学号
第1步, 使用CASE WHEN来进行行列转换

SELECT sid 学号,
	CASE 
		WHEN course='语文' THEN score ELSE 0
		END AS 语文分数,
	CASE 
		WHEN course='数学' THEN score ELSE 0
		END AS 数学分数
FROM course

第2步, 根据学号进行合并,将同一个学生的数学和语文成绩放在一行显示
" CASE WHEN course=‘语文’ THEN score ELSE 0 END "是完整的CASE WHEN语句

SELECT
	sid 学号,
	MAX(CASE WHEN course = '语文' THEN score ELSE 0 END) 语文分数,
	MAX(CASE WHEN course = '数学' THEN score ELSE 0 END) 数学分数 
FROM
	course 
GROUP BY
	sid

第3步, 从行列转换的表中取出题目中要求的数据

SELECT a.* FROM 
(
SELECT
	sid 学号,
	MAX(CASE WHEN course = '语文' THEN score ELSE 0 END) 语文分数,
	MAX(CASE WHEN course = '数学' THEN score ELSE 0 END) 数学分数 
FROM
	course 
GROUP BY
	sid
) AS a
AND a.语文分数<a.数学分数

IF NULL 判断如果为空

1, IFNULL(expr1,expr2)用法

假如expr1不为NULL,则 IFNULL() 的返回值为expr1; 否则其返回值为 expr2。IFNULL()的返回值是数字或是字符串,具体情况取决于其所使用的语句

 SELECT IFNULL(1,0);         -- 1                       
 SELECT IFNULL(NULL,10);     -- 10                            
 SELECT IFNULL(1/0,10);      -- 10
 SELECT IFNULL(1/0,'yes');   -- 'yes'  
 SELECT IFNULL('','yes');    -- '' 

2, ISNULL(expr) 的用法

如expr 为null,那么isnull() 的返回值为 1,否则返回值为 0

SELECT ISNULL(1+1);    -- 0
SELECT ISNULL(1/0);    -- 1

3, NULLIF(expr1,expr2)用法

如果expr1 = expr2 成立,那么返回值为NULL,否则返回值为expr1。这和CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END相同

SELECT NULLIF(1,1);    -- NULL
SELECT NULLIF(1,2);    -- 1

EXPLAIN 查看当前查询使用那个索引(多索引优化,判断索引失效)

EXPLAIN SELECT surname,first_name form a,b WHERE a.id = b.id 

如果使用的索引比较慢,或者自动匹配到慢的索引,可以强制选择特定的索引

force index(IX_SkuID)

二、排序查询

语法:ORDER BY 子句

ORDER BY 排序字段1 排序方式1 , 排序字段2 排序方式2...

注意:如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件。

-- 例子
SELECT * FROM persON ORDER BY math; 	  --默认升序
SELECT * FROM persON ORDER BY math asc;   --升序
SELECT * FROM persON ORDER BY math desc;  --降序

三、聚合函数

将一列数据作为一个整体,进行纵向的计算

1, count:计算个数

2, max:计算最大值

3, min:计算最小值

4, sum:计算和

5, avg:计算平均数

6, having:先通过SQL语句把所有数据查询出来,再用 group by 进行分组,然后把分完组的数据用聚合函数进行统计,只不过查询语句和聚合函数之间需要用having连接;(group by 、having、聚合函数通常一起使用)

语法:查询语句 + group by + having + 聚合函数统计

直接上例子:

SELECT emp_no, COUNT(salary) t     #在工资表里查找员工编号、统计发工资的次数(取别名t)
FROM salaries 
WHERE creat_date BETWEEN '2020-01-01' AND '2020-12-31'
GROUP BY emp_no         #通过员工编号编组
HAVING t > 15       	#查询发工资次数大于15次的

常用聚合函数是sum()、avg()、count();
聚合函数是用来统计每个分组的统计信息,它们要跟 group by 一起使用,用来将每个分组所有数据聚合成一条统计数据。聚合函数: max() min() count() avg() sum() 等。

语句执行的顺序
SELECT 语句执行顺序大致是:
where(数据查询) => group by(数据编组) => having(结果过滤) => order by(排序)

四、分组查询

语法:GROUP BY 分组字段;

注意:分组之后查询的字段:分组字段、聚合函数

-- 按照性别分组。分别查询男、女同学的平均分
SELECT sex , AVG(math) FROM student GROUP BY sex;

-- 按照性别分组。分别查询男、女同学的平均分,人数
 SELECT sex , AVG(math),COUNT(id) FROM student GROUP BY sex;

-- 按照性别分组。分别查询男、女同学的平均分,人数 要求:分数低于70分的人,不参与分组
SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex;

-- 按照性别分组。分别查询男、女同学的平均分,人数 要求:分数低于70分的人,不参与分组,分组之后。人数要大于2个人
SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex HAVING COUNT(id) > 2;
SELECT sex , AVG(math),COUNT(id) 人数 FROM student WHERE math > 70 GROUP BY sex HAVING 人数 > 2;

五、分页查询

1, 语法:LIMIT 开始的索引,每页查询的条数;

2, 公式:开始的索引 = (当前的页码 - 1) * 每页显示的条数

3, LIMIT 是一个 MySQL “方言”

-- 每页显示3条记录 
SELECT * FROM student LIMIT 0,3; 	-- 第1页
SELECT * FROM student LIMIT 3,3; 	-- 第2页
SELECT * FROM student LIMIT 6,3; 	-- 第3页

六、自查询/自连接

要通过自关联进行查询时,当前自关联的表当中一定会存在两个相关联的字段

自关联要用别名

语法格式如下

SELECT * FROM 表名 AS 别名1 INNER JOIN 表名 AS 别名2 ON 别名1.列=别名2.列;
-- 查询出河南省所有的市
SELECT * FROM areas AS a1 INNER JOIN areas AS a2 ON a1.aid=a2.pid WHERE a1.atitle='河南省';

-- 查询出郑州市所有的区
SELECT * FROM areas AS a1 INNER JOIN areas AS a2 ON a1.aid=a2.pid WHERE a1.atitle='郑州市';

-- 查询出河南省所有的市区信息
SELECT * FROM areas AS a1 INNER JOIN areas AS a2 ON a1.aid=a2.pid 
LEFT JOIN 
areas AS a3 ON a2.aid=a3.pid WHERE a1.atitle='河南省';

在这里插入图片描述

多表查询(重点)

多表的对应关系

一对一关系

任意一方作为从表,在从表创建外键列指向主表的主键列,从表外键列设置唯一

例:人和身份证号:一个人只能有一个身份证号

一对多关系

在从表创建外键列指向主表的主键列

例:用户和订单:一个用户可以有多个订单

多对一关系

例:订单和用户:多个订单可以属于同一个用户

Tips:但是对于特定的一个订单只能属于一个用户,所以多对一也可以理解为一对一

多对多关系
2张表都要作为主表,需要创建第三张表作为从表,第三张表需要指定2列分别作为2个主表的外键列指向2个主表的主键列,建议让从表的那两列作为联合主键

例:学生选课, 一个学生可以选择多门课程, 一门课程也可以被多个学生选择

七、内连接查询

1, 从哪些表中查询数据

2, 条件是什么

3, 查询哪些字段

1.隐式内连接:使用AND条件消除无用数据

-- 语法: 
SELECT * FROM 表1 t1,表2 t2 WHERE 关联条件 AND 普通条件;
-- 查询员工表的名称,性别。部门表的名称
SELECT emp.name,emp.gENDer,dept.name FROM emp,dept WHERE emp.`dept_id` = dept.`id`;

SELECT 
    t1.name, -- 员工表的姓名
    t1.gENDer,-- 员工表的性别
    t2.name -- 部门表的名称
FROM
    emp t1,
    dept t2
WHERE 
    t1.`dept_id` = t2.`id`;

2.显式内连接

-- 语法: 
SELECT * FROM 表1 t1
			[INNER] JOIN 表2 t2 ON 关联条件
			WHERE 普通条件;
-- 例如:
SELECT * FROM emp INNER JOIN dept ON emp.`dept_id` = dept.`id`;   
SELECT * FROM emp JOIN dept ON emp.`dept_id` = dept.`id`; 

八、外连接查询

1.左外连接 – 查询的是左表所有数据以及其交集部分。

-- 语法:
SELECT * FROM 表1 t1
			LEFT [OUTER] JOIN 表2 t2 ON 关联条件
			WHERE 普通条件;
-- 查询左表全部,再去匹配右表,有就显示,没有就显示null
-- 例子:
-- 查询所有员工信息,如果员工有部门,则查询部门名称,没有部门,则不显示部门名称
SELECT  t1.*,t2.`name` FROM emp t1 LEFT JOIN dept t2 ON t1.`dept_id` = t2.`id`;

2.右外连接 – 查询的是右表所有数据以及其交集部分。

-- 语法:
SELECT * FROM 表1 t1
			RIGHT [OUTER] JOIN 表2 t2 ON 关联条件
			AND 普通条件;
-- 查询右表全部,再去匹配左表,有就显示,没有就显示null
-- 例子:
SELECT  * FROM dept t2 RIGHT JOIN emp t1 ON t1.`dept_id` = t2.`id`;

九、子查询:查询中嵌套查询

子查询结果只要为单列,肯定在AND后作为条件使用
子查询结果只要为多列,肯定在FROM后作为虚拟表使用

-- 查询工资最高的员工信息
-- 1.查询最高的工资是多少 9000
SELECT MAX(salary) FROM emp;

-- 2.查询员工信息,并且工资等于9000的
SELECT * FROM emp WHERE emp.`salary` = 9000;

 -- 用一条sql就完成这个操作。这就是子查询
SELECT * FROM emp WHERE emp.`salary` = (SELECT MAX(salary) FROM emp);

1, 子查询的结果是单行单列的
子查询可以作为条件,使用运算符进行条件判断。 运算符: > >= < <= =

-- 语法:
SELECT * FROM 表 WHERE id = (子查询);
-- 查询员工工资小于平均工资的人
SELECT * FROM emp WHERE emp.salary < (SELECT AVG(salary) FROM emp);

2, 子查询的结果是多行单列的
子查询可以作为条件,使用in关键字来判断

-- 语法:
SELECT * FROM 表 WHERE id in (子查询);
-- 查询'财务部'和'市场部'所有的员工信息
SELECT id FROM dept WHERE name = '财务部' OR name = '市场部';
SELECT * FROM emp WHERE dept_id = 3 OR dept_id = 2;

-- 子查询
SELECT * FROM emp WHERE dept_id IN (SELECT id FROM dept AND name = '财务部' OR name = '市场部');

3, 子查询的结果是多行多列的
子查询可以作为一张虚拟表参与查询

-- 语法:
SELECT * FROM 表1 t1
			JOIN (子查询) t2 ON 关联条件
			WHERE 普通条件;
-- 查询员工入职日期是2011-11-11日之后的员工信息和部门信息
-- 子查询
SELECT * FROM dept t2 JOIN 
(SELECT * FROM emp WHERE JOIN_date > '2011-11-11') AS t1 ON t1.dept_id = t2.id;

-- 普通内连接
SELECT * FROM emp t1,dept t2 WHERE t1.`dept_id` = t2.`id` AND t1.`JOIN_date` >  '2011-11-11'

DCL数据控制语言

管理用户

添加用户

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

删除用户

-- 语法
DROP USER '用户名'@'主机名';

权限管理

查询权限

-- 查询权限
SHOW GRANTS FOR '用户名'@'主机名';
SHOW GRANTS FOR 'lisi'@'%';

授予权限

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

-- 给张三用户授予所有权限,在任意数据库任意表上
GRANT ALL ON *.* TO 'zhangsan'@'localhost';

撤销权限

-- 撤销权限:
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
REVOKE UPDATE ON db3.`account` FROM 'lisi'@'%';

开启MySQL远程访问权限(允许远程连接)

登录并查看权限信息

-- 登录数据库
mysql -u root -p

-- 切换user表
mysql> use mysql;
database changed

-- 查看ip和权限信息
mysql> SELECT host,user FROM user;
+-----------+---------------+
| host      | user          |
+-----------+---------------+
| %         | root          |
| localhost | mysql.sessiON |
| localhost | mysql.sys     |
| localhost | root          |
+-----------+---------------+

可以看到在user表中已创建的root用户。host字段表示登录的主机,其值可以用IP,也可用主机名,

有时想用本地IP登录,那么可以将以上的Host值改为自己的IP即可。

实现远程连接(授权法)

将host字段的值改为%就表示在任何客户端机器上能以root用户登录到mysql服务器,建议在开发时设置为%

update user set host = ’%’ AND user = ’root’;

将权限改为ALL PRIVILEGES

-- 切换user表
mysql> use mysql;
database changed

-- 设置权限
mysql> grant all privileges ON *.* to root@'%' identified by "password";
Query OK, 0 rows affected (0.00 sec)

-- 刷新权限
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

-- 查看ip和权限信息
mysql> SELECT host,user FROM user;
+-----------+---------------+
| host      | user          |
+-----------+---------------+
| %         | root          |
| localhost | mysql.sessiON |
| localhost | mysql.sys     |
| localhost | root          |
+-----------+---------------+

这样机器就可以以用户名root密码root远程访问该机器上的MySQL

实现远程连接(改表法)

-- 切换user表
mysql> use mysql;

-- 修改表内的权限信息
mysql> update user set host = ‘%’ AND user = ‘root’;
Query OK, 0 rows affected (0.00 sec)

这样在远端就可以通过root用户访问MySQL

MySQL函数

字符函数

①length(str)函数

获取参数值的字节个数

对于utf-8字符集来说,一个英文占1个字节;一个中文占3个字节;

对于gbk字符集来说,一个英文占1个字节;一个中文占2个字节;

SELECT length('演示') AS 长度;

②concat(str1,str2,…)函数

将字符串拼接,通过输入的参数str1、str2等,将他们拼接成一个字符串

SELECT concat('演示','-','Sheenky') AS 演示信息;

③upper(str)、lower(str)函数

upper(str):将字符中的所有字母变为大写

lower(str)将字符中的所有字母变成小写

SELECT upper('sheenky') AS 大写;
SELECT lower('SHEENKY') AS 小写;

④substr(str,start,len)函数

str为输入字符串,从start位置开始截取字符串,len表示要截取的长度; 没有指定len长度:表示从start开始起,截取到字符串末尾。指定了len长度:表示从start开始起,截取len个长度

SELECT substr('演示sheenky',3,7) AS out_put;

⑤substring_index(string,sep,num)字符串截取函数

语法:substring_index(string,sep,num),即substring_index(字符串,分隔符,序号)

参数说明

string:用于截取目标字符串的字符串。可为字段,表达式等。

sep:分隔符,string存在且用于分割的字符,比如“,”、“.”等。

num:序号,为非0整数。若为整数则表示从左到右数,若为负数则从右到左数。比如“www.mysql.com”截取字符‘www’,分割符为“.”,从左到右序号为1,即substring_index(“www.mysql.com”,‘.’,1);若从右开始获取“com”则为序号为-1即substring_index(“www.mysql.com”,‘.’,-1)

演示
(1)从某字段截取目标字符串。
例:现有一个学生信息表student,详细地址address储存省、市、县等由逗号隔开的地址信息,比如“XX省,XX市,XX区,…,XXX号”。由于某种原因没有学生所在省信息需要获取,同时获取学生姓名name,性别sex,年龄age。

select name,sex,age,
substring_index(address,',',1) as province
from student;

(2)与cast函数结合使用截取某字符串并转为目标格式。
例:现有一张订单信息data,由于2022-03-03日期 之后存储日期信息的格式出错,日期前加了一些前缀,并用空格隔开,比如“13d 2022-02-01”,需要获取该表2022-03-03之后具体日期信息,同时获取单子offer_id,以及产品名name。

select cast(substring_index(ctime,' ',1) as date) as dt,
offer_id,name    
FROM data
WHERE substring_index(ctime,' ',1) >= '2022-03-03';

⑥instr(str,要查找的子串)函数

返回子串第一次出现的索引,如果找不到,返回0; 当查找的子串存在于字符串中:返回该子串在字符串中【第一次】出现的索引。当查找的子串不在字符串中:返回0

SELECT instr('演示sheenky','s') AS 第一次出现;

⑦trim(str)函数

去掉字符串前后的空格; 该函数只能去掉字符串前后的空格,不能去掉字符串中间的空格

SELECT trim(' SQL 演示 sheenky ') AS 空格去除;

⑧lpad(str,len,填充字符)、rpad(str,len,填充字符)函数

lpad(左填充):用指定的字符,实现对字符串左填充指定长度

rpad(右填充):用指定的字符,实现对字符串右填充指定长度

SELECT lpad('编程秃头',10,'tu') AS out_put;
SELECT rpad('编程秃头',10,'tu') AS out_put;

⑨replace(str,子串,另一个字符串)函数

将字符串str中的字串,替换为另一个字符串

注:replace()方法只能查找指定列,而不能使用全局查找,想要全局查找替换,可以试试循环语句

SELECT replace(NAME,'符兴','符强') AS 替换之后 FROM tb_teacher;

数学函数

①round(x,保留位数)函数

四舍五入; 当对正数进行四舍五入:按照正常的计算方式,四舍五入即可。当对负数进行四舍五入:先把符号丢到一边,对去掉负号后的正数进行四舍五入,完成以后,再把这个负号,补上即可

SELECT round(1.595658,3) AS out_put;

②ceil(x)函数

向上取整,返回>=该参数的最小整数。求的是大于等于这个数字的最小整数

SELECT ceil(1.9) AS out_put;
SELECT ceil(1.1) AS out_put;

③floor(x)函数

向下取整,返回<=该参数的最大整数,求的是小于等于这个数字的最大整数

SELECT floor(1.99) AS out_put;
SELECT floor(1.1) AS out_put;

④truncate(x,D)函数

此函数叫截断函数,顾名思义就是就是截取不要的部分,然后删掉(断掉)它。在小数点的D位置处,截取数字直接删去数字,若在左边就是位置取整不使用任何法则

这个函数理解起来也不难,我们把truncate当作小数点(.)x是要截取的数字。D为正数时是小数点的右侧部分,D为0时则不要小数部分,D为负数时是小数点左边部分

SELECT truncate(314159.2673525,5) AS 截取之后;
SELECT truncate(314159.2673525,0) AS 截取之后;
SELECT truncate(314159.2673525,-4) AS 截取之后;

在这里插入图片描述

⑤mod(被除数,除数)函数

取余; 当被除数为正数,结果就是正数。当被除数为负数,结果就是负数

SELECT mod(10,3) AS out_put;

⑥pow(x,D)函数

此函数是用于计算指数函数,x为底,D为指数

SELECT pow(5,2) AS 平方运算;

聚合函数

①功能与分类

功能:用作统计使用,又称为聚合函数或统计函数

分类:sum 求和 avg 平均值 max 最大值 min 最小值 count 计算个数

在这里插入图片描述

②聚合函数的传入参数,数据类型

1、sum()函数和avg()函数:传入整型/小数类型才有意义;

2、sum()函数和avg()函数对于字符串类型、日期/时间类型的计算都没有太大意义。因此,sum()函数和avg()函数,我们只用来对小数类型和整型进行求和。跳过空值行。

3、max()函数和min()函数:传入整型/小数类型、日期/时间类型意义较大

4、可以传入任何数据类型,但是碰到null要注意,空值跳过,不计数。

注:sum() / count(*)方法计算平均值时,有时候得到的结果和AVG()函数不一定一样。当存在某计算列空值但其它列不是空值的时候就会出现不一样的结果,因为分母并没有跳过空值列。

时间与日期函数

①时间与日期函数含义

日期的含义:指的是我们常说的年、月、日

时间的含义:指的是我们常说的时、分、秒

序号格式符含义
1%Y四位的年份
2%y2位的年份
3%m月份(01,02,…11,12)
4%c月份(1,2,3…11,12)
5%d日(01,02,…)
6%H小时(24小时)
7%h小时(12小时)
8%i分钟(00,01,…59)
9%s秒(00,01,…59)

②now()函数

返回当前系统的日期和时间

SELECT now() AS 当前时间;

③curdate()函数

只返回系统当前的日期,不包含时间

SELECT curdate() AS 当前日期;

④curtime()函数

只返回当前的时间,不包含日期

SELECT curtime() AS 当前时间;

⑤获取日期和时间中的年、月、日、时、分、秒

获取年份:year()

获取月份:mONth()

获取日:day()

获取小时:hour()

获取分钟:minute()

获取秒数:secONd()

⑥weekofyear()函数

获取当前时刻所属周数

SELECT weekofyear(now()) AS 当前时间下的周数;

⑦quarter()函数

获取当前时刻所属的季度

SELECT quarter(curdate()) AS 当前季度;

⑧str_to_date()函数

将日期格式转换为字符串,转换成指定格式的日期

SELECT str_to_date("2022.2.2",'%Y,%c,%d') AS 转换后格式;

⑨date_format()函数

将日期转换成日期字符串

SELECT date_format("2022/2/2",'%Y年,%c月,%d日') AS 转换格式;

DATE_FORMAT(bt.create_time, '%Y-%m-%d %H:%i:%s')
DATE_FORMAT(NOW(), '%Y-%m-%d 00:00:00')

⑩date_add(date,INTERVAL expr type)时间相加函数

date_sub(date,INTERVAL expr type)时间相减函数

向前、向后偏移日期和时间,注意调用方法和正负号

date 参数是合法的日期表达式。expr 参数是希望添加的时间间隔。

type 参数可以是下列值:

type含义
MICROSECOND微秒
SECOND秒
MINUTE分钟
HOUR小时
DAY天
WEEK周
MONTH月
QUARTER季度
YEAR年
DAY_MINUTE日分钟
DAY_HOUR日时
YEAR_MONTH年_月
SELECT curdate() AS 当前时间,
date_add(curdate(),interval 1 year) AS 一年后,
date_add(curdate(),interval 1 month) AS 一月后,
date_add(curdate(),interval 1 day) AS 一天后;

date_sub(curdate(),interval 1 year) AS 一年前,
date_sub(curdate(),interval 1 month) AS 一月前,
date_sub(curdate(),interval 1 day) AS 一天前;

⑪last_day()函数

提取某个月最后一天的日期

SELECT last_day(now()) AS 当月最后一天的日期;

⑫datediff(END_date,start_date)函数

计算两个时间相差的天数

SELECT CONCAT('我出生',datediff(curdate(),'2000-01-01'),'天了!') AS 出生天数

⑬timestampdiff(unit,start_date,END_date)函数

计算两个时间返回的年/月/天数;

unit参数是确定(start_date,END_date)结果的单位,表示为整数,以下是有效单位:

year:年份、mONth:月份、day:天、hour:小时、minute 分钟、secONd:秒、microsecONd:微秒、week:周数、quarter:季度

SELECT timestampdiff(year,'2000-01-01',curdate()) AS 我出生到现在的年数

系统信息函数

①version()函数

查看MySQL系统版本信息号

SELECT version\();

②connection_id()函数

查看当前登入用户的连接次数数

直接调用connection_id()函数–不需任何参数–就可以看到当下连接MySQL服务器的连接次数,不同时间段该函数返回值可能是不一样的

SELECT connection_id();

③processlist

查看用户的连接信息

show processlist;

Id列:登录MySQL的用户标识,是系统自动分配的CONNECTION ID;
User列:显示当前的“用户名”;
Host列:显示执行这个语句的IP,用来追踪出现问题语句的用户;
db列:显示这个进程目前连接的是哪个数据库;
Command列:显示当前连接执行的命令,一般是休眠(Sleep)、查询(Query)、连接(CONnect);
Time列:显示这个状态持续的时间,单位是秒;
State列:显示使用当前连接的SQL语句的状态,包含有:Copying to tmptable、Sorting result、SENDing data等状态;
Info列:显示当前SQL的内容,如果语句过长可能无法显示完全。

④database(),schema()函数

查看当前使用的数据库

SELECT database().schema();

⑤user(),current_user(),system_user()函数

获取当前用户

sekect user().current_user(),system_user();

⑥charset()函数

使用CHARSET()函数返回字符串使用的字符集

SELECT charset('wASd');

⑦collation()函数

使用COLLATION()函数返回字符串排列方式

SELECT collation('abc');

下部链接

MySQL定期整理磁盘碎片 通过本博客,我们深入探讨了为什么需要定期整理MySQL磁盘碎片,以及如何进行这一操作。合理使用这些方法可以有效提升数据库性能,确保系统长时间稳定运行。希望这些信息对读者在实际应用中有所帮助。在下一篇博客中,我们将继续探讨MySQL数据库的其他方面,敬请期待! 阅读详情

相关推荐

MySQL学习整理[上]

MySQL学习整理

私信可回答各种问题~ 912

MYSQL优化之碎片整理

当我们确定数据需要被清除掉时,那么这些数据就已经成了无用的数据,但是按照MySQL的处理方式,这些数据仍然会占用我们的磁盘空间,从而造成了极大的资源浪费。)的表进行了很多更改,不过被删除的数据记录仍然被保持在MySQL的链接清单中,因此数据存储文件的大小并不会随着数据的删除而减小。众所周知,MySQL中MyISAM表的数据是以文件形式存储的,我们可以在MySQL存储数据的文件夹中找到数据库test目录下的。原来,在MySQL中,如果我们删除了表中的大量数据,或者我们对含有可变长度文本数据类型(

doujingwei0825的博客 1558

Spring Boot 3.2 集成 Shiro 2.0.1 踩坑实录:从 javax.servlet 到 jakarta.servlet 的完整迁移指南

本文详细介绍了Spring Boot 3.2集成Shiro 2.0.1时遇到的从javax.servlet到jakarta.servlet的迁移问题,提供了完整的解决方案和迁移指南。通过Maven依赖配置和代码调整,帮助开发者顺利跨越Jakarta EE的兼容性鸿沟,确保Shiro权限控制在Spring Boot 3.2环境中正常运行。

weixin_42570296的博客 484

老夫整理的1000行MySQL学习笔记传授有缘人

老夫整理的1000行MySQL学习笔记传授有缘人

qq_41490913的博客 252

Allegro老鸟的20年效率秘籍:用YepEda Skill脚本实现PCB设计全流程自动化

本文分享了Allegro资深工程师20年效率秘籍,通过YepEda Skill脚本实现PCB设计全流程自动化。从封装建库到规则配置,再到DFM审核,YepEda Skill大幅提升设计效率,每天节省至少4小时重复劳动。文章详细解析了自动化工具链的核心功能,并提供了实战技巧和量化对比数据。

weixin_42546392的博客 239

告别瞎猜!用通达信L2资金流向函数,手把手教你识别主力动向(附实战公式)

本文详细解析通达信L2资金流向函数,手把手教你构建主力动向监控系统。通过分档数据解析、委买委卖攻防解读及实战公式应用,帮助投资者精准识别主力建仓与虚假拉升信号,提升股票交易决策效率。

weixin_26908317的博客 2091

MySQL【学习笔记】整理一

内容:MySQL【学习笔记】整理未完待续…

@MIKE小助手 921

COMSOL实现裂缝性储层油水两相流模拟的关键技术

多孔介质中的流体流动模拟是油气藏开发的核心技术,其基本原理基于达西定律和质量守恒方程。在裂缝性储层中,离散裂缝网络与基质系统的耦合流动带来了特殊的数值挑战。通过COMSOL Multiphysics平台实现的多物理场耦合技术,可以精确模拟油水两相在复杂裂缝系统中的渗流行为。该技术采用Level Set方法表征裂缝几何形态,结合自适应网格生成技术解决狭窄裂缝的网格剖分难题,并创新性地引入Bang-Larsen毛管压力滞后模型,显著提高了采收率预测精度。这些方法在致密油藏开发、水驱优化等工程实践中具有重要应用价

weixin_34005090的博客 229

怎么整理java笔记?java学习笔记整理

俗话说:“好记性不如烂笔头”,不得不说,这句话在大部分时候都是适用的。特别是刚刚入门学习java的朋友,是不是也觉得整理学习笔记是一件麻烦的事?下面就带大家来看看到底应该如何整理java笔记比较好呢? 怎么整理java笔记? 学习笔记切记过于复杂冗余,简单明了为上,可以选择一款比较方便的专门记录学习笔记的App,分门别类的记录为上。 示例目录: 基本概念篇 操作系统中 heap 和 stack 的区别 1.什么是基于注解的切面实现 2.什么是 对象/关系 映射集成模块 3.什么是 Java

gu1857035894的博客 437

第186篇 前馈控制——提升跟踪精度的补充手段

文章摘要: 本文介绍了前馈控制的原理及其在工程中的应用。与反馈控制不同,前馈控制通过提前预测目标值或扰动信息来生成控制量,避免误差出现后再纠正的延迟问题,适用于机器人、机械臂等高速运动场景。前馈控制通常与PID反馈配合使用,前者提供粗调,后者进行微调。文章详细讲解了前馈增益的调节方法(模型法、实验法、自适应法)及两种前馈类型(指令前馈和扰动前馈),并提供了代码示例和面试实战建议,强调前馈与反馈的协同设计是提升控制精度的关键。最后预告了下一篇将讨论串级PID控制架构。

郑伟强dev的专栏 398

2026 最新安全 Skill 合集(CTF / 审计 / 渗透 / 红队)威胁建模一网打尽

2026年安全领域进入"Skill化"时代,各类安全能力被结构化封装为可复用的AI Skill。本文介绍了7个核心安全Skill项目:渗透测试全流程的AgentSkillsHub、CTF解题技能库ctfskills、多语言代码审计工具codeaudit、PHP专项审计系统、Java自动化审计流水线、威胁建模工具threatmodeling以及覆盖30+领域的Anthropic-Cybersecurity-Skills。这些项目将传统安全经验转化为标准化、可验证、可自动执行的模块化能力,支

Chengbei11的博客 1882

MYSQL学习笔记

数据定义语言。

wmwq_dk的博客 2442

【前端基础篇】HTML5 + CSS3 入门知识

,HTML5和CSS3核心知识

前端知识分享喵 2982

MySQL学习笔记整理

MySQL笔记一 SQL、DB、DBMS 分别是什么,他们有什么关系? DB: DataBase (数据库,在硬盘上一文件的形式存在) DBMS: DataBase Management System (数据库管理系统有MySQL等) SQL: 结构化查询语言,是一门标准通用的语言。标准的SQL适用于所有的数据库产品。 ​ SQL属于高级语言,只要能看懂英语单词,写出来的SQL语句,就可以读出什么意思。 ​ SQL语句在执行的时候,实际上内部也会先进行编译,然后在执行SQL

weixin_45573194的博客 237

AutoSAR系列讲解(深入篇)14.7-Mcal Adc配置(上)

详细讲解了ADC的各个配置项的作用

雪云飞星的博客 1万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

尚硅谷MySQL学习笔记

MySQL笔记目录一、MySQL数据库基础篇大纲1. 数据库概述与MySQL安装篇第01章:数据库概述第02章:MySQL环境搭建2. SQL之SELECT使用篇第03章:基本的SELECT语句第04章:运算符第05章:排序与分页第06章:多表查询第07章:单行函数第08章:聚合函数第09章:子查询3. SQL之DDL、DML、DCL使用篇第10章:创建和管理表第11章:数据处理之增删改第12章:MySQL数据类型精讲第13章:约束4. 其它数据库对象篇第14章:视图第15章:存储过程与函数第16章:变量、

IAMLSL的博客 2万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

mysql的字符集和整理是怎么一回事

在MySQL数据库中,特别是创建表的时候,因为经常使用集成工具来创建,总是对一个词特别困惑,整理(collation),字符集很容易理解,就是数据库中的数据要用什么编码格式进行编码,那整理呢?今天查了一下MySQL的开发文档,文档中对这个东西做了一个很有意思的描述,我把大概意思表述一下:什么是整理假如我们有一个字符的集合和对应的编码集合(因为计算机只认识数字,所以只能识别编码),集合如下: A->

中华胡杨的专栏 1540

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

修改mysql 整理_【学习笔记】MySQL的常用操作命令整理

原标题:【学习笔记】MySQL的常用操作命令整理缘由:初次接触命令行操作MySQL数据库,使用还不熟练,故整理之,方便日后查阅。备注: 用户登录MySQL后,对数据库操作的命令基本都以”;” 或 “g”结尾。一. MySQL服务操作:启动MySQL服务:net start mysql停止MySQL服务:net stop mysql进入MySQL数据库:mysql -h 主机地址 -u用户名 -p用...

weixin_42508557的博客 104

MySQL学习笔记整理(下部)

以下是我整理了关于MySQL数据库的常用命令和使用场景,一些基本的概念,比如索引、约束和事务,以及常见的问题和解决方案,欢迎大家浏览并留言,若有错误的地方请大家指正。

霁晨晨晨的博客 3万+

MySQL数据库学习笔记,知识点和案例整理,期末三天复习完【简单且详细】

MySQL数据库学习笔记,近三万字总结,数据库期末知识点总结,各种知识点和案例【简单且详细】

weixin_43474701的博客 3491

MySQL——碎片整理遇到的那些事

为什么要碎片整理 MySQL中使用varchar、text、blob等可变长度的文本数据类型之后需要做额外的MySQL数据表碎片整理。 当MySQL从表中删除一行内容,该段空间就会被留空。如果有大量的删除操作,会使留空空间变得比存储列表内容所使用的空间更大。 MySQL进行数据扫描时,它扫描的对象实际是列表的容量需求上限,也就是数据被写入的区域中处于峰值位置的部分。如果进行新的插入操作,MySQ...

李豆豆的博客 770

mysql 整理表空间_MySQL表空间碎片整理

MySQL可以使用alter table tn engine=innodb语句进行表空间碎片整理。而页内记录并不是物理有序的,并且删除记录后,被删除的记录放到页内free链表,可能会产生很多空洞。alter table命令会重建表,这样的话,猜测可能扫描老表页内说有数据,一个一个的插入到新表中。是不是这个过程呢?跟踪了下堆栈:(gdb) bt#0 btr_cur_optimistic_inser...

weixin_36448245的博客 908

Mysql的学习笔记整理

忘记密码如何进入MYSQL ? mysql.ini中配置: mysql -u root -p 就可以无密码进入mysql 注意: 1. 记住执行完语句后一定要加 ; 表示语句结束。 2. 列名和表名的要用反斜杠 ESC下面那个符号 为了防止和关键字重复造成错误。 3. 数据库管理: 查询所有数据库: mysql&amp;amp;gt; show databases; 创建数据库: m...

qq_38409944的博客 2308

Alibaba12年技术老兵整理的“MySQL 学习笔记”带你轻松拿捏MySQL

学习是一种基础性的能力。然而,“吾生也有涯,而知也无涯。”,如果学习不注意方法,则会“以有涯随无涯,殆矣”。学习就像吃饭睡觉一样,是人的一种本能,人人都有学习的能力。我们在刚出生的时候,什么也不知道,是一张真正的白纸,我们靠学习的本能,学会了走路、说话、穿衣服…后来,我们上学了,老师把书本上的知识一点一点灌输到我们的脑子里,我们掌握的知识越来越多,与此同时,我们学习能力却好像越来越差了,习惯了被别人喂饱,似乎忘记了怎么来喂自己了。

the shy 210

MySQL数据表碎片整理

在MySQL中,我们经常会使用VARCHAR、TEXT、BLOB等可变长度的文本数据类型。不过,当我们使用这些数据类型之后,我们就不得不做一些额外的工作——MySQL数据表碎片整理。 那么,为什么在使用这些数据类型之后,我们就要对MySQL定期进行碎片整理呢? 现在,我们先来看一个具体的例子。在这里,我们使用如下SQL语句在MySQL自带的TEST数据库中创建名为DEMO的数据表并插入5条测...

iteye_6462的博客 292

[MySQL] MySQL学习记录整理

DDL: 数据定义语言(掌握)关键字:create,alter,drop等DML:数据操作语言(掌握)关键字:insert,delete,update等DQL: 数据查询语言**(非常重要)**关键字:select,from,where等DCL: 数据控制语言(了解)用来定义数据库的访问权限和安全级别,及创建用户。常见数据种类int 整型double float 浮点型char varchar 字符串。

weixin_57336987的博客 1559
上一篇: 前端三剑客 HTML+CSS+JavaScript 学习笔记
下一篇: MySQL学习笔记整理(下部)
霁晨晨晨
博客等级 码龄4年 359粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

霁晨晨晨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值