第4章 检索数据
资料来源 MySQL Crash Course ,Ben Forta著
4.1 SELECT语句
数据库大部分的查都是用SELECT语句实现的,这是一个很常使用的语句。
首先创建一个数据库test
CREATE DATABASE test;
再创建一个表格如下
create table products
(
# 设置id列为int 自动增量,主键
id int auto_increment
primary key,
# 设置这两个列类型varchar和double,varchar最大长度50,默认值空
name varchar(50) null,
price double null
);
插入几条数据
INSERT INTO products(
name,
price
)
VALUES (
'milk',
20.00
),(
'bread',
20.00
),(
'beef',
35.00
),(
'water',
3.00
),(
'cola',
5.00
);
4.2 检索列
要查询一个列的信息的话,就使用如下select
1. 单个列
例如
SELECT name from products;
则可以得出表products的整个列name的所有行,当然这个数据并没有做过滤等处理。
结果应当如下
2. 多个列
当然,如果要查询多个列,那就SELECT关键字后面跟上要查询的列名,用逗号分隔开。
SELECT name,price from products;
则得到表products的列name和对应的列price,数据一一对应,不会错位。
3. 检索所有列
有一些情况需要检索所有列的所有行,比如不知道一张表有什么数据之类的情况,可以使用通配符 “ * ” 来检索,当然如果表超级大而电脑的性能不够的话,卡死是肯定的了。。。
SELECT * FROM products;
则如图,这张表所有的数据都被检索出来了
4. 检索不同的行(去重)
最初的select是返回所有匹配的行,这时,如果不想让相同的值重复出现,怎么办?
如 如果检索的是products表商品有哪些不同的价格,如果使用
SELECT price FROM products;
则返回的结果毫无疑问是price下所有的行,这时可能会有重复
这时候可以使用 DISTINCT关键字
如:
SELECT DISTINCT price FROM products
注意
DISTINCT关键字是不能部分使用的,DISTINCT 应当引用于要查询的所有列而不是其中的某些列,除非要查询的几个列刚好都有重复,且重复的每一行都相同,否则DISTINCT无效。
也就是说,如果此时我插入一行记录
insert into products(
name, price
) VALUES (
'milk',
'20'
);
毫无疑问这一行和原有的数据的name,price完全重复了,
也就是说查询的两个列都有记录完全相同且相互对应,这是用DISTINCT去重两个列才会生效,否则不生效。
即使原来表里面有名字重复但价格不重复的行,DISTINCT也会无效,必须是完全重复。
4.6 限制结果
SELECT是查询匹配的所有行,为了让它只返回n行(n为自然数),可以使用LIMIT子句
如 我想让他只返回前三行
SELECT * FROM products
LIMIT 3;
也可以指定返回某个范围
如让他返回第1行开始的下一个3行(注意id是从1开始)
SELECT * FROM products
LIMIT 1,3;
等价写法是
SELECT * FROM products
LIMIT 3 OFFSET 1;
这样也会返回第1行开始的下一个三行。
注意
-
SQL中,第0行才是广义上的第1行,放在这里,第0行是id=1的行
-
行数不够时,会返回能返回的那么多行
4.7 完全限定表名
可以使用完全限定的名字来引用列,也就是同时使用表名和列名
也就是如果查询表products下的name和price,可以用如下写法
SELECT products.name,products.price FROM products;
可以得知我们使用了完全限定的名字,这在联表查询时是必须的
也可以使用 AS 关键字来为表名或列名指定别名
如这里为表名products指定别名products;
select p.name,p.price
From products AS p;
结果毫无疑问是一样的
当然表也是可以使用完全限定的。
如
SELECT SELECT products.name,products.price FROM test.products;
select p.name,p.price
From products AS p;
结果毫无疑问是一样的
[外链图片转存中...(img-XHFXU2Uo-1588924537596)]
当然表也是可以使用完全限定的。
如
```mysql
SELECT SELECT products.name,products.price FROM test.products;