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;
(把两个表分别查到的数据放到一起,联合查询)
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于