SQL
SQL分类
SQL分类 | 操作对象 | 操作 | 关键字 |
---|---|---|---|
DDL(数据定义语言) | 数据库,表,视图和索引 | 创建,删除,修改 | CREATE,DROP,ALTER |
DCL(数据控制语言) | 数据库 | 数据库的事务管理 | grant |
DML(数据操纵语言) | 数据内容 | 增删改 | INSERT INTO,DELETE,UPDATE |
DQL(数据查询语言) | 数据内容 | 查询 | SELECT |
DDL(数据定义)
数据定义,数据库的创建修改删除
DCL(数据控制)
事务管理
授权:
DML(数据操纵)
数据操纵语言,对数据进行增删改
DQL(数据查询)
SQL注释和注意事项
1.简单查询
1)基本的查询语句
where条件查询
select name from student where id=1;
(查询id等于1的学生的名字)
组合where子句
操作符 and
select name from student where id>2 and id<6 and age=18;
(and操作符将条件组合在一起,每增加一个过滤条件就要添加一个and)
操作符or
select * from student where age>8 or name like “zhang%”;
(查询年龄大于8岁或者名字是zhang开头的 所有人的 学生)
计算次序 当or与and一起出现的时候 and优先级更高
select * from student where age>8 or age<18 and name like “zhang%”;
(查询年龄小于18而且名字是zhang开头的 学生 或者年龄只需要大于8岁的学生)
不过最好用括号()来明确计算次序,括号括起来的先计算
in操作符
select *from student where id in(1,4,2,7);
(in表示指定了条件范围)
过滤查询 关键字distinct(不能有重复的)
SELECT DISTINCT name FROM student; (查询stundent表中所有不重复的名字)
limit限制查询
select *from student order by id desc limit 1,2;
(根据id倒序排序,从下标为1开始查,查2条数据)
查询多个字段
SELECT id,name from student ; (从student表中查询所有的id和name列,用逗号作为字段之间的分隔符)
别名 as
select id as sid from student;
(查询出来的视图中id字段名变为sid,只是修改视图中的而不会修改原来表中的id名)
连接 concat(" 分隔符",字段1,字段2)
select concat(‘=’id,name) from student;
结果比如就是:2018214491=张三
2)模糊查询
like操作符与%通配符
%通配符(匹配任何字符任意长度,但null不能匹配)
select name from student where name like “张%”;
(查询“张”开头的所有student表中的名字; “%”是一个通配符,表示任何字符他都匹配)
应用场景:栈内搜索(效率比较低)
通配符 _
_只能匹配任意单个字符,不能多个字符
正则匹配
关键字regexp
select * from student where name regexp " [z,c]c" ;
regexp表示后面接的是一个正则表达式;
3)排序以及聚合函数
排序关键字order by
select *from student order bt age; 默认是升序
select *from student order bt age desc; 降序
聚合函数
count() 计算数量
sum() 计算和 select sum(age) from student;求student表格中的年龄之和
avg() 求平均 select avg(age)from student; 求年龄的平均
分组 group by
select count(*)as total ,sex from student group by sex;
(按照sex分组,查出男女各自的数量)
group by having
select count(*),sex from student group by sex having sex=“女”;
按照sex分组查询sex=“女”的数量;
4)字符串模糊查询
2.复杂查询
1)内连接
内连接查询列出与连接条件匹配的数据行,它使用比较运算符来比较被连接的值。
等值连接
select * from stu as s,mark as m where s.id=m.id;
或者
select * from stu as s,mark as m inner join on s.id=m.id;
(查询mark表的id 与stu表的id相等的所有的列值) inner join 连接了两个表
ON条件:是过滤两个链接表笛卡尔积形成的 中间表的 约束条件。
意思是上方查询的是两个表的所有列,形成了一个笛卡尔积,以此基础上的约束条件是s.id=m.id
where条件:1在没有on条件的单表查询中, 是限制物理表或者 中间记录查询结果的约束
2.在有on的时候是两表形成的中间表的查询条件
on只进行连接操作,where只过滤物理表/中间表的记录
having 用在分组中 group by having
不等值连接
运算符有: !=,<,<=, >,>=,<>(不等于), between
select *from stu as s,mark as m where s.id=m.id and m.mark>50;
(在上方等值连接的基础上,在加一个查询条件mark>50分)
自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列
说明:select *from mark,stu ; 返回的是两个表的笛卡尔积
若 mark表内有4条记录, stu有3条记录,那么返回就是3×4=12条记录
2)外连接查询
左连接left join
以左边表为准,左边有有几条记录,返回就几条。
select * from stu as s left join mark as m on s.id=m.id;
假设stu表3条记录,mark表2条记录,以stu为准的话,返回3条记录,但是mark不够,就以null填充
右连接right join
以右边的表为准
全连接
没有以左表为准还是以右表为准。
3)联合查询union all
select *from student union all select *from course;
(把两个表分别查到的数据放到一起,联合查询)
4)子查询
1)视图(概念,如何使用,作用,注意事项)
2)子查询,标量子查询,关联子查询
3)各种常用函数
4.多表查询
1)表的加法
2)联结查询,交叉连接,内连接,外连接(左连接,右连接),全连接
3)联结应用案列
4)case表达式
sql常见面试题: