文章目录

    • 一.SELECT
    • WHERE子句(条件)
      • 1.逻辑操作符
    • 2.DISTINCT 去除重复列
      • 3.LIKE: 通配符
      • 4.空值查询
      • 5.统计
      • 6.分组:统计
      • 7.排序
      • 8.限定查询结果
      • 9.IN范围过滤
    • 对查询结果中的数据请求施加“锁”
  • 二. 特殊集
    • 1.where和having的区别
    • 2.过滤的次序
    • 3.安全攻击
      • 1.sql 注入
  • 三. 多表查询
    • 1. 纵向合并union
    • 2.横向合并
      • cross join完全组合
      • 内连接:inner join
      • 自连接
      • 外连接:
      • 子查询:select被嵌入到别的语句中
  • 四. 视图view(了解)
    • 注意点
    • 练习

DQL:Data Query Language 数据查询语言

SELECT

一.SELECT

select "hello"; 相当于echo
select 3*4; 做数字运算

select * from students;查询表中的所有字段

select id,name,age from student;查询特定字段(顺序无所谓)----这里字段的名称(大小写都可以)


select name as 姓名,age as 年龄,id from student;别名机制(as可加可不加)-----以便于显示的直观性

WHERE子句(条件)

指明过滤条件以实现“选择”的功能:
过滤条件:布尔型表达式
算术操作符:+, -, *, /, %
比较操作符:

除了数字其他的字符都要加单引号

 =<=>(相等或都为空)<>!=(非标准SQL), 在mysql中适用>>=<<=

BETWEEN min_num AND max_num
IN (element1, element2, …)
IS NULL
IS NOT NULL

select  * from student where  id>=20;
select  * from student where  id=20;
select  * from student where  name='lisi';

1.逻辑操作符

NOT 非
AND 并且
OR 或者
XOR
BETWEEN

这里between and, in ,like 都有not的用法
比如; not between A and B

select  * from student where  age>=20  and  gender='f';


between 在。。。之间

select  * from student where  Age between 20  and  30 ;

2.DISTINCT 去除重复列

最后只会显示 唯一值

SELECT DISTINCT gender FROM students;

3.LIKE: 通配符

用于盲目搜索----相当于linux里面的grep

% 任意长度的任意字符
_ 任意单个字符
[^] 不包含
[] 包含
例如:

字段   like    '_[^wang]%'     //第二个字段不为wang
查询以s开头的 人
select  * from student where  name like  's%';查询包含s的人(前后带%不推荐使用)
select  * from student where  name like  '%s%';

RLIKE:正则表达式,索引失效,不建议使用
REGEXP:匹配字符串可用正则表达式书写模式,同上

4.空值查询

select  * from student where  class is null;
select  * from student where  class is not null;

5.统计

GROUP:根据指定的条件把查询结果进行“分组”以用于做“聚合”运算

avg(), max(), min(), count(), sum()
select  count(id)  as 记录数  from student;返回表中的所有数量
select  count(*)  as 记录数  from student;最大值
select  max(age)  as 记录数  from student;
最小值
select  min(age)  as 记录数  from student;
平均值
select  avg(age)  as 记录数  from student;
总值
select  sum(age)  as 记录数  from student;

如果有些数值为null则不统计

6.分组:统计

group by

对哪个字段做分组
做分组:select 不加聚合函数,默认只显示第一个结果

规则:分组后selsct后面只跟“分组的字段,聚合函数” ,其他不要

注意分组完,做运算只能用having
HAVING: 对分组聚合运算后的结果指定过滤条件

统计男女的平均年龄
select  gender,avg(age)  as 记录数  from student group by gender ;



对聚合函数加别名------方便过滤

多次分组
统计每一个班男女年龄的平均值
逻辑:先对班级做分组—然后对性别做分组

7.排序

ORDER BY: 根据指定的字段对查询结果进行排序
升序:ASC
降序:DESC

select * from students order by age ;
select * from students order by age desc;既让他降序排,又将null放到最后(只针对数字有效)
select * from students order by -age desc;



按班级统计年龄的总和,并且查询结果按班级的正序显示
并且不限制class为null的值

select class,sum(age) from students group by class having is not null order by class;更优的
select class,sum(age) from students group by class is not null  order by class;

8.限定查询结果

LIMIT [[offset,]row_count]:对查询的结果进行输出行数数量限制

select * from student limit 3跳过前两个,去后续的3个
select * from student limit 2,3

9.IN范围过滤

在什么范围之内

select *from students where  class in (1,3,5)

对查询结果中的数据请求施加“锁”

FOR UPDATE: 写锁,独占或排它锁,只有一个读和写
LOCK IN SHARE MODE: 读锁,共享锁,同时多个读

例如

DESC students;INSERT INTO students VALUES(1,'tom','m'),(2,'alice','f');INSERT INTO students(id,name) VALUES(3,'jack'),(4,'allen');SELECT * FROM students WHERE id < 3;SELECT * FROM students WHERE gender='m';SELECT * FROM students WHERE gender IS NULL;SELECT * FROM students WHERE gender IS NOT NULL;SELECT * FROM students ORDER BY name DESC LIMIT 2;SELECT * FROM students ORDER BY name DESC LIMIT 1,2;SELECT * FROM students WHERE id >=2 and id <=4SELECT * FROM students WHERE BETWEEN 2 AND 4SELECT * FROM students WHERE name LIKE ‘t%’SELECT * FROM students WHERE name RLIKE '.*[lo].*';SELECT id stuid,name as stuname FROM students

二. 特殊集

1.where和having的区别

where是在分组前过滤

having是分组之后,从分组的结果中过滤

2.过滤的次序

from
group by  第一
having    第二
order by  第三
select
limit     第四

3.安全攻击

1.sql 注入

特殊的密码:

' or '1'='1

直接破译原有的密码

用户为 andim’-- 密码为 '

三. 多表查询

1. 纵向合并union

相当于cat

共有的字段(合并)----内容相匹配

规则:

字段可以不同命----但前表与后表的列字段数量相同,次序一致,同一类型

最终结果两张表,全部组合

联合查询:UNION
union去重功能
union all不去重

SELECT Name,Age FROM students UNION SELECT Name,Age FROM teachers;



去重功能可以排除表中重复的行

2.横向合并

相当于paste

cross join完全组合

交叉连接:笛卡尔乘积
两张表的每条记录分别组合,形成新的记录
记录X记录=组合后的记录

内连接:inner join

等值连接:让表之间的字段以“相等”建立连接关系;
最后用ON 指明等值条件
最好写的时候,指明某个表的字段 tabe1.id=table2.id

在from后面 可以直接给表起别名
建议:表定义别名,后所有字段都用

不等值连接

自然连接:去掉重复列的等值连接

自连接

用ON指定来接条件
查询每个员工的姓名和上级领导的姓名
逻辑:将其当成两张表,一张为emp,一张为leader
用左外链接

select e.name  l.name from emp e left join emp l  on e.leaderid=l.id;

外连接:

用ON指定来接条件
左外连接:左边全要,右边只取交集

left outer join 这里的outer可以省略

FROM tb1 LEFT JOIN tb2 ON tb1.col=tb2.col

右边都不要,交集都不要(没有交集----交集为null),

在结果中过滤:最后用where
where a.id is null

右外连接
right outer join 这里的outer可以省略

FROM tb1 RIGHT JOIN tb2 ON tb1.col=tb2.col


左边都不要,交集都不要(没有交集----交集为null),

where a.id is null

完全外连接:两边都要(包括交集)
full outer joinmysql不支持
mysql实现方式 :将左外连接和右外连接的结果union

将中间交集部分排除
也就是将相同的字段给他删掉
两边任意一个为空 or
where a.id is null or b.id is null

子查询:select被嵌入到别的语句中

在查询语句嵌套着查询语句,性能较差

基于某语句的查询结果再次进行的查询

用在WHERE子句中的子查询

查询大于平均年龄的学生


将20号学生的年龄 改成老师的平均年龄


查询每个学生的姓名,课程,成绩(在三张表中)
两张表如果是多对多,就得构建第三张表

select st.name,sc.courseid,sc.score
from students st inner join socres sc  on st.stuid=sc.stuid
inner join courses co on sc.coureid=co.courseid

用于比较表达式中的子查询;子查询仅能返回单个值

SELECT Name,Age FROM students WHERE Age>(SELECT avg(Age)
FROM students);

用于IN中的子查询:子查询应该单键查询并返回一个或多个值从构成列表

SELECT Name,Age FROM students WHERE Age IN (SELECT Age FROM teachers);

用于EXISTS
用于FROM子句中的子查询
使用格式:SELECT tb_alias.col1,… FROM (SELECT clause) AS tb_alias
WHERE Clause;
示例:

SELECT s.aage,s.ClassID FROM (SELECT avg(Age) AS aage,ClassID
FROM students WHERE ClassID IS NOT NULL GROUP BY ClassID) AS s
WHERE s.aage>30;

四. 视图view(了解)

视图:VIEW,虚表没有任何信息,保存有实表的查询结果

这样可以隐藏数据库的结构和复杂度

创建方法

CREATE VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]

 creat view view_test as   select查询语句;

查看视图定义:SHOW CREATE VIEW view_name

show create view view_test;desc view_test;  查看表结构select * from view_test;如果不确定这个是视图还是表
show table status like 'view_test'\G

如果给视图里面添加内容,会直接添加到原表,当创建视图的条件满足时,就会在视图中显示

删除视图
DROP VIEW [IF EXISTS]
view_name [, view_name] …
[RESTRICT | CASCADE]

drop view  view_test;

视图中的数据事实上存储于“基表”中,因此,其修改操作也会针对基表实现;
其修改操作受基表限制

注意点

1.如果两张表有共同字段,建议给字段加别名

练习

导入hellodb.sql生成数据库
(1) 在students表中,查询年龄大于25岁,且为男性的同学的名字和年龄
(2) 以ClassID为分组依据,显示每组的平均年龄
(3) 显示第2题中平均年龄大于30的分组及平均年龄
(4) 显示以L开头的名字的同学的信息
(5) 显示TeacherID非空的同学的相关信息
(6) 以年龄排序后,显示年龄最大的前10位同学的信息
(7) 查询年龄大于等于20岁,小于等于25岁的同学的信息
select * from students where age between 20 and 30;

导入hellodb.sql,实现下面要求
1、以ClassID分组,显示每班的同学的人数
2、以Gender分组,显示其年龄之和
3、以ClassID分组,显示其平均年龄大于25的班级
4、以Gender分组,显示各组中年龄大于25的学员的年龄之和
select sum(age) from students where age > 25 group by gender ;
5、显示前5位同学的姓名、课程及成绩

select s.name,sc.score,cou.course from   students s join scores sc on s.stuid=sc.stuid join courses cou on cou.courseid=sc.courseid order by sc.score desc limit 5;

6、显示其成绩高于80的同学的名称及课程

select s.name,cou.course,sc.score from students s join scores sc on s.stuid=sc.stuid join courses cou on cou.courseid=sc.courseid where sc.score>80;

7、取每位同学各门课的平均成绩,显示成绩前三名的同学的姓名和平均成绩
8、显示每门课程课程名称及学习了这门课的同学的个数
9、显示其年龄大于平均年龄的同学的名字

 select name from students where age>(select avg(age) from students);

10、显示其学习的课程为第1、2,4或第7门课的同学的名字

select * from students where classid in (3,4,7);

11、显示其成员数最少为3个的班级的同学中年龄大于同班同学平均年龄的同学

12、统计各班级中年龄大于全校同学平均年龄的同学

Mysql- --DQl语句(select数据查询语言,多表查询,View试图)linux常用(重点)相关推荐

  1. MySQL之DQL(数据查询语言)- 表连接查询

    目录 一.简介 1.1.男生表 1.2.女生表 二.左连接查询(左外连接) 三.右连接查询(右外连接) 四.内连接查询 五.全连接查询 五.自连接查询 六.子查询 七.伪表查询 学习计划: 一.简介 ...

  2. 第6讲:SQL语句之DQL类型的数据查询语言

    SQL语句之DQL类型的数据查询语言 文章目录 SQL语句之DQL类型的数据查询语言 1.DQL类型的SQL语句基本概述 2.准备一张可以练习查询的数据表 3.DQL语句之简单的基础查询 3.1.查询 ...

  3. 数据库应用——DQL查询数据(连表查询 子查询 详细案例)

    DQL查询数据 DQL Select完整的语法 练习用的sql脚本 指定查询字段 where 条件子句 连表查询(重要) 三种join的比较 连表查询练习 自连接 分页和排序 子查询 分组和过滤 DQ ...

  4. JavaWeb学习笔记(数据库、SQL语句、数据查询语法、完整性约束、编码、备份和恢复数据、多表查询)

    数据库.SQL语句.数据查询语法.完整性约束.编码.备份和恢复数据.多表查询 JavaWeb学习笔记 数据库 数据库概念 基本命令 启动和关闭mysql服务器 客户端登录退出mysql SQL语句 S ...

  5. MySQL DQL语句基础(随堂博客)

    MySQL DQL语句基础(随堂博客) 数据准备 查询数据 条件查询 本博客为课程随堂博客作业,个人技术有限,表达略显抽象,望请见谅 数据库在执行DQL的时候,不会都数据进行改动,仅仅是看.只要把服务 ...

  6. 如何使用 SQL INSERT 语句将数据插入到表中

    文章目录 一.数据插入 1.1 插入完整的行 1.2 插入部分行 1.3 插入检索出的数据 二.从一个表复制到另一个表 三.小结 本文介绍如何使用 SQL INSERT 语句将数据插入到表中,如何用 ...

  7. MySQL从入门到精通:多表查询的灵活运用_02

    我是 ABin-阿斌:写一生代码,创一世佳话,筑一揽芳华. 如果小伙伴们觉得我的文章有点 feel ,那就点个赞再走哦. 上一篇:MySQL从入门到精通:基本语法介绍与使用_01 下一篇:MySQL从 ...

  8. Mysql数据库基本操作(七)多表查询-子查询,表自身关联查询

    多表查询还有前面的两块内容--内连接查询,外连接查询,希望看到这篇博客的朋友先去看看我的"Mysql数据库"专栏中Mysql数据库基本操作(六)多表查询-内连接,外连接这一章博客, ...

  9. Mysql数据库基本操作(六)多表查询-内连接查询,外连接查询

    数据准备 use mydb3 ; --创建部门表 create table if not exists dept3 ( deptno varchar (20) primary key , --部门号 ...

最新文章

  1. ActivityLifecycleCallbacks
  2. 第十二周项目三-数组类运算的实现
  3. 自动ftp脚本的使用
  4. 计算机专业大学排名_计算机专业大学排名公布:大连大学、辽宁师范大学冲进前一百...
  5. 机器学习算法(优化)之一:梯度下降算法、随机梯度下降(应用于线性回归、Logistic回归等等)...
  6. oracle+创建序列自增,oracle序列详解和建立自增主键
  7. linux jdk免安装配置,生产环境免安装jdk的使用方法
  8. 洛谷——P1092 虫食算
  9. mybatis入门(三)之Mapper XML 文件
  10. vue2.0 element-ui中的el-select选择器无法显示选中的内容
  11. vue key重复_【第2112期】 import { reactive } from #39;vue#39;
  12. MFC开发IM-第二十七篇、如何引入acl,解决Json解析问题
  13. 自动化测试报告 html模板,自动化测试报告模板.docx
  14. TigerGraph集群安装
  15. PCB Layout各层含义与分层原则
  16. 酷我音乐盒官方免费版最新版
  17. effective stl
  18. 小程序中自定义组件、父子传值的具体步骤(秒懂)
  19. C++横板格斗小游戏(基于Easyx图形库)
  20. 【python】HTTP压力测试过程中遇到的问题与解决方案

热门文章

  1. 我对移动端架构的思考
  2. 脉脉热帖:数仓真的是太无聊了...
  3. 【2022年华为杯数学建模E题赛后总结加思路详细介绍配代码----10月11号写的总结】
  4. 海量文本中挖掘人物关联关系核心技术介绍-桂洪冠
  5. Python语言程序设计--猫和老鼠小游戏
  6. SAP 发出商品业务配置
  7. CSS 中哪些属性可以继承?
  8. python实现趋势外推法
  9. HTML figcaption 标签
  10. steps_per_epoch=2000,epochs=100之间的区别