数据库-Mysql使用学习笔记(命令行及图形化界面)_mysql图形化界面

连接本地Mysql

注:由于-u -h选项可以加空格后再加内容,但-p后不能加空格,所以博主干脆都不加了。

SQL语句

介绍

SQL语言不是Mysql独有的,sqlserver、Oracle也是使用SQL语言,但有一些区别,Mysql中特有的有LIMIT、show databases等。以分号结尾,不区分大小写!!!

分类
  • DDL(Data Definition Language,数据定义语言) - Create、Alter、Drop 这些语句自动提交,无需用Commit提交。
  • DQL(Data Query Language,数据查询语言) - Select 查询语句不存在提交问题。
  • DML(Data Manipulation Language,数据操纵语言) - Insert、Update、Delete 这些语句需要Commit才能提交。
  • DTL(事务控制语言) - Commit、Rollback 事务提交与回滚语句。
  • DCL(Data Control Language,数据控制语言) - Grant、Revoke 授予权限与回收权限语句。也有称TCL。
自带表介绍
  • information_schema
  • performance_schema
  • mysql
  • test

在Mysql注入点知识讲了表Information_schema,有一些用户、表、列的数据,在注入后可以获得。

注释

注释分为行注释、行中间注释和多行注释

这个注释直到该行结束

– 这个注释直到该行结束

/* 这是一个在行中间的注释 */

/*
这是一个
多行注释的形式
*/

数据库的添加与删除

mysql命令

  • show:展示数据库、表等,例如,show databases; show tables;
  • use:使用哪个数据库等,例如,use test;
  • source: 导入数据,执行sql脚本文件

命令行

create database lady_killer9;

创建数据库并导入数据

show create database lady_killer9;

查看创建数据库的语句

可以看到使用字符集utf8

lady_killer9.sql脚本可从本文后面的资源一节下载。

缺点:sql脚本路径不能含中文

删除数据库

mysql> drop database lady_killer9;
Query OK, 3 rows affected (0.11 sec)

图形化

新建查询->输入sql语句->运行即可

创建数据库

重连一下即可看见创建的数据库

也可这样创建数据库

MySQL连接右键

字符集选择utf8

选择数据库->运行SQL文件

路径可以含中文

运行成功

刷新即可看见表

接下来就看看表的创建,Navicat 中运行SQL语句不再赘述,之后的图形化只会展示非SQL语句运行方式

表的添加与删除
  • DEPT             部门表
  • EMP              员工表
  • SALGRADE  工资等级表

以EMP表为例,sql语句如下:

CREATE TABLE EMP
       (EMPNO int(4)  not null ,
	ENAME VARCHAR(10),
	JOB VARCHAR(9),
	MGR INT(4),
	HIREDATE DATE  DEFAULT NULL,
	SAL DOUBLE(7,2),
	COMM DOUBLE(7,2),
	primary key (EMPNO),
	DEPTNO INT(2) 
	);

命令行:

mysql> use lady_killer9;
Database changed
mysql> show tables;
±-----------------------+
| Tables_in_lady_killer9 |
±-----------------------+
| dept                   |
| emp                    |
| salgrade               |
±-----------------------+
3 rows in set (0.00 sec)

mysql> drop table emp;

mysql> CREATE TABLE EMP(
    -> EMPNO int(4) not null,
    -> ENAME VARCHAR(10),
    -> JOB VARCHAR(9),
    -> MGR INT(4),
    -> HIREDATE DATE DEFAULT NULL,
    -> SAL DOUBLE(7,2),
    -> COMM DOUBLE(7,2),
    -> primary key (EMPNO),
    -> DEPTNO INT(2)
    -> );
Query OK, 0 rows affected (0.04 sec)

desc 查看表结构

图形化

删除表

删除表左侧按钮,新建表

创建表EMP

点击添加字段来新建一行,

输入名,选择类型,输入长度,为浮点数的话输入小数点位数,点击不是null选框插入该字段时不能为空,键代表主键,注释可不写也可写名的中文含义等

下方为默认值,可不填,也可根据需要,对应DEFAULT

点击保存,输入表名,点击确定即可

右键设计表,查看表结构

表的字段含义

emp表

  • EMPNO         员工编号
  • EMPNAME   员工名
  • JOB              工作岗位
  • MGR             上级领导
  • HIREDATE    入职日期
  • SAL               薪资
  • COMM          津贴
  • DEPTNO      部门编号

dept表

  • DEPTNO  部门编号
  • DNAME    部门名称
  • LOC          部门位置

salgrade表

  • GRADE     薪资等级
  • LOSAL      最低工资
  • HISAL       最高工资
查询语法

SELECT
    [ALL | DISTINCT | DISTINCTROW ]
      [HIGH_PRIORITY]
      [STRAIGHT_JOIN]
      [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
      [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
    select_expr [, select_expr …]
    [FROM table_references
      [PARTITION partition_list]
    [WHERE where_condition]
    [GROUP BY {col_name | expr | position}
      [ASC | DESC], … [WITH ROLLUP]]
    [HAVING where_condition]
    [ORDER BY {col_name | expr | position}
      [ASC | DESC], …]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]
    [PROCEDURE procedure_name(argument_list)]
    [INTO OUTFILE ‘file_name’
        [CHARACTER SET charset_name]
        export_options
      | INTO DUMPFILE ‘file_name’
      | INTO var_name [, var_name]]
    [FOR UPDATE | LOCK IN SHARE MODE]]

基础查询

SELECT〈目标列组〉
     FROM〈数据源〉

简单来说,就是从哪些表查什么条件的数据,查多少条,查到后怎么分组,怎么排序,是否将数据保存到文件

最简单的,从某表查询所有数据

select * from emp;

某表查询所有数据

添加目标列,例如,查员工名,及年薪。

select ENAME,SAL * 12 from EMP;

由于一般情况下,项目的瓶颈是数据库,所以会查出数据后使用项目的编程语言来进行处理,不会直接乘12这种。

重命名,使用关键字AS,也可省略。

select ENAME as 员工名,SAL * 12 as 年薪 from EMP;

建议: 出现’员工名’、‘年薪’这种,可使用单引号,虽然也可以使用双引号,但是sqlserver、Oracle都是使用的单引号,所以统一一下,学习其他数据库的时候就简单点。

读者自行尝试:

select ENAME ‘员工名’,SAL * 12 ‘年薪’ from EMP;

条件查询

根据条件进行筛选。

SELECT〈目标列组〉
     FROM〈数据源〉
     [WHERE 条件1 [AND [OR]] 条件2 …]

设A为10、B为20。

操作符

操作符描述实例
=等号,检测两个值是否相等,如果相等返回true(A = B) 返回false。
<>, !=不等于,检测两个值是否相等,如果不相等返回true(A != B) 返回 true。
>大于号,检测左边的值是否大于右边的值, 如果左边的值大于右边的值返回true(A > B) 返回false。
<小于号,检测左边的值是否小于右边的值, 如果左边的值小于右边的值返回true(A < B) 返回 true。
>=大于等于号,检测左边的值是否大于或等于右边的值, 如果左边的值大于或等于右边的值返回true(A >= B) 返回false。
<=小于等于号,检测左边的值是否小于或等于右边的值, 如果左边的值小于或等于右边的值返回true(A <=B) 返回 true。
between A and B>= and <=between A and B [A,B]区间的都可以
is   null为空where emo is null
in在,一般后加数值元组in (10,20)
not取非,用于is null 或 in中is not null,不为空;not in 不在
like模糊查询,支持%和下划线匹配like %张_

查询工资大于等于2000的员工名字

select ename from emp where sal >= 2000;

查询工资在1100到5000的员工名及工资,包含1100和5000

select ename,sal from emp where sal between 1100 and 5000;

between and 适合某值在闭区间中

查询津贴为NULL的员工名,工资和津贴

select ename,sal,comm from emp where comm is null;

在前面查询这个表所有信息的时候,TURNER的津贴为0.00,注意,数据库中null表示有或没有,不能当做数值使用"="等操作符,0.00可以认为是有津贴,但是员工犯错误,扣光了。

查询津贴扣光或没有津贴的可以这样写

select ename,sal,comm from emp where comm is null or comm = 0.00;

select ename,sal,comm from emp where comm > 0.00;

读者自行尝试,不再截图。

查询薪资大于1000并且部门编号为20或30的员工名,薪资,部门编号

select ename,sal,deptno from emp where sal>1000 and deptno=20 or deptno=30;

看似没有问题,但是实际查询的是薪资大于1000并且部门编号为20的员工,以及部门编号为30的所有员工。原因是and的优先级高于or, sal>1000和deptno=20两个条件合并了。

可以通过加小括号的方式来进行限制,括号的优先级最高。

select ename,sal,deptno from emp where sal>1000 and (deptno=20 or deptno=30);

**in 等同于 or,**in 后面加的是等于多少的值所构成的数值元组,也可解决上面的问题

select ename,sal,deptno from emp where sal>1000 and deptno in (20,30);

select ename,sal,deptno from emp where sal>1000 and deptno in (20,30);

not in 就是不在元组中

模糊查询like

  • %:任意多个
  • _:任意一个

查询名字中包含O的员工名

select ename from emp where ename like ‘%O%’;

查询名字第二个字母是’A’的员工名

select ename from emp where ename like ‘_A%’;

如果查找名字中含下划线或百分号的,可以使用转义字符 ‘’

select ename from emp where ename like ‘%\_%’;

当然,本数据表里面没有,以后碰到了记得使用转义字符即可。

排序查询

SELECT〈目标列组〉
     FROM〈数据源〉
     [WHERE 条件1 [AND [OR]] 条件2 …]
     [ORDER BY {列名 | 表达式 | 位置}

查询工作岗位是 'MANAGER’的员工,并按工资升序排列

select * from emp where job = ‘MANAGER’ order by sal;

默认升序,需要降序添加关键字 desc 即可。 使用asc是升序,你可以像我一样省略。

多条件,逗号隔开,先按前,再按后。

查询员工姓名和工资,并按工资升序排列,如果工资相同,按名字降序排列。

select ename,sal from emp order by sal,ename desc;

位置,按结果的第几列排序,健壮性太差,位置一换就不行了,尽量不用。

select ename,sal from emp order by 2;

分组查询

SELECT〈目标列组〉
     FROM〈数据源〉
     [WHERE 条件1 [AND [OR]] 条件2 …]
     [ORDER BY {列名 | 表达式 | 位置}
     [GROUP BY {列名 | 表达式 | 位置}
     [HAVING  条件子句]

分组函****数

  • count 计数
  • sum 求和
  • avg 平均值
  • max 最大值
  • min 最小值

分组函数自动忽略null

查询津贴有几种情况

select count(comm) from emp;

从前面可以看到,comm除了null还有四个。

当出现group by时,select 之后只能加分组字段以及分组函数

数据错误

按多个字段分组

查询每个部门不同工作岗位的最高薪资

select deptno,job,max(sal) from emp group by deptno,job;

分组函数不可直接使用在where子句中

查询工资高于平均工资的员工的名字和工资。

select ename,sal from emp where sal > avg(sal);

解决办法见子查询一节

查询每个工作岗位的最高薪资

select max(sal) from emp group by job;

分组函数在分组之后运行,先按job分组,之后再算每一组的最大值。

having 分组后的数据再次过滤

查询每个部门最高薪资,仅显示大于2900的部门编号及最大薪资。

select deptno,max(sal) from emp group by deptno having max(sal) > 2900;

运行顺序:

from 子句 -> where 子句 -> group by 子句 ->having子句 -> select列 子句 -> order by 子句

where 和having的选择

having的效率是比较低的

select deptno,max(sal) from emp where sal > 2900 group by deptno;

上面也可以完成“查询每个部门最高薪资,仅显示大于2900的部门编号及最大薪资”, 而且where子句在 group by 子句前执行,过滤掉后再进行分组时会少写数据,但是having是在分组之后再运行。

所以,能用where优先使用where,不行再使用having

查询每个部门平均薪资,仅显示大于2900的部门编号及平均薪资

select deptno,avg(sal) from emp group by deptno having avg(sal) > 2900;

where子句是无法办到的,原因还是执行顺序。

去重

除了分组,还可以使用关键字 distinct 来进行去重。

select distinct job from emp;

注:distinct只能出现在所有字段的最前方,多个字段则表示后面所有字段看做合并字段进行去重。

连接查询

为防止数据冗余,会将有关系的数据放在不同的表中,表之间有关系,这也是关系型数据库的由来。

内连接

等值连接

连接条件是等量关系

查询每个员工的员工名和所在部门名

select e.ename,d.dname from emp e,dept d where e.deptno = d.deptno;

以上为92年的SQL语法,现在多使用92年的SQL语法,使用join on进行表连接

select e.ename,d.dname from emp e join dept d on e.deptno = d.deptno;

请读者自行尝试。

非等值连接

连接条件是非等值关系

查找每个员工的工资等级,显示员工名,薪资,薪资等级

select e.ename,e.sal,s.grade from emp e join salgrade s on  e.sal between s.losal and hisal;

自连接

自己连自己

查询员工的上级领导,显示员工名、领导名(不必查出所有员工)

select e.ename,m.ename from emp e join emp m on e.mgr = m.empno;

注:join前省略了inner,读者可自行尝试

外连接

分为主表和副表,主要主表中的数据全部查询出来,当副表中的数据和主表的数据匹配不上,副表自动模拟出NULL与之匹配。

join前加left或right

左(外)连接

左表为主表

查询员工的上级领导,显示员工名、领导名(查出所有员工,没有领导时显示NULL)

select e.ename,m.ename from emp e left join emp m on e.mgr = m.empno;

注意,KING是大BOSS,没有领导,所以是NULL,另外,left和join之间省略了outer,读者可自行尝试。

右(外)连接

右表为主表

找出哪个部门没有员工

select d.* from emp e right join dept d on e.deptno = d.deptno where empno is null;

使用右连接,部门必全部查出来,如果没有员工,则员工号为NULL

当然,条条大路通罗马,也可以使用子查询。

select * from dept where deptno not in (select deptno from emp group by deptno);

多表连接

看成多次两表连接即可。

查询每个员工的员工名,部门名,工资等级

select e.ename,d.dname,s.grade from emp e join dept d on e.deptno = d.deptno join salgrade s on e.sal between s.losal and hisal;

子查询

where子句中

查询高于平均薪资的员工信息

select * from emp where sal > (select avg(sal) from emp);

可以看到,结果都是大于平均薪资的员工

from子句中

查询每个部门平均薪资所属的薪资等级

select t.*,s.grade from (select deptno,avg(sal) avgsal from emp group by deptno) t join salgrade s where t.avgsal between s.losal and s.hisal;

将上面的查询结果,当做临时表t,临时表t与salgrade表进行连接,连接条件是平均工资在最低和最高工资之间。

Select子句中

查询每个员工所在部门的名称,显示员工名和部门名

使用表连接的话可以这样写:

select e.ename,d.dname from emp e join dept d on e.deptno = d.deptno;

也可不进行表连接,写到select子句中

select e.ename,(select d.dname from dept d where e.deptno = d.deptno) from emp e;

Union查询

这个在SQL注入中是一种注入技巧

两个查询结果必须列数相同

查询工作岗位是SALESMAN和MANAGER的员工

select ename,job from emp where job = ‘MANAGER’ union select ename,job from emp where job = ‘SALESMAN’;

Limit(分页查询)

Mysql独有的,用于取结果的部分数据,sqlserver、Oracle中不能使用,Oracle中有rownum差不多。

limit [startIndex] length

  • startIndex :起始位置,从0开始,默认为0
  • length:个数

查询工资前5名的员工名和工资

select ename,sal from emp order by sal desc limit 0,5;

select ename,sal from emp order by sal desc limit 5;

每页显示pageSize条记录,pageNo从1开始,则

第pageNo页:?,pageSize  ==> ? 为 (PageNo - 1)*pageSize,pageSize

例如,pageSize = 3,pageNo = 1, limit 0,3

DDL

Create

创建表

语法

CREATE TABLE 表名称
(
列名称1 数据类型,
列名称2 数据类型,
列名称3 数据类型,
....
)

常见字段类型

  • int:整型
  • bigint:长整型
  • float:浮点型
  • char:定长字符串
  • varchar:可变长字符串
  • date:日期类型
  • BLOB:(Binary Large Object,二进制大对象),存储 图片/视频 等流媒体信息
  • CLOB:(Character Large Object,字符大对象),

建立学生表t_student,学号 no,bigint类型,姓名 name,varchar类型,性别 sex char类型,班号 classno,varchar类型,生日 birth char类型

create table t_student(
    no bigint,
    name varchar(255),
    sex char(1),
    classno varchar(255),
    birth char(10)
);

从其他表获取

create table table_name as select 语句;

创建emp1表, 仅包含emp表的ename和sal字段。

create table emp1 as select ename,sal from emp;

Drop

语法

drop table [if exists] table_name;

ALTER

使用图形化界面即可,例如Navicat 表右键->设计表,一般创建时很谨慎,设计好再创建,很少修改表结构。

DML

INSERT

语法

INSERT INTO table_name VALUES (值1, 值2,…),(值1, 值2,…),

我们也可以指定所要插入数据的列,这样,其他列就是默认值:

INSERT INTO table_name (列1, 列2,…) VALUES (值1, 值2,…),(值1, 值2,…)

insert into t_student values(1,‘zhangsan’,‘1’,‘gaosan1ban’,‘1996-11-20’);

一次多行插入

insert into t_student values(2,‘lisi’,‘0’,‘gaosan1ban’,‘1996-10-20’),(3,‘wangwu’,‘1’,‘gaosan1ban’,‘1994-01-12’);

从其他表插入

列,类型之类的要一样,很少用,提一下,不截图了。

insert into table_name  select 语句;

创建dept1表与dept表数据一致,在dept1表后再插入一次dept表的所有内容

create table dept1 as select * from dept;

insert into dept1 select * from dept;

UPDATE

语法

update table_name set 字段名1=值1,字段名2=值2,… [where 语句];

注意,没有条件,整张表全部更新。

dept1表中部门编号为10的LOC字段改为BEIJING

update dept1 set loc = 'BEIJING ’ where deptno = 10;

DELETE

语法

delete from table_name [where 子句];

没有条件全部删除

删除部门20的所有数据

delete from dept1 where deptno = 20;

大表删除数据

对于亿级及以上的大表,删除快,但无法回滚

语法

truncate table table_name;

删除表dept1

truncate table dept1;

约束

创建表时,添加相应约束

非空约束

不能为null

create table t_user( id int, username varchar(255) not null, password varchar(255));

唯一约束

关键字:unique

单字段,列级约束

不能重复,但可以为NULL。可以认NULL和NULL不一样。

drop table if exists t_user;
create table t_user( id int, username varchar(255) unique);

多字段唯一,表级约束

drop table if exists t_user;
create table t_user( id int, username varchar(255), phonenum int,unique(username,phonenum));

可以看成将两个字段合并为一个组,组不能重复。

主键约束

关键字:primary key

不能为null,也不能重复

单一主键

drop table if exists t_user;
create table t_user( id int primary key, username varchar(255),email varchar(255));

第二行由于主键约束,运行失败。

insert into t_user values(1,‘zs’,‘zs@126.com’),(2,‘ls’,‘ls126.com’);

insert into t_user values(2,‘ww’,‘ww@126.com’);

你可以尝试一下,id 为 null 是不是不能插入。

复合主键、业务主键

和unique表级约束语法差不多,primary key(字段1,字段 2)

不推荐,可能产生依赖或业务改变造成影响

自然主键

推荐,使用自然数1、2、3。。。,使用关键字auto_increment

id int primary key auto_increment

外键约束

为解决数据冗余问题,将一张表的主键作为另一张表的外键,用于select时的表连接。

建一个学生表和班级表,学生表有一个外键班号,来自班级表

drop table if exists t_student;
drop table if exists t_class;
create table t_class( cno int, cname varchar(255), primary key(cno) );
create table t_student( sno int, sname varchar(255), classno int, foreign key(classno) references t_class(cno));

insert into t_class values(101,‘xxxxxxxxxxxxxxx’);
insert into t_class values(102,‘yyyyyyyyyyyyyyy’);
insert into t_student values(1,‘zs1’,101);
insert into t_student values(2,‘zs21’,101);
insert into t_student values(3,‘zs4’,102);
insert into t_student(sno,sname) values(4,‘zs5’);
insert into t_student values(5,‘zs6’,103);

最后一句无法运行,因为103不在表t_class中。

外键可以为NULL,可以理解为,学校来了个转学的学生,先添加进来,再分配班级。

下一节使用Navicat,有一些提示,一些函数名字过长,总是手打,浪费时间。

常见函数

语法

select 函数名() [from 表名]

mysql相关

database()

返回当前使用数据库

version()

返回mysql版本

user()、system_user()、session_user()

返回当前用户

单行处理函数

字符函数

长度相关

返回字符串字节长度

length(s)
s:字符串

一个汉字是算三个字节,一个数字或字母算一个字节。这是在utf-8字符集下。

char_length(s)

s:字符串

不管汉字还是数字或者是字母都算是一个字节。

字符串拼接

CONCAT(s1,s2…sn)  字符串 s1,s2 等多个字符串合并为一个字符串

CONCAT_WS(x, s1,s2…sn)  同 CONCAT(s1,s2,…) 函数,但是每个字符串之间要加上 x,x 可以是分隔符

大小写

UPPER(s)     将字符串转换为大写

LOWER(s)     将字符串 s 的所有字母变成小写字母

查询员工表员工名,小写展示

SELECT LOWER(ename) 员工名 from emp;

子串

SUBSTR(s, start [,length])     从字符串 s 的 start 位置截取长度为 length 的子字符串,位置从1开始

SUBSTRING、MID 一样

SUBSTRING_INDEX(s, delimiter, number)     返回从字符串 s 的第 number 个出现的分隔符 delimiter 之后的子串。
如果 number 是正数,返回第 number 个字符左边的字符串。
如果 number 是负数,返回第(number 的绝对值(从右边数))个字符右边的字符串。

例如,查询’lady_killer9’中’_'左面的子串,'lady_killer9’中第二个’l’右边的子串

SELECT SUBSTRING_INDEX(‘lady_killer9’,‘_’,1),SUBSTRING_INDEX(‘lady_killer9’,‘l’,-2);

去空格

LTRIM(s)     去掉字符串 s 开始处的空格

RTRIM(s)     去掉字符串 s 结尾处的空格

TRIM(s)     去掉字符串 s 开始和结尾处的空格

填充

LPAD(s1,len,s2)     在字符串 s1 的开始处填充字符串 s2,使字符串长度达到 len

RPAD(s1,len,s2)     在字符串 s1 的结尾处添加字符串 s2,使字符串的长度达到 len

注:最终长度必为len,不够填充,多了截断

替换

REPLACE(s,s1,s2)     将字符串 s2 替代字符串 s 中的字符串 s1

前面去空格的时候,“Hello World”中间的空格没有去掉,可以使用replace进行替换

索引/位置

LOCATE(s1,s)     从字符串 s 中获取 s1 的开始位置
POSITION(s1 IN s)     从字符串 s 中获取 s1 的开始位置

比较字符串

STRCMP(s1,s2)     比较字符串 s1 和 s2,如果 s1 与 s2 相等返回 0 ,如果 s1>s2 返回 1,如果 s1<s2 返回 -1

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

,查询’lady_killer9’中’_'左面的子串,'lady_killer9’中第二个’l’右边的子串

SELECT SUBSTRING_INDEX(‘lady_killer9’,‘_’,1),SUBSTRING_INDEX(‘lady_killer9’,‘l’,-2);

去空格

LTRIM(s)     去掉字符串 s 开始处的空格

RTRIM(s)     去掉字符串 s 结尾处的空格

TRIM(s)     去掉字符串 s 开始和结尾处的空格

填充

LPAD(s1,len,s2)     在字符串 s1 的开始处填充字符串 s2,使字符串长度达到 len

RPAD(s1,len,s2)     在字符串 s1 的结尾处添加字符串 s2,使字符串的长度达到 len

注:最终长度必为len,不够填充,多了截断

替换

REPLACE(s,s1,s2)     将字符串 s2 替代字符串 s 中的字符串 s1

前面去空格的时候,“Hello World”中间的空格没有去掉,可以使用replace进行替换

索引/位置

LOCATE(s1,s)     从字符串 s 中获取 s1 的开始位置
POSITION(s1 IN s)     从字符串 s 中获取 s1 的开始位置

比较字符串

STRCMP(s1,s2)     比较字符串 s1 和 s2,如果 s1 与 s2 相等返回 0 ,如果 s1>s2 返回 1,如果 s1<s2 返回 -1

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

[外链图片转存中…(img-7FfvZxC4-1715714705042)]

[外链图片转存中…(img-UkIpgFEr-1715714705043)]

[外链图片转存中…(img-ZvPTGVO9-1715714705043)]

[外链图片转存中…(img-11negLc4-1715714705043)]

[外链图片转存中…(img-PC55m89Q-1715714705044)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 18
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值