专栏简介 :MySql数据库从入门到进阶.

题目来源:leetcode,牛客,剑指offer.

创作目标:记录学习MySql学习历程

希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长.

学历代表过去,能力代表现在,学习能力代表未来!


文章目录

1.CURD

2.新增(create)

2.1 单行数据+全列插入

2.2 多行数据+指定列插入

3.查询(Retrieve)

3.1 全列查询

3.2 指定列查询

3.3 查询字段为表达式

3.4 别名

3.5 去重 distint

3.6 排序 order by

3.7 条件查询 where

3.8 分页查询 limit

4.修改(Updata)

5.删除(Delete)

总结


1.CURD

  • 注释: SQL中使用 — + 描述 来表示注释.
  • CURD: 即 C 新增(Creae), U 修改(Updata), R 查询(Retrieve), D 删除(Delete).
  • 操作表时, 增删改操作相对较为单一, 查询操作相对复杂.

2.新增(create)

2.1 单行数据+全列插入

成员数量必须和定义表的列数以及顺序一致.

语法:

insert into 表名 values(成员1,成员2....);


2.2 多行数据+指定列插入

语法:

insert into 表名(指定列1,指定列2...) values(成员1,成员2...),(成员1,成员2..)..;

Tips: 使用datatime插入日期时,日期的格式为 yyyy-mm-dd hh:mm:ss,另外 now()可以获取当前时间.


3.查询(Retrieve)

3.1 全列查询

通常情况下不建议使用 * 进行全列查询

  • 查询的列越多导出查询的数据量越大,可能使硬盘和带宽爆满.
  • 可能影响到索引的使用

语法:

select * from 表名;

示例:


3.2 指定列查询

语法:

select 指定列1,指定列2.. from 表名;

示例:


3.3 查询字段为表达式

  • Tips:字段为表中定义的列名

1.表达式不包含字段

语法:

select name,age,10 from Test;

示例:


2.表达式包含一个字段

语法:

select name,score+10 from Test;

示例:


3.表达式包含多个字段

语法:

select name,score+age+10 from Test;

示例:


3.4 别名

若查询结果过长, 可给查询结果起一个别名更加直观.

语法:

select 成员1+成员2+.. (as) 别名 from 表名;

示例:


3.5 去重 distint

语法:

select distinct 列名 from Test;

去重前:

去重后:


3.6 排序 order by

  • asc 升序 (默认)
  • desc 降序

语法:

select * from 表 (where) order by 列名 (asc/desc);

1.没有order by 字句的查询, 返回的顺序是未定义的, 不要依赖该顺序.

2.null 数据排序视为比任何数据都小, 升序位于最上面, 降序位于最下面.


3.使用表达式以及别名排序.

语法:

select 表达式 (as) 别名 from Test order by 别名 desc;

将学生总成绩按从高到低排序.


4.对多个字段进行排序, 排序优先级随书写顺序.

语法:

select 字段1,字段2.. from 表名 order by 字段1 asc/desc ,字段2 asc.desc...

查询同学个门成绩按 语文降序,数学升序,英语降序的顺序来显示.


3.7 条件查询 where

比较运算符:

运算符说明
>,>=,<,<=大于,大于等于,小于,小于等于
=等于, null 不安全, eg: null==null结果是 null
等于, null 安全, eg: null==null结果是true(1)
!=,不等于
between A and B

范围匹配, [A,B],

如果 A<=value<=B .返回true(1)

in(option,…)如果是 option 中的任意一个,返回true(1)
is null是null
is not null不是null
like

模糊匹配,%表示任意多个(包含0个)任意字符

_表示任意一个字符.

逻辑运算符:

运算符说明
and相当于&,多个条件必须都为true, 结果才为true
or相当于|,任意一个条件为true,结果为true
not条件为true, 结果为false

Tips: 别名只是客户端访问服务器的一个临时表的列名,原表中并不存在别名

  • where 条件可以使用表达式, 但不能使用别名.
  • and 优先级高于 or, 同时使用时, 需用小括号{}包裹优先执行的部分.

1.基本查询

语法:

select 列名1,列名2..from 表名 where 限制条件;

查询英语成绩低于80分的同学

select name,english from Test where english<80;

查询语文成绩好于英语的学生

select name,chinese,english from Test where chinese>english;

查询总分在200以上的学生

select name,chinese+english+math from Test where chinese+english+math>200;


2.and与or

查询语文成绩大于80, 且英语成绩大于80的同学

select name,chinese,english from Test where chinese>80 and english>80;

观察 and 和 or 的优先级

select * from Test where chinese>80 or math>70 and english>70; select * from Test where (chinese>80 or math>70) and english>70;


3.范围查询

查询语文成绩在[80-90]的同学.

select name,chinese from Test where chinese between 80 and 90;


4.in

查询语文成绩是78或者89的同学.

select name,chinese from Test where chinese in(78,89);


5.模糊查询

% 匹配多个字符

select name from Test where name like "张%";

_ 匹配任意一个字符

select name from Test where name like "张_";


6.null的查询

查询数学成绩已知的同学的姓名

select name,math from Test where math is not null;

查询数学成绩未知的同学的姓名

select name,math from Test where math is null;


3.8 分页查询 limit

该操作日常生活中十分常见,例如:

语法:

--从0开始筛选n个结果select...from 表名 (where) (order by) limit n;--从s开始筛选n个结果select...from 表名 (where) (order by) limit s,n;--从s开始筛选n个结果 建议使用该方法select...from 表名 (where) (order by) limit n offset s;

按id分页, 每页三条记录, 分别显示第 1,2,3页.

select * from Test (where) order by id limit 3 offset 0;select * from Test (where) order by id limit 3 offset 3;select * from Test (where) order by id limit 3 offset 6;


4.修改(Updata)

语法:

update 表名 set 列名1=值,列名2=值..where 限制条件;
  • Tips: 若不加限制条件会修改所在列的所有内容.
  • 可搭配where,order by,limit 使用

将张三的语文成绩修改为80

update Test set math=80 where name="张三";

将李四的数学成绩变为70, 语文成绩变为90.

update Test set math=70,chinese=90 where name="李四";

为总成绩倒数前三的同学数学成绩加上30分.(升序排列,倒数前三在最前面)

update Test set math=math+30order by math+chinese+english limit 3 offset 0;


5.删除(Delete)

语法:

delete from 表名 where 限制条件; 
  • Tips: 若不加限制条件会修改所在列的所有内容.
  • 可搭配where,order by,limit 使用

删除张三的信息

delete from Test where name="张三";

删除整张表

delete from 表名;

drop 与 delete 的区别:

  • drop注重删除结构,delete注重删除数据.

由于字段也属于结构的一部分, 所以可以搭配alter方法来删除.例如:删除students表中的chinese字段.

alter table students drop chinese;

若要删除students表中的所有名叫”张三”的人, 应该使用delete.