当前位置: 首页 > news >正文

MySQL之select查询

华子目录

  • SQL简介
  • SQL语句分类
  • SQL语句的书写规范
    • SQL注释
      • 单行注释
      • 多行注释
  • select语句
    • 简单的select语句
    • select的算数运算
    • select 要查询的信息 from 表名;
      • 查询表字段
      • 查询常量
      • 查询表达式
      • 查询函数
    • 查询定义==别名==as
    • 安全等于<=>
    • 去重distinct
    • 连接字段concat
  • 模糊查询
  • 运算符
    • 比较运算符
    • 逻辑运算符
    • 正则表达式regexp
  • 聚合函数
    • count
    • avg
    • sum
    • min
    • max
  • group_concat
  • group by
    • having
    • having和where的区别
  • order by
  • limit
  • 完整的select语句
  • 联合查询union和union all
  • 多表关联查询
    • 交叉连接cross
    • inner join内连接
    • left join外连接
    • right join外连接
    • 和where与and搭配使用
  • 自查询
  • 子查询
  • 导入sql表

SQL简介

SQL:结构化查询语言(Structured Query Language),在关系型数据库上执行数据操作、数据检索以及数据维护的标准语言。使用SQL语句,程序员和数据库管理员可以完成如下的任务。

  • 改变数据库的结构
  • 更改系统的安全设置
  • 增加用户对数据库或表的许可权限(root和普通用户的权限)
  • 在数据库中检索需要的信息
  • 对数据库的信息进行更新

SQL语句分类

MySQL致力于支持全套ANSI/ISO SQL标准。在MySQL数据库中,SQL语句主要可以划分为以下几类:

  • DDL(Data Definition Language):数据定义语言定义对数据库对象(库、表、列、索引)的操作。create、drop、alter、rename、 truncate等。
  • DML(Data Manipulation Language): 数据操作语言定义对数据库数据的操作。insert、delete、update等。(内容的增删改查)
  • DQL(Data Query Language)数据查询语言:select语句。
  • DCL(Data Control Language): 数据控制语言,定义对数据库、表、字段、用户的访问权限和安全级别。grant、revoke等。
  • TCL(Transaction Control):事务控制。commit、rollback、savepoint等。

注:可以使用help查看这些语句的帮助信息。

SQL语句的书写规范

  • 在数据库系统中,SQL语句不区分大小写(建议用大写) 。
  • 字符串常量区分大小写
  • SQL语句可单行或多行书写,以“;”结尾。
  • 关键词不能跨多行或简写。
  • 用空格和缩进来提高语句的可读性。
  • 子句通常位于独立行,便于编辑,提高可读性。

SQL注释

单行注释

使用"#""--"  (使用--时,--与sql语句中间需要有一个空格)
mysql> #select user,host from mysql.user;
mysql> select user,host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| redhat           | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
mysql> --select user,host from mysql.user;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '--select user,host from mysql.user' at line 1
# 报错的原因:中间没有加空格
mysql> -- select user,host from mysql.user;
mysql> select user,host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| redhat           | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+

多行注释

使用   /*内容*/
mysql> /*select user,host from mysql.user;*/
mysql> select user,host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| redhat           | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+

select语句

简单的select语句

语法

mysql> select * from 表名;
或
mysql> select 字段1,字段2...   from 表名;
或
mysql> select 字段1,字段2 from 表名 where 条件;

select的算数运算

mysql> select 20+30;
+-------+
| 20+30 |
+-------+
|    50 |
+-------+mysql> select 'abc'+'90';
+------------+
| 'abc'+'90' |
+------------+
|         90 |
+------------+mysql> select '40'+'90';
+-----------+
| '40'+'90' |
+-----------+
|       130 |
+-----------+mysql> select 40+'90';
+---------+
| 40+'90' |
+---------+
|     130 |
+---------+mysql> select 60+30,50+50;
+-------+-------+
| 60+30 | 50+50 |
+-------+-------+
|    90 |   100 |
+-------+-------+mysql> select null+100;  #只要其中一个为null,则结果为null
+----------+
| null+100 |
+----------+
|     NULL |
+----------+mysql> select 'null'+100;
+------------+
| 'null'+100 |
+------------+
|        100 |
+------------+
null值使用空值是指不可用、未分配的值空值不等于零或空格任意类型都可以支持空值包括空值的任何算术表达式都等于空字符串和null进行连接运算,得到也是null

as空格都有取别名的功能

mysql> select 40+30 as 总和;
+--------+
| 总和   |
+--------+
|     70 |
+--------+mysql> select 40+30 总和;
+--------+
| 总和   |
+--------+
|     70 |
+--------+

在这里插入图片描述

select 要查询的信息 from 表名;

"要查询的信息"可以是什么:(1)表中的一个字段或很多字段(中间用“,”分开)as 字段别名(2)常量值(3)表达式(4)函数

查询表字段

mysql> select first_name,last_name from employees;

查询常量

mysql> select 100;+-----+| 100 |+-----+| 100 |+-----+

查询表达式

mysql> select 1+1;+-----+| 1+1 |+-----+|   2 |+-----+

查询函数

mysql> select version();+-----------+| version() |+-----------+| 8.0.21    |+-----------+

查询定义别名as

查询定义别名as 可以省略

  • 改变列的标题头
  • 用于表示计算结果的含义
  • 作为列的别名
  • 如果别名中使用特殊字符,或者是强制大小写敏感,或有空格时,都可以通过为别名添加加双引号实现。
mysql> select 100%98 as 余数结果;
+--------------+
| 余数结果     |
+--------------+
|            2 |
+--------------+mysql> select 100%98 余数;
+--------+
| 余数   |
+--------+
|      2 |
+--------+

安全等于<=>

在这里插入图片描述

mysql> select stu_name from student where stu_name <=> null;
mysql> select stu_name from student where stu_name is null;
在 MySQL 中,`<=>` 是一个比较运算符,用于比较两个表达式是否相等,包括处理 NULL 值的情况。具体来说,`<=>` 运算符会返回以下值之一:- 如果两个表达式都相等,则返回 `1`- 如果其中一个表达式为 `NULL` 而另一个不是,则返回 `0`- 如果两个表达式都不相等,则返回 `-1`。该运算符对于处理 NULL 值特别有用,因为普通的等号运算符 `=` 在比较 NULL 值时会返回 `NULL`,而不是布尔值。而 `<=>` 运算符可以直接比较两个表达式,包括对 NULL 值的处理,同时返回一个明确的结果。例如,假设有两个列 `col1``col2`,如果想要检查它们是否相等,包括对 NULL 值的处理,可以使用 `<=>` 运算符:mysql> SELECT col1 <=> col2 AS are_equal FROM your_table;这样,`are_equal` 列会显示 `1` 表示相等,`0` 表示其中一个是 NULL`-1` 表示不相等。

去重distinct

正常情况下查询数据显示所有行,包括重复行数据
mysql> select stu_name from stu;使用distinct关键字可以从查询结果中清除重复行
mysql> select distinct stu_name from stu;distinct的作用范围是后面所有字段的组合
mysql> select distinct stu_name,stu_age from stu;
`distinct` 是 MySQL 中的一个关键字,用于在查询结果中去除重复的行。当在 `SELECT` 查询语句中使用 `distinct` 关键字时,MySQL 将返回结果集中唯一的行,即每一行都是不同的。如果有多行内容完全相同,则只返回其中一行,其他重复的行将被过滤掉。例如,假设有一个名为 `students` 的表,其中包含学生的姓名和年龄。如果想要列出不重复的年龄,可以这样查询:mysql> select distinct age FROM students;这将返回 `students` 表中所有不重复的年龄值。`distinct` 关键字可以应用于一个或多个列。例如,如果想要检索不重复的学生姓名和年龄的组合,可以这样查询:mysql> select distinct name, age FROM students;这将返回 `students` 表中所有不重复的姓名和年龄的组合。

连接字段concat

在 MySQL 中,`concat()` 函数用于连接两个或多个字符串。它接受一个或多个字符串参数,并返回这些参数连接在一起的结果。以下是 `concat()` 函数的基本语法:concat(string1, string2, ...)其中 `string1`, `string2`, 等等是要连接的字符串参数。你可以提供任意数量的参数,每个参数都是一个字符串。示例用法:SELECT concat('Hello', ' ', 'World'); -- 输出: Hello World`concat()` 函数中,你可以使用常量字符串、表列或其他表达式作为参数。例如:SELECT concat('The ', column1, ' is ', column2) AS result FROM table_name;这将连接列 `column1``column2` 中的值,并在它们之间添加一些字符串。你还可以使用 `concat_ws()` 函数来连接字符串,并指定一个分隔符,该分隔符将在连接字符串之间插入。例如:SELECT concat_ws(', ', 'John', 'Doe', '123 Main St') AS result;
-- 输出: John, Doe, 123 Main St这里 `,` 是分隔符。
mysql> select * from class;
+----------+
| class_id |
+----------+
|     1001 |
|     1002 |
|     1003 |
+----------+mysql> select * from stu;
+-----+--------+-----+---------+
| id  | name   | age | classid |
+-----+--------+-----+---------+
| 101 | 小天   |  18 |    1001 |
| 102 | 小明   |  20 |    1003 |
| 103 | 小红   |  13 |    1002 |
+-----+--------+-----+---------+mysql> select concat(id,name) from stu;
+-----------------+
| concat(id,name) |
+-----------------+
| 101小天         |
| 102小明         |
| 103小红         |
+-----------------+mysql> select concat(id,name) as 学号姓名 from stu;
+--------------+
| 学号姓名     |
+--------------+
| 101小天      |
| 102小明      |
| 103小红      |
+--------------+
3 rows in set (0.00 sec)mysql> select concat('hello',' ','world');
+-----------------------------+
| concat('hello',' ','world') |
+-----------------------------+
| hello world                 |
+-----------------------------+mysql> select concat(name,'的学号是',id) as result from stu;
+-----------------------+
| result                |
+-----------------------+
| 小天的学号是101       |
| 小明的学号是102       |
| 小红的学号是103       |
+-----------------------+mysql> select concat_ws(', ',name,id) as result from stu;
+-------------+
| result      |
+-------------+
| 小天, 101   |
| 小明, 102   |
| 小红, 103   |
+-------------+mysql> select concat_ws('-',name,id) as result from stu;
+------------+
| result     |
+------------+
| 小天-101   |
| 小明-102   |
| 小红-103   |
+------------+

模糊查询

  • %表示匹配任意零个或多个字符
  • _表示单个字符
mysql> select * from stu;
+-----+--------+-----+---------+
| id  | name   | age | classid |
+-----+--------+-----+---------+
| 101 | 小天   |  18 |    1001 |
| 102 | 小明   |  20 |    1003 |
| 103 | 小红   |  13 |    1002 |
+-----+--------+-----+---------+mysql> select * from stu where name like '%红';
+-----+--------+-----+---------+
| id  | name   | age | classid |
+-----+--------+-----+---------+
| 103 | 小红   |  13 |    1002 |
+-----+--------+-----+---------+
1 row in set (0.00 sec)mysql> select * from stu where name like '_红';
+-----+--------+-----+---------+
| id  | name   | age | classid |
+-----+--------+-----+---------+
| 103 | 小红   |  13 |    1002 |
+-----+--------+-----+---------+

运算符

比较运算符

=   !=   <   >   >=  <= 

逻辑运算符

and:当所有条件都为真时,返回真
or:当至少一个条件为真时,返回真
not:用于否定条件表达式,将为真的条件取反
xor:当仅有一个条件为真时,返回真。如果两个条件都为真或都为假,则返回假。
between and
not between and
in
not in
is
is not
mysql> select * from stu;
+-----+--------+-----+---------+
| id  | name   | age | classid |
+-----+--------+-----+---------+
| 101 | 小天   |  18 |    1001 |
| 102 | 小明   |  20 |    1003 |
| 103 | 小红   |  13 |    1002 |
+-----+--------+-----+---------+mysql> select * from stu where id between 101 and 103;# 从101到103的数据
+-----+--------+-----+---------+
| id  | name   | age | classid |
+-----+--------+-----+---------+
| 101 | 小天   |  18 |    1001 |
| 102 | 小明   |  20 |    1003 |
| 103 | 小红   |  13 |    1002 |
+-----+--------+-----+---------+mysql> select * from stu where id between 103 and 104;
+-----+--------+-----+---------+
| id  | name   | age | classid |
+-----+--------+-----+---------+
| 103 | 小红   |  13 |    1002 |
+-----+--------+-----+---------+mysql> select * from stu where age in (13,20);
+-----+--------+-----+---------+
| id  | name   | age | classid |
+-----+--------+-----+---------+
| 102 | 小明   |  20 |    1003 |
| 103 | 小红   |  13 |    1002 |
+-----+--------+-----+---------+mysql> select * from stu where classid in (1003);
+-----+--------+-----+---------+
| id  | name   | age | classid |
+-----+--------+-----+---------+
| 102 | 小明   |  20 |    1003 |
+-----+--------+-----+---------+mysql> select * from stu where name is not null;
+-----+--------+-----+---------+
| id  | name   | age | classid |
+-----+--------+-----+---------+
| 101 | 小天   |  18 |    1001 |
| 102 | 小明   |  20 |    1003 |
| 103 | 小红   |  13 |    1002 |
+-----+--------+-----+---------+mysql> select * from stu where id in (104) xor age=18;
+-----+--------+-----+---------+
| id  | name   | age | classid |
+-----+--------+-----+---------+
| 101 | 小天   |  18 |    1001 |
+-----+--------+-----+---------+mysql> select * from stu where age>= 18 and age<=21;
+-----+--------+-----+---------+
| id  | name   | age | classid |
+-----+--------+-----+---------+
| 101 | 小天   |  18 |    1001 |
| 102 | 小明   |  20 |    1003 |
+-----+--------+-----+---------+mysql> select * from stu where age>= 18 or age<=21;
+-----+--------+-----+---------+
| id  | name   | age | classid |
+-----+--------+-----+---------+
| 101 | 小天   |  18 |    1001 |
| 102 | 小明   |  20 |    1003 |
| 103 | 小红   |  13 |    1002 |
+-----+--------+-----+---------+mysql> select * from stu where id != 101;
+-----+--------+-----+---------+
| id  | name   | age | classid |
+-----+--------+-----+---------+
| 102 | 小明   |  20 |    1003 |
| 103 | 小红   |  13 |    1002 |
+-----+--------+-----+---------+

正则表达式regexp

?字符匹配 0 次或 1^	字符串的开始
$	字符串的结尾
.	任何单个字符
[. . . ]	在方括号内的字符列表
[^ . . . ]	非列在方括号内的任何字符
p1 | p2 | p3	交替匹配任何模式p1,p2或p3
*	零个或多个前面的元素
+	前面的元素的一个或多个实例
{n}	前面的元素的n个实例
{m , n}	m到n个实例前面的元素
mysql> select * from stu where name regexp '小.';
+-----+--------+-----+---------+
| id  | name   | age | classid |
+-----+--------+-----+---------+
| 101 | 小天   |  18 |    1001 |
| 102 | 小明   |  20 |    1003 |
| 103 | 小红   |  13 |    1002 |
+-----+--------+-----+---------+mysql> select * from stu where name regexp '^小';
+-----+--------+-----+---------+
| id  | name   | age | classid |
+-----+--------+-----+---------+
| 101 | 小天   |  18 |    1001 |
| 102 | 小明   |  20 |    1003 |
| 103 | 小红   |  13 |    1002 |
+-----+--------+-----+---------+

聚合函数

count

  • 用于计算行的数量。可以使用 count(*) 来计算所有行的数量,也可以使用 count(字段名) 来计算特定列中非NULL值的数量。
mysql> select count(*) from stu;
+----------+
| count(*) |
+----------+
|        3 |
+----------+mysql> select count(id) from stu;
+-----------+
| count(id) |
+-----------+
|         3 |
+-----------+

avg

  • 用于计算数值列的平均值。
mysql> select avg(age) from stu;
+----------+
| avg(age) |
+----------+
|  17.0000 |
+----------+

sum

  • 用于计算数值列的总和。
mysql> select sum(age) from stu;
+----------+
| sum(age) |
+----------+
|       51 |
+----------+

min

  • 用于找到数值列中的最小值。
mysql> select min(age) from stu;
+----------+
| min(age) |
+----------+
|       13 |
+----------+

max

  • 用于找到数值列中的最大值。
mysql> select max(age) from stu;
+----------+
| max(age) |
+----------+
|       20 |
+----------+

注:count(*)表示所有数据行,不会忽略null值,而count(字段)和其他聚合函数会忽略null值(null值不统计)

group_concat

  • 默认以逗号分隔
mysql> select group_concat(name) from stu;
+----------------------+
| group_concat(name)   |
+----------------------+
| 小天,小明,小红       |
+----------------------+mysql> select group_concat(name separator ';') from stu;
+----------------------------------+
| group_concat(name separator ';') |
+----------------------------------+
| 小天;小明;小红                   |
+----------------------------------+mysql> select group_concat(name separator ',') from stu;
+----------------------------------+
| group_concat(name separator ',') |
+----------------------------------+
| 小天,小明,小红                   |
+----------------------------------+mysql> select group_concat(name id) from stu;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'id) from stu' at line 1
# 报错的原因:group_concat()中只能包含一个字段
mysql> select group_concat(id) from stu;
+------------------+
| group_concat(id) |
+------------------+
| 101,103,102      |
+------------------+

group by

  • group by子句的真正作用在于与各种聚合函数配合使用。用来对查询出来的数据进行分组
  • 分组的含义:把该列具有相同值的多条记录当成一组记录处理,最后每组只输出一条记录。
mysql> select * from department;
+--------------+--------------+
| 部门编号     | 部门名称     |
+--------------+--------------+
|         1001 | 行政部       |
|         1002 | 销售部       |
|         1003 | 技术部       |
|         1004 | 管理部       |
+--------------+--------------+mysql> select * from employee;
+------+-----------+-----------------+--------+-------+--------+
| id   | name      | job             | salary | bonus | job_id |
+------+-----------+-----------------+--------+-------+--------+
|  101 | 麦当      | 后端研发        |  25000 |  5000 |   1003 |
|  102 | 咕咚      | 网络运维        |  15000 |  3000 |   1003 |
|  103 | 迪亚      | 测试工程师      |  12000 |  2000 |   1003 |
|  104 | 米龙      | 后端开发        |  20000 |  3500 |   1003 |
|  105 | 极光      | 前端开发        |  15000 |  2500 |   1003 |
|  106 | 村长      | 人力资源        |  10000 |   500 |   1001 |
|  107 | 五条人    | 销售工程师      |  14000 |  7000 |   1002 |
|  108 | 皇帝      | 董事长          |  30000 | 10000 |   1004 |
+------+-----------+-----------------+--------+-------+--------+mysql> select job_id,avg(salary) from employee group by job_id;# 按照job_id进行分组,将相同数据的job_id值分为一组,计算每一组的平均薪资
+--------+-------------+
| job_id | avg(salary) |
+--------+-------------+
|   1001 |  10000.0000 |
|   1002 |  14000.0000 |
|   1003 |  17400.0000 |
|   1004 |  30000.0000 |
+--------+-------------+

注:group by后面跟的字段只能是聚合函数前面出现过的全部字段,否则分组无效。

mysql> select name,count(name) from employee group by name;
+-----------+-------------+
| name      | count(name) |
+-----------+-------------+
| 麦当      |           1 |
| 咕咚      |           1 |
| 迪亚      |           1 |
| 米龙      |           1 |
| 极光      |           1 |
| 村长      |           1 |
| 五条人    |           1 |
| 皇帝      |           1 |
+-----------+-------------+
8 rows in set (0.00 sec)mysql> select id,name,count(name) from employee group by id,name;
+------+-----------+-------------+
| id   | name      | count(name) |
+------+-----------+-------------+
|  101 | 麦当      |           1 |
|  102 | 咕咚      |           1 |
|  103 | 迪亚      |           1 |
|  104 | 米龙      |           1 |
|  105 | 极光      |           1 |
|  106 | 村长      |           1 |
|  107 | 五条人    |           1 |
|  108 | 皇帝      |           1 |
+------+-----------+-------------+
8 rows in set (0.00 sec)mysql> select id,name,count(name) from employee group by id;
ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'huazi.employee.name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
mysql> select id,name,count(name) from employee group by name;
ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'huazi.employee.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

having

  • having子句用来对分组后的结果再进行条件过滤所以having中的条件只能是与查询字段相关
  • where和having都是用来做条件限定的,但是having只能用在group by之后
  • 分组后加条件,使用having
mysql> select job_id,avg(salary) from employee group by job_id;
+--------+-------------+
| job_id | avg(salary) |
+--------+-------------+
|   1001 |  10000.0000 |
|   1002 |  14000.0000 |
|   1003 |  17400.0000 |
|   1004 |  30000.0000 |
+--------+-------------+mysql> select job_id,avg(salary) from employee group by job_id having job_id=1003;
+--------+-------------+
| job_id | avg(salary) |
+--------+-------------+
|   1003 |  17400.0000 |
+--------+-------------+mysql> select job_id,avg(salary) from employee group by job_id having avg(salary)>20000;
+--------+-------------+
| job_id | avg(salary) |
+--------+-------------+
|   1004 |  30000.0000 |
+--------+-------------+
mysql> select job_id,avg(salary) from employee where bonus>5000 group by job_id;
+--------+-------------+
| job_id | avg(salary) |
+--------+-------------+
|   1002 |  14000.0000 |
|   1004 |  30000.0000 |
+--------+-------------+mysql> select job_id,avg(salary) from employee where bonus>5000 group by job_id having avg(salary)>20000;
+--------+-------------+
| job_id | avg(salary) |
+--------+-------------+
|   1004 |  30000.0000 |
+--------+-------------+

having和where的区别

  • where是在分组前进行条件过滤的,having子句是在分组后进行条件过滤的,(where子句中不能使用聚合函数,having子句中 可以使用聚合函数)

order by

  • 在 MySQL 中,order by子句用于对查询结果进行排序。你可以根据一个或多个列的值对结果进行排序,并指定升序或降序排序。
mysql> select * from employee;
+------+-----------+-----------------+--------+-------+--------+
| id   | name      | job             | salary | bonus | job_id |
+------+-----------+-----------------+--------+-------+--------+
|  101 | 麦当      | 后端研发        |  25000 |  5000 |   1003 |
|  102 | 咕咚      | 网络运维        |  15000 |  3000 |   1003 |
|  103 | 迪亚      | 测试工程师      |  12000 |  2000 |   1003 |
|  104 | 米龙      | 后端开发        |  20000 |  3500 |   1003 |
|  105 | 极光      | 前端开发        |  15000 |  2500 |   1003 |
|  106 | 村长      | 人力资源        |  10000 |   500 |   1001 |
|  107 | 五条人    | 销售工程师      |  14000 |  7000 |   1002 |
|  108 | 皇帝      | 董事长          |  30000 | 10000 |   1004 |
+------+-----------+-----------------+--------+-------+--------+mysql> select * from employee order by salary;# 默认升序
+------+-----------+-----------------+--------+-------+--------+
| id   | name      | job             | salary | bonus | job_id |
+------+-----------+-----------------+--------+-------+--------+
|  106 | 村长      | 人力资源        |  10000 |   500 |   1001 |
|  103 | 迪亚      | 测试工程师      |  12000 |  2000 |   1003 |
|  107 | 五条人    | 销售工程师      |  14000 |  7000 |   1002 |
|  102 | 咕咚      | 网络运维        |  15000 |  3000 |   1003 |
|  105 | 极光      | 前端开发        |  15000 |  2500 |   1003 |
|  104 | 米龙      | 后端开发        |  20000 |  3500 |   1003 |
|  101 | 麦当      | 后端研发        |  25000 |  5000 |   1003 |
|  108 | 皇帝      | 董事长          |  30000 | 10000 |   1004 |
+------+-----------+-----------------+--------+-------+--------+mysql> select * from employee order by salary desc;# desc降序
+------+-----------+-----------------+--------+-------+--------+
| id   | name      | job             | salary | bonus | job_id |
+------+-----------+-----------------+--------+-------+--------+
|  108 | 皇帝      | 董事长          |  30000 | 10000 |   1004 |
|  101 | 麦当      | 后端研发        |  25000 |  5000 |   1003 |
|  104 | 米龙      | 后端开发        |  20000 |  3500 |   1003 |
|  102 | 咕咚      | 网络运维        |  15000 |  3000 |   1003 |
|  105 | 极光      | 前端开发        |  15000 |  2500 |   1003 |
|  107 | 五条人    | 销售工程师      |  14000 |  7000 |   1002 |
|  103 | 迪亚      | 测试工程师      |  12000 |  2000 |   1003 |
|  106 | 村长      | 人力资源        |  10000 |   500 |   1001 |
+------+-----------+-----------------+--------+-------+--------+mysql> select * from employee order by salary asc; # asc升序
+------+-----------+-----------------+--------+-------+--------+
| id   | name      | job             | salary | bonus | job_id |
+------+-----------+-----------------+--------+-------+--------+
|  106 | 村长      | 人力资源        |  10000 |   500 |   1001 |
|  103 | 迪亚      | 测试工程师      |  12000 |  2000 |   1003 |
|  107 | 五条人    | 销售工程师      |  14000 |  7000 |   1002 |
|  102 | 咕咚      | 网络运维        |  15000 |  3000 |   1003 |
|  105 | 极光      | 前端开发        |  15000 |  2500 |   1003 |
|  104 | 米龙      | 后端开发        |  20000 |  3500 |   1003 |
|  101 | 麦当      | 后端研发        |  25000 |  5000 |   1003 |
|  108 | 皇帝      | 董事长          |  30000 | 10000 |   1004 |
+------+-----------+-----------------+--------+-------+--------+

limit

  • 在MySQL中,limit子句用于限制select查询返回的行数。这对于处理大量数据并且只需要部分结果时非常有用。
select.......limit [offset_start,] row_count;
注:
offset_start:偏移量,默认为0
row_count:查询的最大行数
mysql> select * from employee;
+------+-----------+-----------------+--------+-------+--------+
| id   | name      | job             | salary | bonus | job_id |
+------+-----------+-----------------+--------+-------+--------+
|  101 | 麦当      | 后端研发        |  25000 |  5000 |   1003 |
|  102 | 咕咚      | 网络运维        |  15000 |  3000 |   1003 |
|  103 | 迪亚      | 测试工程师      |  12000 |  2000 |   1003 |
|  104 | 米龙      | 后端开发        |  20000 |  3500 |   1003 |
|  105 | 极光      | 前端开发        |  15000 |  2500 |   1003 |
|  106 | 村长      | 人力资源        |  10000 |   500 |   1001 |
|  107 | 五条人    | 销售工程师      |  14000 |  7000 |   1002 |
|  108 | 皇帝      | 董事长          |  30000 | 10000 |   1004 |
+------+-----------+-----------------+--------+-------+--------+mysql> select * from employee limit 5; # 从第1行开始,一共显示5行数据
+------+--------+-----------------+--------+-------+--------+
| id   | name   | job             | salary | bonus | job_id |
+------+--------+-----------------+--------+-------+--------+
|  101 | 麦当   | 后端研发        |  25000 |  5000 |   1003 |
|  102 | 咕咚   | 网络运维        |  15000 |  3000 |   1003 |
|  103 | 迪亚   | 测试工程师      |  12000 |  2000 |   1003 |
|  104 | 米龙   | 后端开发        |  20000 |  3500 |   1003 |
|  105 | 极光   | 前端开发        |  15000 |  2500 |   1003 |
+------+--------+-----------------+--------+-------+--------+mysql> select * from employee limit 1,3; # 从第2行开始,一共显示3行数据
+------+--------+-----------------+--------+-------+--------+
| id   | name   | job             | salary | bonus | job_id |
+------+--------+-----------------+--------+-------+--------+
|  102 | 咕咚   | 网络运维        |  15000 |  3000 |   1003 |
|  103 | 迪亚   | 测试工程师      |  12000 |  2000 |   1003 |
|  104 | 米龙   | 后端开发        |  20000 |  3500 |   1003 |
+------+--------+-----------------+--------+-------+--------+

完整的select语句

mysql> select 去重选项 字段列表 [as 字段别名] from 数据源 [where子句] [group by 子句] [having子句] [order by 子句] [limit子句];

联合查询union和union all

当我们在查询过程中遇到select * from employee where dept_id in (1001,1002);这类情况时,
可以使用select * from employee where dept_id=1001 union/union all select *from employee where dept_id=1002;说明:一般情况下,我们会将in或者or语句改写为union all来提高性能。
union:去重
union all 不去重
mysql> select * from employee;
+------+-----------+-----------------+--------+-------+--------+
| id   | name      | job             | salary | bonus | job_id |
+------+-----------+-----------------+--------+-------+--------+
|  101 | 麦当      | 后端研发        |  25000 |  5000 |   1003 |
|  102 | 咕咚      | 网络运维        |  15000 |  3000 |   1003 |
|  103 | 迪亚      | 测试工程师      |  12000 |  2000 |   1003 |
|  104 | 米龙      | 后端开发        |  20000 |  3500 |   1003 |
|  105 | 极光      | 前端开发        |  15000 |  2500 |   1003 |
|  106 | 村长      | 人力资源        |  10000 |   500 |   1001 |
|  107 | 五条人    | 销售工程师      |  14000 |  7000 |   1002 |
|  108 | 皇帝      | 董事长          |  30000 | 10000 |   1004 |
+------+-----------+-----------------+--------+-------+--------+mysql> select * from employee where job_id in (1003,1001);
+------+--------+-----------------+--------+-------+--------+
| id   | name   | job             | salary | bonus | job_id |
+------+--------+-----------------+--------+-------+--------+
|  106 | 村长   | 人力资源        |  10000 |   500 |   1001 |
|  101 | 麦当   | 后端研发        |  25000 |  5000 |   1003 |
|  102 | 咕咚   | 网络运维        |  15000 |  3000 |   1003 |
|  103 | 迪亚   | 测试工程师      |  12000 |  2000 |   1003 |
|  104 | 米龙   | 后端开发        |  20000 |  3500 |   1003 |
|  105 | 极光   | 前端开发        |  15000 |  2500 |   1003 |
+------+--------+-----------------+--------+-------+--------+mysql> select * from employee where job_id=1001 union select * from employee where job_id=1003;
+------+--------+-----------------+--------+-------+--------+
| id   | name   | job             | salary | bonus | job_id |
+------+--------+-----------------+--------+-------+--------+
|  106 | 村长   | 人力资源        |  10000 |   500 |   1001 |
|  101 | 麦当   | 后端研发        |  25000 |  5000 |   1003 |
|  102 | 咕咚   | 网络运维        |  15000 |  3000 |   1003 |
|  103 | 迪亚   | 测试工程师      |  12000 |  2000 |   1003 |
|  104 | 米龙   | 后端开发        |  20000 |  3500 |   1003 |
|  105 | 极光   | 前端开发        |  15000 |  2500 |   1003 |
+------+--------+-----------------+--------+-------+--------+mysql> select * from employee where job_id=1001 union all select * from employee where job
_id=1003;
+------+--------+-----------------+--------+-------+--------+
| id   | name   | job             | salary | bonus | job_id |
+------+--------+-----------------+--------+-------+--------+
|  106 | 村长   | 人力资源        |  10000 |   500 |   1001 |
|  101 | 麦当   | 后端研发        |  25000 |  5000 |   1003 |
|  102 | 咕咚   | 网络运维        |  15000 |  3000 |   1003 |
|  103 | 迪亚   | 测试工程师      |  12000 |  2000 |   1003 |
|  104 | 米龙   | 后端开发        |  20000 |  3500 |   1003 |
|  105 | 极光   | 前端开发        |  15000 |  2500 |   1003 |
+------+--------+-----------------+--------+-------+--------+
mysql> select * from employee where dept_id=1001-> union-> select * from employee where dept_id=1002;

多表关联查询

mysql> select 字段... from1 inner/left/right/full join2 on 条件;
在 MySQL 中,多表关联查询是通过使用 `JOIN` 子句来实现的,它允许你在一个查询中检索多个表中的数据,并且可以根据这些表之间的关联条件来连接它们。基本语法如下:SELECT column1, column2, ...
FROM table1
JOIN table2 ON table1.column_name = table2.column_name;在这里,`table1``table2` 是要连接的表,`column_name` 是它们之间的关联列。这个列可以是两个表中的任何一个列,只要它们的值匹配。有几种不同类型的 `JOIN`1. INNER JOIN(内连接):返回匹配两个表之间连接条件的行。SELECT *
FROM table1
INNER JOIN table2 ON table1.column_name = table2.column_name;2. LEFT JOIN(左连接):返回左表中的所有行,以及右表中与左表中的行匹配的行。如果没有匹配的行,将为右表中的列返回 NULL 值。SELECT *
FROM table1
LEFT JOIN table2 ON table1.column_name = table2.column_name;3. RIGHT JOIN(右连接):返回右表中的所有行,以及左表中与右表中的行匹配的行。如果没有匹配的行,将为左表中的列返回 NULL 值。SELECT *
FROM table1
RIGHT JOIN table2 ON table1.column_name = table2.column_name;4. FULL JOIN(全连接):返回左表和右表中的所有行。如果没有匹配的行,将为另一个表中的列返回 NULL 值。SELECT *
FROM table1
FULL JOIN table2 ON table1.column_name = table2.column_name;`JOIN` 子句也可以与 `WHERE` 子句一起使用,以添加额外的筛选条件。SELECT *
FROM table1
INNER JOIN table2 ON table1.column_name = table2.column_name
WHERE condition;在多表关联查询中,你可以使用多个 `JOIN` 子句来连接更多的表,以获取所需的数据。

交叉连接cross

  • 将两张表或多张表联合起来查询,这就是连接查询。交叉连接返回的结果是被连接的两个表中所有数据行的笛卡儿积。
  • 笛卡尔积是必须要知道的一个概念。在没有任何限制条件的情况下,两表连接必然会形成笛卡尔积。(如表1m行a列,表2n行b列,则无条件连接时则会有m*n,a+b列。)交叉连接查询在实际运用中没有任何意义
  • 注意:连接条件必须是唯一字段,如果非唯一字段则会产生笛卡尔积。
mysql> select * from stu;
+-----+--------+-----+---------+
| id  | name   | age | classid |
+-----+--------+-----+---------+
| 101 | 小天   |  18 |    1001 |
| 102 | 小明   |  20 |    1003 |
| 103 | 小红   |  13 |    1002 |
+-----+--------+-----+---------+mysql> select * from class;
+----------+
| class_id |
+----------+
|     1001 |
|     1002 |
|     1003 |
+----------+mysql> select * from stu,class;#笛卡尔积
+-----+--------+-----+---------+----------+
| id  | name   | age | classid | class_id |
+-----+--------+-----+---------+----------+
| 103 | 小红   |  13 |    1002 |     1001 |
| 102 | 小明   |  20 |    1003 |     1001 |
| 101 | 小天   |  18 |    1001 |     1001 |
| 103 | 小红   |  13 |    1002 |     1002 |
| 102 | 小明   |  20 |    1003 |     1002 |
| 101 | 小天   |  18 |    1001 |     1002 |
| 103 | 小红   |  13 |    1002 |     1003 |
| 102 | 小明   |  20 |    1003 |     1003 |
| 101 | 小天   |  18 |    1001 |     1003 |
+-----+--------+-----+---------+----------+

inner join内连接

mysql> select * from employee;
+------+-----------+-----------------+--------+-------+--------+
| id   | name      | job             | salary | bonus | job_id |
+------+-----------+-----------------+--------+-------+--------+
|  101 | 麦当      | 后端研发        |  25000 |  5000 |   1003 |
|  102 | 咕咚      | 网络运维        |  15000 |  3000 |   1003 |
|  103 | 迪亚      | 测试工程师      |  12000 |  2000 |   1003 |
|  104 | 米龙      | 后端开发        |  20000 |  3500 |   1003 |
|  105 | 极光      | 前端开发        |  15000 |  2500 |   1003 |
|  106 | 村长      | 人力资源        |  10000 |   500 |   1001 |
|  107 | 五条人    | 销售工程师      |  14000 |  7000 |   1002 |
|  108 | 皇帝      | 董事长          |  30000 | 10000 |   1004 |
+------+-----------+-----------------+--------+-------+--------+mysql> select * from department;
+--------------+--------------+
| 部门编号     | 部门名称     |
+--------------+--------------+
|         1001 | 行政部       |
|         1002 | 销售部       |
|         1003 | 技术部       |
|         1004 | 管理部       |
|         1005 | 领导部       |
+--------------+--------------+mysql> select * from employee inner join department on employee.job_id=department.部门编号;
+------+-----------+-----------------+--------+-------+--------+--------------+--------------+
| id   | name      | job             | salary | bonus | job_id | 部门编号     | 部门名称     |
+------+-----------+-----------------+--------+-------+--------+--------------+--------------+
|  101 | 麦当      | 后端研发        |  25000 |  5000 |   1003 |         1003 | 技术部       |
|  102 | 咕咚      | 网络运维        |  15000 |  3000 |   1003 |         1003 | 技术部       |
|  103 | 迪亚      | 测试工程师      |  12000 |  2000 |   1003 |         1003 | 技术部       |
|  104 | 米龙      | 后端开发        |  20000 |  3500 |   1003 |         1003 | 技术部       |
|  105 | 极光      | 前端开发        |  15000 |  2500 |   1003 |         1003 | 技术部       |
|  106 | 村长      | 人力资源        |  10000 |   500 |   1001 |         1001 | 行政部       |
|  107 | 五条人    | 销售工程师      |  14000 |  7000 |   1002 |         1002 | 销售部       |
|  108 | 皇帝      | 董事长          |  30000 | 10000 |   1004 |         1004 | 管理部       |
+------+-----------+-----------------+--------+-------+--------+--------------+--------------+

left join外连接

mysql> select * from employee left join department on employee.job_id=department.部门编号;
+------+-----------+-----------------+--------+-------+--------+--------------+--------------+
| id   | name      | job             | salary | bonus | job_id | 部门编号     | 部门名称     |
+------+-----------+-----------------+--------+-------+--------+--------------+--------------+
|  101 | 麦当      | 后端研发        |  25000 |  5000 |   1003 |         1003 | 技术部       |
|  102 | 咕咚      | 网络运维        |  15000 |  3000 |   1003 |         1003 | 技术部       |
|  103 | 迪亚      | 测试工程师      |  12000 |  2000 |   1003 |         1003 | 技术部       |
|  104 | 米龙      | 后端开发        |  20000 |  3500 |   1003 |         1003 | 技术部       |
|  105 | 极光      | 前端开发        |  15000 |  2500 |   1003 |         1003 | 技术部       |
|  106 | 村长      | 人力资源        |  10000 |   500 |   1001 |         1001 | 行政部       |
|  107 | 五条人    | 销售工程师      |  14000 |  7000 |   1002 |         1002 | 销售部       |
|  108 | 皇帝      | 董事长          |  30000 | 10000 |   1004 |         1004 | 管理部       |
+------+-----------+-----------------+--------+-------+--------+--------------+--------------+

right join外连接

mysql> select * from employee right join department on employee.job_id=department.部门编号;
+------+-----------+-----------------+--------+-------+--------+--------------+--------------+
| id   | name      | job             | salary | bonus | job_id | 部门编号     | 部门名称     |
+------+-----------+-----------------+--------+-------+--------+--------------+--------------+
|  106 | 村长      | 人力资源        |  10000 |   500 |   1001 |         1001 | 行政部       |
|  107 | 五条人    | 销售工程师      |  14000 |  7000 |   1002 |         1002 | 销售部       |
|  101 | 麦当      | 后端研发        |  25000 |  5000 |   1003 |         1003 | 技术部       |
|  102 | 咕咚      | 网络运维        |  15000 |  3000 |   1003 |         1003 | 技术部       |
|  103 | 迪亚      | 测试工程师      |  12000 |  2000 |   1003 |         1003 | 技术部       |
|  104 | 米龙      | 后端开发        |  20000 |  3500 |   1003 |         1003 | 技术部       |
|  105 | 极光      | 前端开发        |  15000 |  2500 |   1003 |         1003 | 技术部       |
|  108 | 皇帝      | 董事长          |  30000 | 10000 |   1004 |         1004 | 管理部       |
| NULL | NULL      | NULL            |   NULL |  NULL |   NULL |         1005 | 领导部       |
+------+-----------+-----------------+--------+-------+--------+--------------+--------------+

和where与and搭配使用

和where搭配使用

mysql> select * from employee right join department on employee.job_id=department.部门编号;
+------+-----------+-----------------+--------+-------+--------+--------------+--------------+
| id   | name      | job             | salary | bonus | job_id | 部门编号     | 部门名称     |
+------+-----------+-----------------+--------+-------+--------+--------------+--------------+
|  106 | 村长      | 人力资源        |  10000 |   500 |   1001 |         1001 | 行政部       |
|  107 | 五条人    | 销售工程师      |  14000 |  7000 |   1002 |         1002 | 销售部       |
|  101 | 麦当      | 后端研发        |  25000 |  5000 |   1003 |         1003 | 技术部       |
|  102 | 咕咚      | 网络运维        |  15000 |  3000 |   1003 |         1003 | 技术部       |
|  103 | 迪亚      | 测试工程师      |  12000 |  2000 |   1003 |         1003 | 技术部       |
|  104 | 米龙      | 后端开发        |  20000 |  3500 |   1003 |         1003 | 技术部       |
|  105 | 极光      | 前端开发        |  15000 |  2500 |   1003 |         1003 | 技术部       |
|  108 | 皇帝      | 董事长          |  30000 | 10000 |   1004 |         1004 | 管理部       |
| NULL | NULL      | NULL            |   NULL |  NULL |   NULL |         1005 | 领导部       |
+------+-----------+-----------------+--------+-------+--------+--------------+--------------+mysql> select * from employee right join department on employee.job_id=department.部门编号 where em
ployee.id is not null;
+------+-----------+-----------------+--------+-------+--------+--------------+--------------+
| id   | name      | job             | salary | bonus | job_id | 部门编号     | 部门名称     |
+------+-----------+-----------------+--------+-------+--------+--------------+--------------+
|  101 | 麦当      | 后端研发        |  25000 |  5000 |   1003 |         1003 | 技术部       |
|  102 | 咕咚      | 网络运维        |  15000 |  3000 |   1003 |         1003 | 技术部       |
|  103 | 迪亚      | 测试工程师      |  12000 |  2000 |   1003 |         1003 | 技术部       |
|  104 | 米龙      | 后端开发        |  20000 |  3500 |   1003 |         1003 | 技术部       |
|  105 | 极光      | 前端开发        |  15000 |  2500 |   1003 |         1003 | 技术部       |
|  106 | 村长      | 人力资源        |  10000 |   500 |   1001 |         1001 | 行政部       |
|  107 | 五条人    | 销售工程师      |  14000 |  7000 |   1002 |         1002 | 销售部       |
|  108 | 皇帝      | 董事长          |  30000 | 10000 |   1004 |         1004 | 管理部       |
+------+-----------+-----------------+--------+-------+--------+--------------+--------------+

和and搭配使用

mysql> select * from employee right join department on employee.job_id=department.部门编号 and employee.id is not null;

注:用where搭配是最保险的

自查询

  • 原理:一张表起多个别名
  • 使用inner join实现自查询
mysql> select t1.name '国家',t2.name '省区' from country t1 inner join country t2 on t1.id=t2.parent_id and t1.parent_id is null;
+--------+-----------+
| 国家   | 省区      |
+--------+-----------+
| 中国   | 陕西      |
| 中国   | 北京      |
| 中国   | 深圳      |
| 美国   | 华盛顿    |
| 美国   | 新加坡    |
+--------+-----------+
mysql> select t1.name '国家',t2.name '省区',t3.name '市区' from country t1 inner join country t2 inner join country t3 on t1.id=t2.parent_id and t1.parent_id is null and t2.id = t3.parent_id;
+--------+-----------+--------------+
| 国家   | 省区      | 市区         |
+--------+-----------+--------------+
| 中国   | 陕西      | 西安         |
| 中国   | 北京      | 北京市       |
| 美国   | 华盛顿    | 小华盛顿     |
| 美国   | 新加坡    | 小新加坡     |
+--------+-----------+--------------+

子查询

在 MySQL 中,子查询(也称为嵌套查询)是指在一个查询内部嵌套另一个完整的查询语句。子查询通常作为另一个查询的一部分,用于过滤、比较、或者提供补充信息。下面是一些常见的子查询用法:1. 作为条件的子查询:子查询可以用作 `WHERE``HAVING` 子句中的条件。SELECT column1FROM table1WHERE column2 = (SELECT column3 FROM table2 WHERE condition);这个子查询将根据在 `table2` 中满足条件的值,来过滤 `table1` 中的结果。2. 用于 `FROM` 子句的子查询:子查询可以作为另一个查询的结果集,被当作一个临时表一样处理。SELECT *FROM (SELECT column1, column2 FROM table1 WHERE condition) AS subquery;这个子查询将作为一个虚拟表,在外部查询中被引用。3. 用于比较的子查询:子查询可以用于与外部查询中的列进行比较。SELECT column1, column2FROM table1WHERE column2 > (SELECT AVG(column2) FROM table1);这个子查询将计算 `table1``column2` 列的平均值,并返回大于该平均值的行。子查询可以非常灵活地用于解决各种复杂的查询需求,但也要注意它们的性能开销。在使用子查询时,确保查询的效率和性能,以及对查询结果的正确性进行适当的测试和优化。
  • 1.子查询是将一个查询语句嵌套再另一个查询语句中。内部嵌套其他select语句的查询,称为外查询或主查询
  • 2.内层查询语句的查询结果,可以为外层查询语句提供查询条件
  • 3.子查询中可以包含:in、not in、any、all、exists、not exists等关键字
  • 4.还可以包含比较运算符:=、!=、>、<等
  • 5.子查询的外部的语句可以是insert,update,delete,select中的任何一个
通过位置来分:select 后面:仅仅支持标量子查询from 后面:支持表子查询wherehaving 后面:支持标量子查询(重要)\列子查询(重要)\行子查询(用的较少)exists 后面(相关查询):支持表子查询
mysql> select * from employee;
+------+-----------+-----------------+--------+-------+--------+
| id   | name      | job             | salary | bonus | job_id |
+------+-----------+-----------------+--------+-------+--------+
|  101 | 麦当      | 后端研发        |  25000 |  5000 |   1003 |
|  102 | 咕咚      | 网络运维        |  15000 |  3000 |   1003 |
|  103 | 迪亚      | 测试工程师      |  12000 |  2000 |   1003 |
|  104 | 米龙      | 后端开发        |  20000 |  3500 |   1003 |
|  105 | 极光      | 前端开发        |  15000 |  2500 |   1003 |
|  106 | 村长      | 人力资源        |  10000 |   500 |   1001 |
|  107 | 五条人    | 销售工程师      |  14000 |  7000 |   1002 |
|  108 | 皇帝      | 董事长          |  30000 | 10000 |   1004 |
+------+-----------+-----------------+--------+-------+--------+mysql> select name,salary from employee where salary > (select avg(salary) from employee);
+--------+--------+
| name   | salary |
+--------+--------+
| 麦当   |  25000 |
| 米龙   |  20000 |
| 皇帝   |  30000 |
+--------+--------+mysql> select * from (select name,salary from employee where job_id=1003) as subquery;#必须起别名,否则就会报错
+--------+--------+
| name   | salary |
+--------+--------+
| 麦当   |  25000 |
| 咕咚   |  15000 |
| 迪亚   |  12000 |
| 米龙   |  20000 |
| 极光   |  15000 |
+--------+--------+mysql> select * from (select name,salary from employee where job_id=1003);#报错原因:没有起别名
ERROR 1248 (42000): Every derived table must have its own alias

导入sql表

mysql> source  sql表的路径
eg:
mysql> source /root/myemployees.sql

相关文章:

MySQL之select查询

华子目录 SQL简介SQL语句分类SQL语句的书写规范SQL注释单行注释多行注释 select语句简单的select语句select的算数运算select 要查询的信息 from 表名;查询表字段查询常量查询表达式查询函数 查询定义别名as安全等于<>去重distinct连接字段concat 模糊查询运算符比较运算…...

Android MMKV 接入+ 替换原生 SP + 原生 SP 数据迁移

背景:项目中一直使用的是原生 SP,众所周知,使用原生 SP 存在卡顿性能问题。公司的性能监控平台抓到不少原生 SP 导致的 ANR 问题: java.io.FileDescriptor.sync (FileDescriptor.java) android.os.FileUtils.sync (FileUtils.java:256) android.app.SharedPreferencesImpl.…...

C#上位机与三菱PLC的通信07--使用第3方通讯库读写数据

1、通讯库介绍 mcprotocol 是一个基于 Node.js 的三菱 PLC MC 协议通信库&#xff0c;具有以下特点&#xff1a; 支持多种三菱 PLC MC 协议的设备&#xff0c;如 FX3U、Q03UDECPU、QJ71E71 等。 支持多种功能码和数据类型&#xff0c;如读取线圈&#xff08;M&#xff09;、…...

LiveGBS流媒体平台GB/T28181常见问题-基础配置流媒体服务配置中本地|内网IP外网IP(可选)外网IP收流如何配置

LiveGBS常见问题基础配置流媒体服务配置中本地|内网IP外网IP外网IP收流如何配置&#xff1f; 1、流媒体服务配置2、播放提示none rtp data receive3、多网卡服务器4、收流端口配置5、端口区间可以如何配置6、搭建GB28181视频直播平台 1、流媒体服务配置 LiveGBS中基础配置-》流…...

微服务- 熔断、降级和限流

基本介绍 在微服务架构中&#xff0c;由于服务之间的相互依赖性&#xff0c;任何一个服务的故障或性能问题都可能导致整个系统的不稳定。因此&#xff0c;熔断、降级和限流是三种常见的技术手段&#xff0c;用于提高系统的可用性和稳定性。 熔断 (Circuit Breaker) 熔断机制…...

电路设计(20)——数字电子钟的multism仿真

1.设计要求 使用数字芯片&#xff0c;设计一个电子钟&#xff0c;用数码管显示&#xff0c;可以显示星期&#xff0c;时、分、秒&#xff0c;可以有按键校准时间。有整点报警功能。 2.设计电路 设计好的multism电路图如下所示 3.芯片介绍 时基脉冲使用555芯片产生。在仿真里面…...

【论文阅读笔记】Contrastive Learning with Stronger Augmentations

Contrastive Learning with Stronger Augmentations 摘要 基于提供的摘要&#xff0c;该论文的核心焦点是在对比学习领域提出的一个新框架——利用强数据增强的对比学习&#xff08;Contrastive Learning with Stronger Augmentations&#xff0c;简称CLSA&#xff09;。以下…...

前端win10如何设置固定ip(简单明了)

1、右击这个 2、点击属性 3、双击协议版本4设置成以下就ok...

数据结构1.0(基础)

近java的介绍&#xff0c; 文章目录 第一章、数据结构1、数据结构 &#xff1f;2、常用的数据结构数据结构&#xff1f; 逻辑结构and物理结构 第二章、数据结构基本介绍2.1、数组&#xff08;Array&#xff09;2.2、堆栈&#xff08;Stack&#xff09;2.3、队列&#xff08;Que…...

anomalib1.0学习纪实-续2:三个文件夹

为了读懂程序&#xff0c;有三个最重要的文件夹&#xff0c;如下图&#xff1a; 正好对应四个类&#xff0c;如下图&#xff1a; 四个类的来源如下图所示&#xff1a; 注意&#xff0c;MVTec是个大类&#xff0c;里面用到了这里的第四个类MVTecDataset&#xff0c;代码如下。…...

【递归】【后续遍历】【迭代】【队列】Leetcode 101 对称二叉树

【递归】【后续遍历】Leetcode 101 对称二叉树 解法一&#xff1a; 递归&#xff1a;后序遍历 左右中解法二&#xff1a; 迭代法&#xff0c;用了单端队列 ---------------&#x1f388;&#x1f388;对称二叉树 题目链接&#x1f388;&#x1f388;------------------- 解法一…...

Nginx https反向代理

接前一篇文章&#xff0c;今天看看https的反向代理怎么配置。 生成自签名证书和私钥 要使用https&#xff0c;首先需要有证书和私钥&#xff0c;这里创建一个测试用的自签名证书和私钥。 使用 openssl 命令生成服务器私钥文件 openssl genrsa -out server.key 2048生成证书…...

zip解压缩

使用unzip库可以轻松解压zip文件&#xff0c;源码下载地址&#xff1a;http://www.codeproject.com/Articles/7530/Zip-Utils-clean-elegant-simple-C-Win #include <Windows.h> #include"unzip.h" SetCurrentDirectory("c:\\"); HZIP hz OpenZip(…...

电动五金工具行业调研:政策促进市场发展

五金工具可以分为建筑五金、日用五金和家居五金等&#xff0c;科技的不断进步下五金工具产品也在逐渐创新进步。在国家一系列政策下五金工具行业更加规范化&#xff0c;使用也更加符合安全要求。 五金工具行业是指生产铁锤、螺丝刀、扳手、钳子、卷尺等小型工具的产业。这些工具…...

【矩阵】托普利茨矩阵

每日一道算法题之托普利茨矩阵 一、题目描述二、思路三、C代码 一、题目描述 题目来源&#xff1a;LeetCode 给你一个 m x n 的矩阵 a 。如果这个矩阵是托普利茨矩阵&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 如果矩阵上每一条由左上到右下的对角线上…...

DS:八大排序之归并排序、计数排序

创作不易&#xff0c;感谢三连支持&#xff01;&#xff01; 一、归并排序 1.1 思想 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide andConquer&#xff09;的一个非常典型的应用。将已有序的子…...

由斐波那契数列探究递推与递归

斐波那契数列定义&#xff1a; 斐波那契数列大家都非常熟悉。它的定义是&#xff1a; 对于给定的整数 x &#xff0c;我们希望求出&#xff1a; f ( 1 ) f ( 2 ) … f ( x ) f(1)f(2)…f(x) f(1)f(2)…f(x) 的值。 有两种方法,分别是递推(迭代)与递归 具体解释如下图 备注…...

红队打靶练习:IMF: 1

目录 信息收集 1、arp 2、nmap 3、nikto 目录探测 gobuster dirsearch WEB 信息收集 get flag1 get flag2 get flag3 SQL注入 漏洞探测 脱库 get flag4 文件上传 反弹shell 提权 get flag5 get flag6 信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# a…...

密码管理局以及什么是密评?为什么要做密评(商用密码应用安全性评估)?

文章目录 密码管理局以及什么是密评?为什么要做密评?关于密码管理局国家密码管理局属于什么级别?什么是密评?密评发展史为什么要做密评?目前密码应用的几个问题密评对象不做“密评”或密评不合格有什么影响?如何才能顺利通过密评?密评的相关标准参考密码管理局以及什么是…...

六、Datax通过json字符串运行

Datax通过json字符串运行 一、场景二、代码实现 一、场景 制作一个web应用&#xff0c;在页面上配置一个json字符串&#xff0c;保存在数据库里面。在执行json的时候&#xff0c;动态在本地创建一个json文件后执行&#xff0c;并识别是否成功&#xff0c;将执行过程保存在数据…...

关于数据库

目录 一 什么是数据库&#xff08;DB) 二 什么是数据库管理系统(DBMS) 三 数据库的作用/好处 一 什么是数据库&#xff08;DB) 简单理解&#xff0c;数据库是存放数据的地方&#xff0c;就像冰箱是存放冷鲜食品的地方。 数据是数据存储的基本对象&#xff0c;而数据分为多…...

洛谷C++简单题小练习day14—闰年推算小程序

day14--闰年推算小程序--2.18 习题概述 题目描述 输入 x,y&#xff0c;输出 [x,y] 区间中闰年个数&#xff0c;并在下一行输出所有闰年年份数字&#xff0c;使用空格隔开。 输入格式 输入两个正整数 x,y&#xff0c;以空格隔开。 输出格式 第一行输出一个正整数&#xf…...

房企关注的典型数字化场景之一:数字营销

过去在增量时代下&#xff0c;房企的模式是“拿地-开发-卖房-拿地”&#xff0c;谁拿的地多、卖得快、利润高&#xff0c;谁“活得好”。而进入存量时代&#xff0c;加上政策调控影响&#xff0c;房企需要将核心竞争力转向精细化、多元化运营。 根据克而瑞数据统计&#xff0c…...

BMS再进阶(新能源汽车电池管理系统)

引言 一文入门BMS&#xff08;电池管理系统&#xff09;_bms电池管理-CSDN博客 BMS进阶&#xff08;Type-C、PD快充、充电IC、SOC算法、电池管理IC&#xff09;_充电ic asi aso功能-CSDN博客 本文是上面两篇博客的续篇&#xff0c;之前都是讲解一些BMS基本原理&#xff0c;…...

K8s Deployment挂载ConfigMap权限设置

目录 样例 1. 样例 …… volumes: - configMap:defaultMode: 420name: ${Existed_configmap_name} …… 其中“defaultMode: 420”是设置权限的 2. 解析 在K8s&#xff08;Kubernetes&#xff09;中&#xff0c;defaultMode是用来设置Configmap挂载后的文件权限&#xff0…...

百度智能云分布式数据库 GaiaDB-X 与龙芯平台完成兼容认证

近日&#xff0c;百度智能云的分布式关系型数据库软件 V3.0 与龙芯中科技术股份有限公司的龙芯 3C5000L/3C5000 处理器平台完成兼容性测试&#xff0c;功能与稳定性良好&#xff0c;获得了龙架构兼容互认证证书。 龙芯系列处理器 通用 CPU 处理器是信息产业的基础部件&#xf…...

模拟电子技术——振荡器基本原理、RC桥式振荡器、矩形波发生电器

文章目录 前言一、振荡器什么是振荡器振荡器的基本电路结构振荡条件起振条件和稳幅原理 二、RC桥式振荡器什么是RC桥式振荡器RC串并联网络的选频特性振荡条件完整频率特性曲线举例 三、矩形波发生电器什么是矩形波发生电路稳态与暂态PWM脉宽调制矩形波发生电路基本组成 总结 前…...

Vue3+Vite+TS+Pinia+ElementPlus+Router+Axios创建项目

目录 初始项目组成1. 创建项目1.1 下载项目依赖1.2 项目自动启动1.3 src 别名设置vite.config.ts配置文件tsconfig.json配置若新创项目ts提示 1.4 运行测试 2. 清除默认样式2.1 样式清除代码下载2.2 src下创建公共样式文件夹style2.3 main.js中引入样式2.4 安装sass解析插件 2.…...

VMware虚拟机安装CentOS7

对于系统开发来说&#xff0c;开发者时常会需要涉及到不同的操作系统&#xff0c;比如Windows系统、Mac系统、Linux系统、Chrome OS系统、UNIX操作系统等。由于在同一台计算机上安装多个系统会占据我们大量的存储空间&#xff0c;所以虚拟机概念应运而生。本篇将介绍如何下载安…...

Avalonia学习(二十四)-系统界面

目前项目式练习&#xff0c;界面内容偏多&#xff0c;所以不给大家贴代码了&#xff0c;可以留言交流。此次为大家展示的是物联项目的例子&#xff0c;仅仅是学习&#xff0c;我把一些重点列举一下。 界面无边框 以前的样例主要是通过实现控件来完成的&#xff0c;前面已经有窗…...