# 2. 简单的表查询

## 前言

:one: ：[mysql环境准备](https://blog.csdn.net/sinat_38816924/article/details/105478479)

上一章，我们准备环境：安装数据库+创建数据库+创建用户+授权。

这一章：参考《sql必知必会》chapter4\~7

**简单的单表查询：导入表+表查询**

mysql-client中没有设置的时候，无法table自动补齐。敲起来，太慢。

安装一个`mycli` ,table补齐，很好用。[mycli 官网](https://www.mycli.net/)

```
sudo apt install mycli
```

\[toc]

## 总结与摘要

首先要有表，表中有内容；书中已经给了脚本，我们采用脚本导入。

表的常规操作：增删改查。

我们这里，仅仅**整理下简单的单表查询。**

这里不列出具体的语法格式，具体格式，用`help select`查看。

```
selet[select 选项] 字段列表[字段别名]  from 数据源
    [where条件字句]
    [limit 字句]
    [order by 字句]
```

## 导入表

关于表结构与脚本下载，见书上的附录B。或者参看：[mysql必知必会脚本](https://blog.csdn.net/mediocre117/article/details/53195060)

脚本下载：<http://www.forta.com/books/0672325675/>

参考：[用source 命令导入mysql数据库](https://blog.csdn.net/tao546377318/article/details/52120204)

```
# 创建样例表导入脚本
$ mysql -u root - p -D crashcourse < d create.sql
# 或者
mysql> source 脚本的绝对路径
```

## 表查询

* 查询列：单列，多列，所有列，限定表名
* 限定：不重复distinct、限制输出行数limit
* 过滤数据：where
* 输出样式：按照顺序输出order、按照格式输出

一条查询语句暂时可以划分成上面四个部分；我们简单举例说道说道。

### 查询列

查询单列，多列，所有列。

```
mysql> select prod_id, vend_id, prod_name, prod_price from products;
```

限定表名。

现在查询的是单表。后面多表，子查询的时候，限定表名是很好的。（咋个好法？）

```
mysel> ELECT products.prod_name FROM products;
```

### 限定

参考：[MySQL的limit使用及解决超大分页问题](https://juejin.im/post/5db658faf265da4d500f8386)

```
# 不重复输出；如果指定多列，多列都不系统，才能检索出来
SELECT DISTINCT vend_id from products;

# 输出指定行数;offset和limit,前者表示偏移量,后者表示取前limit条数据
# 从第四行（下表从零开始）开始，输出三行。
mysql> select * from products
            limit 3 offset 4
```

### 过滤数据

* where单一条件:相等、不相等、大于、小于、值的范围以及NULL值
* where多个条件：and、or
* where子查询：in、not、exists

参考文章：[mysql中in和exists性能对比及原理](http://bcxw.net/article/143.html)

```
# SQL（像多数语言一样）在处理OR操作符前，优先处理AND操作符--->没事多加括号就好
# 列出价格为10美元（含）以上且由1002或1003制造的所有产品。
mysql> SELECT * FROM products WHERE prod_price>=10 AND (vend_id=1001 OR vend_id=1003)

# 在使用长的合法选项清单时， IN操作符的语法更清楚且更直观。
# IN的最大优点是可以包含其他SELECT语句，使得能够更动态地建立WHERE子句。
mysql> SELECT * FROM products WHERE prod_price>=10 AND vend_id IN (1001,1003)
```

### 输出样式

> 检索出的数据并不是以纯粹的随机顺序显示的。如果不排序，数据一般将以它在底层表中出现的顺序显示。这可以是数据最初添加到表中的顺序。但是，如果数据后来进行过更新或删除，则此顺序将会受到MySQL重用回收存储空间的影响。因此，如果不明确控制的话，不能（也不应该）依赖该排序顺序。关系数据库设计理论认为，如果不明确规定排序顺序，则不应该假定检索出的数据的顺序有意义

参考文章：[mysql select 格式化输出](https://www.bbsmax.com/A/kjdw9bo2JN/)

```
# ORDER BY默认是升序
mysql> SELECT * FROM products 
            WHERE vend_id IN (1001,1003)
            order by prod_price[DESC|ASC],prod_name [DESC|ASC]
```

## 参考文章

[mycli 官网](https://www.mycli.net/)

[用source 命令导入mysql数据库](https://blog.csdn.net/tao546377318/article/details/52120204)

[MySQL的limit使用及解决超大分页问题](https://juejin.im/post/5db658faf265da4d500f8386)

[mysql中in和exists性能对比及原理](http://bcxw.net/article/143.html)

[mysql select 格式化输出](https://www.bbsmax.com/A/kjdw9bo2JN/)

[解决MySQl查询不区分大小写](https://blog.csdn.net/Veir_123/article/details/73730751)
