来源参考https://www.cnblogs.com/whgk/p/6149009.html

跟着源博客敲一遍可以加深对数据库的理解,同时对其中一些代码做一些改变,可以验证自己的理解。

本文改动了其中的一些代码和内容,删除了其中比较简单的内容,以便于操作和理解。

一、单表查询

创建查询环境

  1. CREATE TABLE fruits(
  2. f_id CHAR(10) NOT NULL,
  3. s_id INT NOT NULL,
  4. f_name char(255) NOT NULL,
  5. f_price DECIMAL(8,2) NOT NULL,
  6. PRIMARY KEY(f_id)
  7. );
  8.  
  9. 解释:
  10. f_id:主键 使用的是CHAR类型的字符来代表主键
  11. s_id:这个其实是供应商的编号,也就是代表该水果是从哪个供应商那里过来的,写这个字段的目的是为了方便后面扩增表。
  12. f_name:水果的名字
  13. f_price:水果的价格,使用的是DECIMAL这个数据类型

创建结果用desc命令查看:

添加数据:

为了防止在cmd中直接敲打代码出错,所以新建了InsertFruits.sql文件,然后在cmd中调用:

  1. //InsertFruits.sql
  2.  
  3. INSERT INTO fruits(f_id,s_id,f_name,f_price) VALUES
  4. ('a1' , 101 , 'apple' , 5.2),
  5. ('b1' , 101 , 'blackberry' , 10.2),
  6. ('bs1' , 102 , 'orange' , 11.2),
  7. ('bs2' , 105 , 'melon' , 8.2),
  8. ('t1' , 102 , 'banana' , 10.3),
  9. ('t2' , 102 , 'grape' , 5.3),
  10. ('o2' , 103 , 'coconut' , 9.2),
  11. ('c0' , 101 , 'cherry' , 3.2),
  12. ('a2' , 103 , 'apricot' , 2.2),
  13. ('l2' , 104 , 'lemon' , 6.4),
  14. ('b2' , 104 , 'berry' , 7.6),
  15. ('m1' , 106, 'mango' , 15.6),
  16. ('m2' , 105 , 'xbabay' , 2.6),
  17. ('t4' , 107, 'xbababa' , 3.6),
  18. ('m3' , 105 , 'xxtt' , 11.6),
  19. ('b5' , 107, 'xxxx' , 3.6 );

1.1、查询所有字段

SELECT * FROM fruits;

* 代表所有字段,也就是从表中将所有字段下面的记录度查询出来

1.2、查询指定字段

SELECT f_name, f_price FROM fruits;

查询f_name 和 f_price 字段的记录

1.3、查询指定记录(where关键字)

  1. SELECT * FROM fruits WHERE f_name = 'apple';  //将名为apple的记录的所有信息度查询出来

  1. SELECT * FROM fruits WHERE f_price > 10;    //将价格大于10的记录的所有字段查询出来

1.4、带IN关键字的查询

SELECT * FROM fruits WHERE f_name IN('apple','orange');

  1. SELECT * FROM fruits WHERE s_id NOT IN(101,105); //s_id 不为101或者105的记录

IN和=的区别:

  • 相同点:均在WHERE中使用作为筛选条件之一、均是等于的含义
  • 不同点:IN可以规定多个值,=一次只能规定一个值,要规定多个值需要使用逻辑符号
  1. select * from fruits where f_name in ('apple','orange');
  2. 可以转换成 = 的表达:
  3. select * from fruits where name='apple' or name='orange';

1.5、带BETWEEN AND 的范围查询

  1. SELECT * FROM fruits WHERE f_price BETWEEN 5 AND 15;  //f_price 在5到15之间,包括5和15。

1.6、带LIKE的字符匹配查询

LIKE: 相当于模糊查询,和LIKE一起使用的通配符有  "%"、"_"

                 "%":作用是能匹配任意长度的字符。

                 "_":只能匹配任意一个字符

  1. SELECT * FROM fruits WHERE f_name LIKE 'c%';  //f_name以c字母开头的所有记录

  1. SELECT * FROM fruits WHERE f_name LIKE 'c%y';  //f_name以b字母开头,y字母结尾的所有记录

  1. SELECT * FROM fruits WHERE f_name LIKE '____y';   //此处有四个_,说明要查询以y字母结尾并且y之前只有四

1.7、关键字DISTINCT(查询结果不重复)

  1. SELECT s_id FROM fruits;  //查询所有的s_id,会出现很多重复的值。

  1. SELECT DISTINCT s_id FROM fruits;//使用DISTINCT就能消除重复的值

1.8、对查询结果排序(ORDER BY)

  1. SELECT DISTINCT s_id FROM fruits ORDER BY s_id;    //默认就是升序,使用降序时用SELECT DISTINCT s_id FROM fruits ORDER BY s_id DESC;  

1.9 、分组查询(GROUP BY)

不分组时查询s_id,会出现一些重复的值

  1. SELECT s_id FROM fruits GROUP BY s_id;  //将s_id进行分组,有实际意义,按s_id进行分组,从101批发商这里拿的水果度会放在101这个组中

  1. SELECT s_id, COUNT(f_name), GROUP_CONCAT(f_name) FROM fruits GROUP BY s_id; //
    s_id分组后,就没有重复的值了,因为重复的度被分到一个组中去了,现在在来看看每个组中有多少个值

COUNT():作用是计算每个组中有多少条记录, 

GROUP_CONCAT(): 将分组中的各个字段的值显示出来。concat本来是连接两个或者多个字符,这里GROUP_CONCAT(f_name)就是将这些水果名连接在一起

  1. SELECT s_id, COUNT(f_name), GROUP_CONCAT(f_name), GROUP_CONCAT(f_price) FROM fruits GROUP BY s_id; //这里显示多个列的连接

  1. 分组之后还可以进行条件过滤,将不想要的分组丢弃,使用关键字 HAVING
  2.  
  3. SELECT s_id,COUNT(f_name),GROUP_CONCAT(f_name) FROM fruits GROUP BY s_id HAVING COUNT(f_name) > 1;//他能够过s_id分组,然后过滤出水果种类大于1的分组信息。

总结:HAVING和WHERE都是进行条件过滤的,区别就在于 WHERE 是在分组之前进行过滤,而HAVING是在分组之后进行条件过滤。

1.13、使用LIMIT限制查询结果的数量

  1. 语法:
    LIMIT[位置偏移量] 行数
  1. SELECT * FROM fruits LIMIT 5,5; //从第5条数据开始,往后取5条数据,也就是从第6条到第10条

二、多表查询

搭建查询环境,前面已经有一张表了,现在在增加一张suppliers(供应商)表和前面哪个fruits表创建练习,也就是说让fruits中s_id字段值指向suppliers的主键值,创建一个外键约束关系。

CREATE TABLE suppliers(

  1. s_id INT NOT NULL,
  2. s_name CHAR(50) NOT NULL,
  3. s_city CHAR(50) NULL,
  4. s_zip CHAR(10) NULL,
  5. s_call CHAR(50) NOT NULL,
  6. PRIMARY KEY(s_id)
  7. ); //在某个目录下新建一个suppliers.sql的文件

mysql> source C:\web\mysql-8.0.13\CommandCreateTables\suppliers.sql;// 创建一个suppliers新表

  1. INSERT INTO suppliers(s_id,s_name,s_city,s_zip,s_call)VALUES
  2. (101,'Supplies A','Tianjin','',''),
  3. (102,'Supplies B','Chongqing','',''),
  4. (103,'Supplies C','Shanghai','',''),
  5. (104,'Supplies D','Zhongshan','',''),
  6. (105,'Supplies E','Taiyuang','',''),
  7. (106,'Supplies F','Beijing','',''),
  8. (107,'Supplies G','Zhengzhou','','');
  1. mysql> source C:\web\mysql-8.0.13\CommandCreateTables\InsertSuppliers.sql ;//插入数据

2.1、普通双表连接查询

问题:查询水果的批发商编号(s_id),批发商名字(s_name),水果名称(f_name),水果价格(f_price)。

分析:需要查询两张表。如果需要查询两张表,那么两张表的关系必定是外键关系,或者类似于外键关系(类似于也就是说两张表并没有真正加外键约束,但是其特点和外键是一样的,就像上面我们手动创建的两张表一样,虽然没有设置外键关联关系,但是其特性跟外键关系是一样的,都存在s_id字段,这样两张表就联系起来了。)

  1. SELECT s.s_id,s.s_name,f.f_name,f.f_price FROM fruits AS f, suppliers AS s WHERE f.s_id = s.s_id; //执行逻辑和顺序:SELECT s.s_id,
  1.       /s.s_name,f.f_name,f.f_price(选择其中两个表中的各两个字段,使用别名来进行访问)
          //FROM (fruits AS f取别名为了简单好记), suppliers AS s(取别名) WHERE f.s_id = s.s_id;
  2. 附:sql执行顺序 (1)from   2) on (3) join (4) where (5)group by  (6) avg,sum....  (7)having (8) select (9) distinct (10) order by 

  也就是说,我们每次执行的SQL语句,都是从FROM开始的。

2.2、内连接查询

  1. 格式:表名 INNER JOIN 表名 ON 连接条件
  2.  
  3. SELECT s.s_id,s.s_name,f.f_name,f.f_price
  4. FROM fruits AS f INNER JOIN suppliers AS s
  5. ON f.s_id = s.s_id; //跟2.1的作用是一样的

JOIN :基于两个或多个表之间的共同字段,把这些表符合条件的所有行结合起来,从而查询到需要的信息。

比如上述问题:查询水果的供应商编号,供应商名字,水果名称,水果价格

自连接查询:涉及到的两张表是同一张表。

问题:查询供应f_id='a2'的水果供应商提供的其他水果种类?

  1. SELECT f2.f_id,f2.f_name
  2. FROM fruits AS f1 INNER JOIN fruits AS f2
  3. ON f1.s_id = f2.s_id AND f1.f_id = 'a2';

2.3、外连接查询

2.3.1、左外连接查询

不仅会显示共有的,还会把table1的其他行也列出来(如图绿色部分)。如果,右表没有匹配的,则以NULL显示。

2.3.2、右外连接查询

2.4 子查询

带ANY、SOME关键字的子查询;

带ALL关键字的子查询;

带EXISTS关键字的子查询;

带IN关键字的子查询;

  1. 搭建环境
    CREATE TABLE tb11 (num1 INT NOT NULL);
  2. CREATE TABLE tb12 (num2 INT NOT NULL);
  3. INSERT INTO tb11 VALUES(1),(5),(13),(27);
  4. INSERT INTO tb12 VALUES(6),(14),(11),(20);
  1. ANY关键字接在一个比较操作符的后面,表示若与子查询返回的任何值比较为TRUE,则返回TRUE,通俗点讲,只要满足任意一个条件,就返回TRUE
  2.  
  3. SELECT num1 FROM tb11 WHERE num1 > ANY(SELECT num2 FROM tb12);//这里就是将在tb12表中查询的结果放在前一个查询语句中充当条件参数。
    //只要num1大于其结果中的任意一个数,那么就算匹配。
    //下图解析:num2中的值为6,14,11,20;num1中13大于6,27大于num2中所有数,所以取出num1中的这两个数

  1. 使用ALL时表示需要同时满足所有条件。
  2. SELECT num1 FROM tb11 WHERE num1 > ALL(SELECT num2 FROM tb12);  //num1需要大于所有的查询结果才算匹配
  1. SLEECT * FROM tb11 WHERE EXISTS(SELECT * FROM tb12 WHERE num2 = 3);  //查询tb12中有没有num2=3的记录,有的话则会将tb11的所有记录查询出来,没有的话,不做查询
  1. 这个IN关键字的作用跟上面单表查询的IN是一样的,不过这里IN中的参数放的是一个子查询语句。
  2. SELECT s_id,f_id,f_name
  3. FROM fruits
  4. WHERE s_id IN(SELECT s_id FROM suppliers WHERE s_id = 107);

具体实例类似,不赘述。

MySQL(2)数据库 表的查询操作的更多相关文章

  1. MySQL(三) 数据库表的查询操作【重要】

    序言 1.MySQL表操作(创建表,查询表结构,更改表字段等), 2.MySQL的数据类型(CHAR.VARCHAR.BLOB,等), 本节比较重要,对数据表数据进行查询操作,其中可能大家不熟悉的就对 ...

  2. mysql数据库表的查询操作-总结

    转自:https://www.cnblogs.com/whgk/p/6149009.html 序言 1.MySQL表操作(创建表,查询表结构,更改表字段等), 2.MySQL的数据类型(CHAR.VA ...

  3. 最全MySQL数据库表的查询操作

    序言 1.MySQL表操作(创建表,查询表结构,更改表字段等), 2.MySQL的数据类型(CHAR.VARCHAR.BLOB,等), 本节比较重要,对数据表数据进行查询操作,其中可能大家不熟悉的就对 ...

  4. mysql基础-数据库表简单查询-记录(五)

    0x01 MySQL的查询操作 单表查询:简单查询                 多表查询:连续查询                联合查询 选择和投影 投影:挑选要符合的字段     select ...

  5. MySql数据库表的查询操作

    http://www.cnblogs.com/whgk/p/6149009.html 优化:http://www.ihref.com/read-16422.html MYSQL常用的几种连接查询方法

  6. MySQL创建数据库/表等基本命令操作

    前提:安装好MySQL并且配置好服务,能够正常使用 按住键盘上的Windows图标,通过搜索框找到MySQL5.7 Command Line Client,点击启动 输入安装时设置用户的密码 成功连接 ...

  7. mysql(三) 数据表的基本操作操作

    mysql(三) 数据表的基本操作操作 创建表,曾删改查,主键,外键,基本数据类型. 1. 创建表 create table 表名( 列名 类型 是否可以为空, 列名 类型 是否可以为空 )ENGIN ...

  8. MySQL查看数据库表容量大小

    本文介绍MySQL查看数据库表容量大小的命令语句,提供完整查询语句及实例,方便大家学习使用. 1.查看所有数据库容量大小 select table_schema as '数据库', sum(table ...

  9. MySQL更改数据库表的存储引擎

    MySQL更改数据库表的存储引擎 1.查看表的原存储引擎 show create table user; 'user', 'CREATE TABLE `user` (\n `id` int(11) N ...

随机推荐

  1. centos命令行系列之升级glibc到

    1.从http://ftp.gnu.org/gnu/glibc/glibc-2.17.tar.gz 下载文件 2.安装部署 [root@kafzook1 /]# tar -xf glibc-2.17. ...

  2. kiss word memory post poly peri out ~p 4

    1● post p əust 在后面,邮件     2● peri 多   3● poly 周围,靠近  

  3. vs2015 编译时项目出现NuGet程序包还原失败,找不到xxx.xxx.xxx版本的程序包,怎么解决这个问题?

    vs2015 编译时出现这个NuGet程序包还原失败问题,项目还是运行得了,就是每次看到错误列表中有很多个错误,就感觉不舒服. 总算被我找到解决方法了 问题截图:

  4. 整数中1出现的次数(1~n)

    题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...

  5. 启动项目时出现java.io.EOFException异常。

    错误: 2018-4-18 10:55:54 org.apache.catalina.session.StandardManager doLoad 严重: IOException while load ...

  6. IDE 版本

    BDS 5 2007 D11  VER180 and VER185 RAD Studio 8 XE D15  VER 220 RAD 18 XE 10.1 Berlin D24  VER310  St ...

  7. sqlalchemy(一)常用连接参数及包

    简介: 本文默认你已经有了一定的数据库基础.我们不喜欢写原生SQL语句,那个写着费劲,日常开发时候,我们怎么CRUD数据库呢?一般使用ORM,对象关系映射(英语:Object Relational M ...

  8. springMVC操作cookie和session

    cookie相关说明: 1.cookie由服务器端创建,然后添加到HttpServletResponse中发送给客户端(浏览器). 2.可以添加多个cookie键值对. 3.cookie由键值名和键值 ...

  9. urllib 获取页面或发送信息

    #! /usr/bin/env python3 # -*- coding:utf-8 -*- #urllib提供了一系列用于操作URL的功能. #urllib的request模块可以非常方便地抓取UR ...

  10. Android开发 ---Button的OnClickListener的三种实现方法

    button的OnClickListener的三种实现方法 onclick事件的定义方法,分为三种,分别为 1.在xml中进行指定方法: 2.在Actitivy中new出一个OnClickListen ...