深入浅出MySQL的知识点,学习收藏必备!

Posted Javachichi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入浅出MySQL的知识点,学习收藏必备!相关的知识,希望对你有一定的参考价值。

1. DQL语言的学习

主要是用于对表的查询,而查询不会对数据库中的数据进行修改,只是一种显示数据的方式。这一章可以说是mysql重点的部分了。查询的关键字为:SELECT。

接下来的学习按层层渐进的方式。既然我们现在是来学习查询的操作,我们就得要有数据对吧,这里直接把数据先准备给大家吧,这里就可以不用来连插入修改其他的命令,主要是来练习查询的。这里准备的是我在尚硅谷网上视频中学习数据库的数据。非常感谢,我自己也学习得很深刻,讲解的也非常详细。本来是想直接把数据写在这里的,但是因为真的太长了。

进阶1. 基础查询

1.1 基础语法
  1. 先来看看它的语法吧:

    SELECT 查询列表(字段名1, 字段名2...) FROM 表名; 
    

    这个查询出来,其实有点类似Java中的System.out.println()打印到控制台一样。

    还有一个语法就是,如果我想查询表中所有的字段名,难道我们要一个一个手敲出来吗,当然不是啦。我们可

    以用*来查询表中所有的字段名,也就是查询所有。

    SELECT * FROM 表名; 
    
  2. 特点:

    • 查询列表可以是常量值、可以是表达式、可以是字段、可以是函数。

    • 我们查询完的结果 ,是一个虚拟的表格,不是真实存在。

  3. 接下来就进行实战操作吧:

    -- 1.查询表中的单个字段
    SELECT `name` FROM beauty; 
    -- 这里的name是关键字,但是也被我们用来做字段,虽然可以执行,但是我们可以通过加``这个符号,避免歧义。
    
    -- 2.查询表中的多个字段
    SELECT `name` , sex FROM beauty;
    
    -- 3.查询表中的所有字段
    SELECT * FROM beauty; 
    

  4. 这里需要注意的一个细节:

    因为有些字段它可能是MySQL中的关键字,我们可以为了避免歧义,可以加上``这个字符即:`name`

  5. 除了查询字段,还可以查询常量值、表达式、函数。

    #4.查询常量值
    SELECT 100;
    SELECT 'john';
     
    #5.查询表达式
    SELECT 100%98;
     
    #6.查询函数
    SELECT VERSION(); 
    

    这里就不显示结果,自己尝试一下就可以得到结果啦。

1.2 起别名

为什么要起别名呢,因为有些字段它有可能重名情况,这里就可以起别名来区分啦。

  1. 语法:

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

    注意: 这里的关键字AS可以省略,但是其中的空格一定要有,不要就会报错。

  2. 特点:

    • 查询时给列、表指定别名需要使用AS关键字。

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

    • 如果要查询的字段有重名的情况,使用别名可以区分开来。

  3. 演示一下:

    -- 原来的查询
    SELECT last_name, first_name FROM employees;
    -- 使用 AS起别名
    SELECT last_name AS 姓, first_name AS 名 FROM employees;
    -- 省略AS,空格不能省略
    SELECT last_name 姓, first_name 名 FROM employees; 
    

1.3 去重

如果我们查询的数据有一堆重复值,这个时候我们就可以消除重复值,关键字:DISTINCT

  • 语法:

    SELECT DISTINCT 字段名 FROM 表名; 
    
  • 演示下:

    -- 查询员工表中涉及到的所有的部门编号
    SELECT department_id FROM employees;
    SELECT DISTINCT department_id FROM employees; 
    

1.4 查询结果参加运算

我们查询得到的结果也可以来参加运算。

  • 语法:

    -- 某列数据和固定值运算
    SELECT 字段名 + 值 FROM 表名;
    
    -- 某列数据和其他列数据参与运算
    SELECT 字段1 + 字段2 FROM 表名;
    
    -- 直接运算
    SELECT 值 + 值; 
    
  • 运算符中+特点:

    1. 如果两个操作数都为数值型,则做加法运算。

    2. 只要其中一方为字符型,试图将字符型数值转换成数值型,其中如果转换成功,则继续做加法运算,如果转换失败,则将字符型数值转换成0

    3. 只要其中一方为NULL,则结果肯定为NULL。

  • 演示下吧:

    -- 某列数据和固定值运算
    SELECT lowest_sal + 20 FROM job_grades;
    
    -- 某列数据和其他列数据参与运算
    SELECT lowest_sal + highest_sal FROM job_grades;
    
    -- 直接运算
    -- 如果两个操作数都为数值型,则做加法运算。
    SELECT 90 + 10;
    
    -- 只要其中一方为字符型,试图将字符型数值转换成数值型,
    -- 其中如果转换成功,则继续做加法运算,
    SELECT '99' + 88 ;
    -- 如果转换失败,则将字符型数值转换成0
    SELECT 'hello' + 100;
    
    -- 只要其中一方为null,则结果肯定为null
    SELECT NULL + 100; 
    

进阶2:条件查询

前面我们的查询都是将所有数据都查询出来,但是有时候我们只想获取到满足条件的数据。

2.1 基础语法

在原来查询语法基础加上关键词WHERE

  • 语法:

    SELECT 查询列表 FROM 表名 WHERE 筛选条件; 
    

    那这个筛选条件怎么写呢?它可以有以下分类:

    1. 按条件表达式筛选

      简单条件运算符:> < = != <> >= <=

    2. 按逻辑表达式筛选

      逻辑运算符:&& || ! and or not

    3. 模糊查询:

    like between and in is null

    怎么使用呢,接下来就详细讲解。

2.2 条件表达式筛选

比较运算符:

  • > < = :大于,小于,等于。
  • != <> :这两个都是不等于。
  • >= <=:大于等于, 小于等于。

演示一下:

-- 查询工资>12000的员工名和工资
SELECT last_name 员工名, salary 工资 FROM employees 
WHERE salary > 12000;

-- 查询部门编号不等于90号的员工名和部门编号
SELECT last_name 员工名, department_id 部门编号 FROM employees 
WHERE department_id <> 90;
SELECT last_name 员工名, department_id 部门编号 FROM employees 
WHERE department_id != 90;

-- 查询员工编号<=110 的员工名和员工编号
SELECT last_name 员工名, employee_id 员工编号 FROM employees 
WHERE employee_id <= 110; 

2.3 逻辑表达式筛选
  • && and :多个条件同时满足。
  • || or:多个条件其中一个满足。
  • ! not:不满足。
  • 一般我们都是用 and or not比较多。

演示一下:

-- 查询工资z在10000到20000之间的员工名、工资
SELECT last_name 员工名, salary 工资 FROM employees
WHERE salary >= 10000 AND salary <= 20000;
SELECT last_name 员工名, salary 工资 FROM employees
WHERE salary >= 10000 && salary <= 20000;

-- 查询工资低于10000,或者工资高于20000的员工名、工资
SELECT last_name 员工名, salary 工资 FROM employees
WHERE salary <= 10000 OR salary >= 20000;
SELECT last_name 员工名, salary 工资 FROM employees
WHERE salary <= 10000 || salary >= 20000;

-- 查询员工编号不是在100和150之间的员工名、员工编号
SELECT last_name 员工名, employee_id 员工编号 FROM employees
WHERE NOT(employee_id >= 100 AND employee_id <= 150);
SELECT last_name 员工名, employee_id 员工编号 FROM employees
WHERE !(employee_id >= 100 && employee_id <= 150); 

2.4 模糊查询
2.4.1 like关键字
  • LIKE:通常与两个通配符一起使用:

    • % :任意多个字符,包含0 个字符

    • _ :任意单个字符

  • 语法:

    SELECT 查询列表 FROM 表名 WHERE 字段名 LIKE '通配符字符串'; 
    
  • 具体演示下:

    -- 查询员工名中以字符a开头的员工名
    SELECT last_name 员工名 FROM employees
    WHERE last_name LIKE 'a%';
    
    -- 查询员工名中以字符a结尾的员工名
    SELECT last_name 员工名 FROM employees
    WHERE last_name LIKE '%a';
    
    -- 查询员工名中包含字符a的员工名
    SELECT last_name 员工名 FROM employees
    WHERE last_name LIKE '%a%';
    
    -- 查询员工名中第三个字符为s,第五个字符为i的员工名和工资
    SELECT last_name 员工名, salary 工资 FROM employees
    WHERE last_name LIKE '__s_i%';
    
    -- 查询员工名中第二个字符为_的员工名
    /*
    这里有个难点就是_这个不是通配符吗,那可以直接使用吗,当然是不行的
    所以我们也就需要到转义符,如Java一样可以使用\\来转义。
    MySQL 有个特有的方式 即 定义一个字符 后面加上关键字ESCAPE 然后定义 '字符'。
    */
    SELECT last_name 员工名, salary 工资 FROM employees
    WHERE last_name LIKE '_$_%' ESCAPE '$'; 
    

    注意:如果我们需要查找的字符包含了我们的通配符类似等,那我们可以使用转义字符:

  • 如Java一样可以使用\\来转义。

    • MySQL有个特有的方式 即 定义一个字符 后面加上关键字ESCAPE 然后定义字符。如上面所示。

2.4.2 between and 关键词
  • between and:包含临界值并且,两个临界值不要调换顺序。

  • 直接演示下:

    -- 查询员工编号在100120之间的员工信息
    SELECT * FROM employees
    WHERE employee_id BETWEEN 100 AND 120;
    
    -- 错误,不会报错,但是没有结果。
    SELECT * FROM employees
    WHERE employee_id BETWEEN 120 AND 100; 
    

2.4.3 in 关键词
  • inin列表的值类型必须一致或兼容,而且in列表中不支持通配符。

  • 直接演示下:

    -- 查询员工的工种编号是 IT_PROG、AD_VP、AD_PRES中的一个员工名和工种编号
    SELECT last_name, job_id FROM employees
    WHERE job_id IN( 'IT_PROT' ,'AD_VP','AD_PRES'); 
    

2.4.3 is null 关键词
  • is nul

    因为=<>不能用于判断NULL值,而我们可以使用 is nulis not nul来判断NULL值。

  • 直接演示下:

    -- 查询没有奖金的员工名和奖金率
    SELECT last_name 员工名, commission_pct 奖金率 FROM employees
    WHERE commission_pct IS NULL;
    
    -- 查询有奖金的员工名和奖金率
    SELECT last_name 员工名, commission_pct 奖金率 FROM employees
    WHERE commission_pct IS NOT NULL; 
    

进阶3:排序查询

我们发现我们查询出来的可能是无序,那我们可以把查出来的表按一定规则排序。排序关键词: ORDER BY

  • 语法:

    SELECT 查询列表 FROM 表名【where  筛选条件】ORDER BY 字段名 ASC|DESC; 
    
  • 特点:

    1. ASC代表的是升序,可以省略,而DESC代表的是降序。

    2. ORDER BY子句可以支持 单个字段(单列)、别名、表达式、函数、多个字段(多列)。

    3. ORDER BY子句在查询语句的最后面,除了limit子句。这个后面再讲。

  • 实战演示下:

    单个字段中的排序即单列排序:

    -- 按单个字段排序(单列排序)
    -- 查询员工名和工资,并按工资降序
    SELECT last_name, salary 
    FROM employees
    ORDER BY salary DESC;
    -- 添加筛选条件再排序
    -- 查询部门编号>=90的员工名、员工编号,并按员工编号降序
    SELECT last_name, employee_id
    FROM employees
    WHERE employee_id >= 90
    ORDER BY employee_id;
    -- 按表达式排序
    -- 查询员工名、工资、年薪 按年薪降序
    -- 年薪= salary*12*(1+IFNULL(commission_pct,0))
    SELECT last_name, salary, salary*12*(1+IFNULL(commission_pct,0)) 年薪
    FROM employees
    ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;
    -- 按别名排序
    -- 查询员工名、工资、年薪 按年薪升序 
    SELECT last_name, salary, salary*12*(1+IFNULL(commission_pct,0)) 年薪
    FROM employees
    ORDER BY 年薪 ASC;
    -- 按函数排序
    -- 查询员工名、名字的长度,并且按名字的长度降序
    -- 长度的函数是length() 函数后面会详细介绍
    SELECT last_name, LENGTH(last_name) 长度
    FROM employees
    ORDER BY LENGTH(last_name) ASC; 
    

    上面演示的都是单个字段中排序,那我们要是排序后,排序列中出现了相同的字段,那其他列不按正常排序怎么办?那我们可以多字段,多列排序吗?不用想,当然。

    那具体怎么操作呢:

    -- 按多个字段排序(多列排序)
    -- 查询员工名和工资,要求先按工资降序,再按员工名升序
    SELECT last_name, salary
    FROM employees
    ORDER BY salary DESC, last_name ASC; 
    

进阶4:常见函数

包含了MySQL中函数,分为单行函数和分组函数(聚合函数、统计函数、组函数)

4.1 单行函数
4.1.1 分类

单行函数可以分为:

  • 字符函数
  • 数学函数
  • 日期函数
  • 其他函数
  • 高级函数(控制语句)

具体内容往下一起看吧:

4.1.2 字符函数

常见的字符函数:

函数描述
LENGTH获取字节个数(utf-8一个汉字代表3个字节,gbk为2个字节)
CHAR_LENGTH返回字符串的字符数
CONCAT拼接字符串
SUBSTR截取字符串
INSTR返回子串第一次出现的索引,如果找不到返回0
TRIM去前后空格,或者可以去前后指定字符
UPPER、LOWER将字母变变大写或者变小写
LPAD、RPAD用指定的字符实现(左或右)填充指定长度
REPLACE将字符串中的源字符串换成新的字符串

演示一下:

-- length:获取字节个数(utf-8一个汉字代表3个字节,gbk为2个字节)
SELECT LENGTH('hello'); -- 5
SELECT LENGTH('中国'); -- 6

-- char_length:返回字符串的字符数
SELECT CHAR_LENGTH('hello');-- 5
SELECT CHAR_LENGTH('中国');-- 2

-- concat:拼接字符串
SELECT CONCAT(last_name, '_', first_name) 姓名
FROM employees;

-- substr:截取
-- 注意:MySQL的索引是从1开始
-- 截取从指定索引处后面所有字符
SELECT SUBSTR('小龙女和杨过', 5); -- 杨过
-- 截取从指定索引处指定字符长度的字符
SELECT SUBSTR('小龙女和杨过', 1, 3); -- 小龙女

-- instr:返回子串第一次出现的索引,如果找不到返回0
SELECT INSTR('小龙女和杨过', '龙女'); -- 2
SELECT INSTR('龙女小龙女和杨过', '龙女'); -- 1
SELECT INSTR('龙女小龙女和杨过', '龙男'); -- 0 找不到返回0

-- trim:去前后空格,或者可以去前后指定字符
SELECT CHAR_LENGTH('   北极星   ');  -- 9
SELECT CHAR_LENGTH(TRIM('   北极星   ')); -- 3
-- 可以去前后指定字符
SELECT TRIM('a' FROM 'aaa北aa极星aaa');-- 北aa极星 中间的没有去掉

-- upper、lower:变大写,变小写
SELECT UPPER('hello');-- HELLO
SELECT LOWER('heLLo');-- hello

-- lpad、rpad :用指定的字符实现左|右填充指定长度
SELECT LPAD('hello', 10, 'a'); -- aaaaahello
SELECT RPAD('hello', 10, 'ab'); -- helloababa 只到10个字符。
-- 测试没有超出本来字符的呢
SELECT LPAD('hello', 2, 'a');  -- he  截断
SELECT RPAD('hello', 3, 'ab'); -- hel 截断

-- replace: 将字符串中的源字符串换成新的字符串
SELECT REPLACE('杨过和小龙女和杨过', '杨过', '我'); -- 我和小龙女和我 

需要注意的

MySQL的索引是从1开始。

4.1.3 数学函数

常见的数学函数:

函数描述
ROUND四舍五入
RAND返回 0 到 1 的随机数
CEIL向上取整,返回>=该参数的最小整数
FLOOR向下取整,返回<=该参数的最大整数
TRUNCATE截断
MOD取余

演示一下:

-- round:四舍五入
SELECT ROUND(1.65); -- 2
SELECT ROUND(1.45); -- 1

-- rand :返回 01 的随机数
SELECT RAND(); -- 0.6992990986437528  不是固定的

-- ceil:向上取整,返回>=该参数的最小整数
SELECT CEIL(1.2); -- 2
SELECT CEIL(1.6); -- 2

-- floor:向下取整,返回<=该参数的最大整数
SELECT FLOOR(1.2); -- 1
SELECT FLOOR(1.6); -- 1

-- truncate:截断
SELECT TRUNCATE(1.8999, 1); -- 1.8
SELECT TRUNCATE(RAND(), 1); -- 0.9 

-- mod:取余
SELECT MOD(10, 3); -- 1 
4.1.4 日期函数

常见的日期函数:

函数描述
NOW返回当前系统日期+时间
CURDATE返回当前系统日期,不包含时间
CURTIME返回当前时间,不包含日期
DATEDIFF计算两个日期相差的天数
YEAR、MONTH、MONTHNAME
DAY、HOUR、MINUTE、SECOND获取指定的部分,年、月、日、小时、分钟、秒
STR_TO_DATE将字符通过指定的格式转换成日期
DATE_FORMAT将日期转换成字符

演示一下:

-- now:返回当前系统日期+时间
SELECT NOW();

-- curdate:返回当前系统日期,不包含时间
SELECT CURDATE();

-- curtime:返回当前时间,不包含日期
SELECT CURTIME();

-- datediff : 计算两个日期相差的天数
SELECT DATEDIFF('2020-01-01', '1988-01-01');
SELECT DATEDIFF('1988-01-01', '2020-01-01');

-- 可以获取指定的部分,年、月、日、小时、分钟、秒
-- year:获取指定的年
SELECT YEAR(NOW());
SELECT YEAR('2020-02-02');
-- month:获取指定的月
SELECT MONTH(NOW());
-- monthname:获取指定的月英文单词
SELECT MONTHNAME(NOW());
-- day:获取指定的天
SELECT DAY(NOW());
-- hour:获取指定的小时
SELECT HOUR(NOW());
-- minute:获取指定的分钟
SELECT MINUTE(NOW());
-- second:获取指定的秒
SELECT SECOND(NOW());

-- str_to_date:将字符通过指定的格式转换成日期
SELECT STR_TO_DATE('2020-02-02', '%Y-%m-%d');
SELECT STR_TO_DATE('02/02 2020', '%m/%d %Y');

-- date_format:将日期转换成字符
SELECT DATE_FORMAT('2020-02-02', '%Y年%m月%d日');
SELECT DATE_FORMAT(NOW(), '%y年%c月%d日');
SELECT DATE_FORMAT(NOW(), '%m-%d %Y'); 

注意

在使用str_to_datedate_format这两个日期函数的时候,第二个参数定义的格式为:

4.1.5 其他函数

常见的其他函数:

函数描述
version返回当前MySQL的版本
database返回当前使用的数据库
user返回当前使用的用户

演示一下:

-- version:返回当前MySQL的版本
SELECT VERSION(); -- 5.5.40

-- database:返回当前使用的数据库
SELECT DATABASE(); -- data_test

-- user:返回当前使用的用户
SELECT USER(); -- root@localhost 
4.1.6 高级函数(控制函数)
  1. if函数:可以相当于if else的效果。

    • 语法:

      IF(条件, '条件成立返回的值', '条件不成立返回的值') 
      
    • 演示下:

      SELECT IF(66>88, '大', '小'); ---- 查询工资大于20000的员工名,显示哎呦不错呦,否则显示我觉得不行,请继续加油
      SELECT last_name,
      IF(salary > 20000, '哎呦不错呦', '我觉得不行,请继续加油')
      FROM employees; 
      
  2. case函数:case函数有两种用法:

    • 方式1:可以相当于switch case的效果。

      • 语法:

        select 字段名1, 字段名2, case 要判断的字段或表达式
        when 值1 then 返回的值
        when 值2 then 返回的值
        ...
        else 要显示的值n或语句n;
        end  别名 
        
      • 用法:

        /*查询员工的工资,要求
        部门号=30,显示的工资为2倍
        部门号=40,显示的工资为3倍
        部门号=50,显示的工资为4倍
        其他部门,显示的工资为原工资
        */
        SELECT salary 原始工资,department_id,
        CASE department_id
        WHEN 30 THEN salary*2
        WHEN 40 THEN salary*3
        WHEN 50 THEN salary*4
        ELSE salary
        END 新工资
        FROM employees; 
        
    • 方式2:可以相当于多重if的效果。

      • 语法:

        select 字段名1, 字段名2, case 
        when 判断条件1 then 要显示的值1或语句1
        when 判断条件2 then 要显示的值2或语句2
        ...
        else 要显示的值n或语句n
        end 
        
      • 用法:

        /*查询员工的工资的情况
        如果工资>20000,显示哎呦不错了
        如果工资>15000,显示很可以了
        如果工资>10000,显示太棒了
        否则,显示请继续加油
        */
        SELECT salary,
        CASE 
        WHEN salary > 20000 THEN '哎呦不错了'
        WHEN salary > 15000 THEN '很可以了'
        WHEN salary > 10000 THEN '太棒了'
        ELSE '请继续加油'
        END 工资描述
        FROM employees; 
        
4.2 分组函数(聚合函数)

分组函数实际上查询是纵向查询,它是对一列的值进行计算,然后返回一个结果值。另外分组函数会忽略空值NULL。

4.2.1 五个分组函数

函数描述
COUNT统计指定列记录数,记录为NULL的不统计
SUM计算指定列的数值和,如果不是数值类型,那么计算结果为0
AVG计算指定列的平均值
MAX、MIN计算指定列的最大值
4.2.2 特点
  1. 以上五个分组函数都可以忽略NULL值。

  2. sumavg一般用于处理数值型,maxmincount可以处理任何数据类型。

  3. 都可以搭配distinct使用,用于统计去重后的结果。

  4. count的参数可以支持:字段、*、常量值:一般放1

4.2.3 用法
-- 1、简单使用
SELECT SUM(salary) 总和,AVG(salary) 平均,MAX(salary) 最高,MIN(salary) 最低,COUNT(salary) 个数
FROM employees; -- 691400.006461.68224324000.002100.00107

-- 2、参数支持哪些类型
SELECT SUM(last_name), AVG(last_name) FROM employees; -- 0 , 0
SELECT SUM(hiredate), AVG(hiredate) FROM employees; -- 虽然都不会报错,但是没有什么意义

SELECT MAX(last_name),MIN(last_name) FROM employees;-- Zlotkey, Abel
SELECT MAX(hiredate),MIN(hiredate) FROM employees;-- 2016-03-03 00:00:00, 1992-04-03 00:00:00

SELECT COUNT(commission_pct) FROM employees; -- 35 
SELECT COUNT(last_name) FROM employees;  -- 107 

-- 3、是否忽略null
SELECT commission_pct FROM employees; -- 此行有包含null值
SELECT COUNT(commission_pct) FROM employees; -- 35  忽略了null值
SELECT MAX(commission_pct) ,MIN(commission_pct) FROM employees; -- 0.400.10 忽略了null值
SELECT SUM(commission_pct) ,AVG(commission_pct), SUM(commission_pct)/35, SUM(commission_pct)/107 --  忽略了null值
FROM employees; -- 7.800.2228570.2228570.072897

-- 4、和distinct搭配
SELECT salary FROM employees;  -- 此行有包含重复值
SELECT SUM(DISTINCT salary),SUM(salary) FROM employees; -- 397900.00691400.00
SELECT COUNT(DISTINCT salary),COUNT(salary) FROM employees; -- 57107

-- 5、count函数的详细介绍
SELECT COUNT(salary) FROM employees; -- 107
SELECT COUNT(*) FROM employees;-- 107
SELECT COUNT(1) FROM employees;-- 107
SELECT COUNT(commission_pct) FROM employees; -- 35 不记录为null

-- 6、和分组函数一同查询的字段有限制
SELECT employee_id FROM employees; -- 多行
SELECT AVG(salary),employee_id  FROM employees; -- 6461.682243, 100 只显示一行。 

注意:

  1. count(*)一般用于统计个数,相对于参数写字段的话,因为字段可能有时候里面会有NULL,所以不会

    以上是关于深入浅出MySQL的知识点,学习收藏必备!的主要内容,如果未能解决你的问题,请参考以下文章

    超硬核学习手册系列3事务视图篇——深入浅出MySQL的知识点,学习收藏必备

    #导入MD文档图片#超硬核学习手册系列2查询篇——深入浅出MySQL的知识点,学习收藏必备

    万字长文超硬核详细学习系列——深入浅出Linux基础篇的知识点,值得你收藏学习必备

    万字长文超硬核详细学习系列——深入浅出Linux高级篇的知识点,值得你收藏学习必备

    编程入门必备一大知识点,精心准备的程序员必备专用几百个英语词汇(建议收藏)

    13 个 Python 必备的知识,建议收藏!