接下来几节课开始着重讲解查询语句,数据的查询会比数据的增删改东西多。
我们应该知道大多的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题。遇到最多的,也是最容易出性能问题的,主要在数据查询操作上,所以查询语句是学习数据操作的重中之重。
select [all | distinct] 字段或表达式列表 [from子句] [where子句] [group by子句] [having子句] [order by子句] [limit子句];
基本含义与解释:
select语句表示从某个或某些表中查询(取得)若干条数据。上述语法形式中,所有中括号中的部分都是可以省略的,但如果出现,则他们的顺序必须按上述给出的顺序书写。而且,逻辑上,后一子句都是在前一子句所获得的结果的基础上再进行其设定的功能操作,如图所示:
select语句,作用是从“数据源”中,找出(取出)一定的数据,并作为该语句的返回结果(数据集)
数据源:
通常,数据源就是“表”。但:
也可以没有数据源,而是使用“直接数据”(或函数执行结果,MySQL也算是一门编程语言,所以它也有函数的)。
字段可以起个别名:
知道上面的这些就OK了,这不是我们学习的重点,以后也都用不着。
开始学习从数据表里查询数据:
从数据表里查询数据一定要有“from子句”。
把楠神上节课提供的data.sql文件导入到数据库里,有个“user_info”表,里面有现成的几行数据可供我们测试用。
Navicat下:
在cmd下:
select * from `user_info`;
“*”代表了所有的字段,也可以只查询部分字段:
备注:反引号“`”是可以不用写的,只要字段名、表名不是MySQL的保留关键字就不会出错,但为了保持良好的习惯,虽然麻烦点,楠神还是建议大家带上反引号。
查询的字段不必非得按数据表中字段的本来顺序,也可以这样:
重点说明:
“select *” 与 “select 字段1,字段2……”的区别:
“select *”好处:写起来简单方便,不容易造成SQL语句的出错。坏处:费资源,性能差。
“select 字段”坏处:写起来不方便,容易因为写错字段名造成SQL语句出错。好处:查询性能高。
“select *”是查询表中的所有字段,假如这个表有成几千万以上的数据,那将是非常缓慢的。用“select 字段”的话,那就会好多了。所以,一个表数据量特别大时,尽量避免使用“select *”查询数据,小心被技术领导骂。
“select *”性能差的原因:SELECT *,需要数据库先 Query Table Metadata For Columns,一定程度上为数据库增加了负担。
[all | distinct]
用于设定所select出来的数据是否允许出现重复行(完全相同的数据行)
all:允许出现——默认不写就是All(允许的)。
distinct:不允许出现——就是所谓的“消除重复行”。
distinct消除了两行重复的记录。
就是指定数据的来源,其实就是“表”,可以是一个表名,也可以是多个表——多表查询了。