
SELECT用于从一个或多个表中检索行。第 3.1 节:SELECT 与 DISTINCTSELECT之后的DISTINCT子句用于从结果集中去除重复行。CREATETABLEcar(car_idINTUNSIGNEDNOTNULLPRIMARYKEY,nameVARCHAR(20),priceDECIMAL(8,2));INSERTINTOcar(car_id,name,price)VALUES(1,'Audi A1','20000'),(2,'Audi A1','15000'),(3,'Audi A2','40000'),(4,'Audi A2','40000');SELECTDISTINCTname,priceFROMcar;结果:+---------+----------+ | name | price | +---------+----------+ | Audi A1 | 20000.00 | | Audi A1 | 15000.00 | | Audi A2 | 40000.00 | +---------+----------+DISTINCT作用于所有列以产生结果,而不是单独作用于某一列。后者是新 SQL 开发人员常见的误解。简而言之,结果是行级别的去重,而不是列级别的去重。要理解这一点,请看上面结果中的 “Audi A1”。在较新的 MySQL 版本中,DISTINCT与ORDER BY一起使用时会有一些影响。ONLY_FULL_GROUP_BY设置会起作用,详见 MySQL 手册《MySQL Handling of GROUP BY》。第 3.2 节:SELECT 所有列(*)SELECT*FROMstack;结果:+----+----------+----------+ | id | username | password | +----+----------+----------+ | 1 | admin | admin | | 2 | stack | stack | +----+----------+----------+ 2 rows in set (0.00 sec)在连接查询中,你可以通过以下方式从一个表中选择所有列:SELECTstack.*FROMstackJOIN...;优点:当添加/删除列时,使用SELECT *的地方不需要修改。写起来更短。可以立即看到所有列。缺点:返回了不需要的数据。例如,添加一个每行 200KB 的VARBINARY列,而你只在某个地方需要这一条记录的数据,使用SELECT *可能会为每 10 行返回 2MB 的无用数据。明确指定使用的数据更清晰。指定列名后,如果某列被删除,会