专栏简介 :MySql数据库从入门到进阶.
题目来源:leetcode,牛客,剑指offer.
创作目标:记录学习MySql学习历程
希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长.
学历代表过去,能力代表现在,学习能力代表未来!
文章目录
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是nullis not null不是nulllike
模糊匹配,%表示任意多个(包含0个)任意字符
_表示任意一个字符.
逻辑运算符:
运算符说明and相当于&,多个条件必须都为true, 结果才为trueor相当于|,任意一个条件为true,结果为truenot条件为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+30 order 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.
版权归原作者 Node_Hao 所有, 如有侵权,请联系我们删除。