SQL(Structured Query Language)

本贴最后更新于 1828 天前,其中的信息可能已经时移世易

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;
(把两个表分别查到的数据放到一起,联合查询)
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    342 引用 • 708 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...