1、select 基本用法 1.1简单的数据检索 1.1.1检索出需要的列 只要执行select * from 名即可。select * from t_employee 。select * from t_employee语句会把数据库的所有列的信息从数据库中读出来,缓存到内存中。检索出所有的列的 sql 语句为select * from
1、select 基本用法
1.1简单的数据检索
1.1.1检索出需要的列
只要执行“select * from 名”即可。select * from t_employee 。select * from t_employee语句会把数据库的所有列的信息从数据库中读出来,缓存到内存中。检索出所有的列的 sql 语句为“select * from t_employee” ,其中的星号“*”就意味着“所有列” ,那么我们只要将星号 “*”替换成我们要检索的列名就可以了。如select fnumber from t_employee 。只要在 select 语句后列出各个列的列名就可以了,需要注意的就是各个列之间要用半角的逗号“,”分隔开。比如我们执行下面的 sql 语句:select fname,fage from t_employee 。
1.1.2列别名
别名的定义格式为 “列名 as 别名” , 比如我们要为 fnumber 字段取别名为 number14
,fname 字段取别名为 name、fage 字段取别名为 age、为 fsalary字段取别名为 salary,那么编写下面的 sql 即可:select fnumber as number1,fname as name,fage as age,fsalary as salary from
t_employee 。定义别名的时候“as”不是必须的,是可以省略的,比如下面的 sql 也是正确的:
select fnumber number1,fname name,fage age,fsalary salary from t_employee 。
1.1.3按条件过滤
由于将表中所有的数据都从数据库中检索出来,所以会有非常大的内存消耗以及网络资源消耗。 需要逐条检索每条数据是否符合过滤条件,所以检索速度非常慢,当数据量大的时候这种速度是让人无法忍受的。无法实现复杂的过滤条件。select fname from t_employee where fsalary25 。使用 where 子句只需指定过滤条件就可以,我们无需关心数据库系统是如果进行查找的,数据库会采用适当的优化算法进行查询,大大降低了 cpu 资源的占用。
sql 标准中规定了下面几种聚合函数:
这几个聚合函数都有一个参数,这个参数表示要统计的字段名。 第一个例子是查询年龄大于 25 岁的员工的最高工资,执行下面的 sql:
select max(fsalary) from t_employee where fage>25 。
为了方面的引用查询的结果, 也可以为聚合函数的计算结果指定一个别名, 执行下面的 sql:
select max(fsalary) as max_salary from t_employee where fage>25 。
select avg(fage) from t_employee where fsalary>3800 。
select sum(fsalary) from t_employee 。
select min(fsalary),max(fsalary) from t_employee 。
最后一个介绍的函数就是统计记录数量的 count,这个函数有一特别,因为它的即可以像其他聚合函数一样使用字段名做参数, 也可以使用星号 “*” 做为参数。 我们执行下面的 sql:
select count(*),count(fnumber) from t_employee 。
count(*)统计的是结果集的总条数,而count(fname)统计的则是除了结果集中 fname 不为空值(也就是不等于 null)的记录的总条数。
1.1.4排序
select 语句允许使用 order by 子句来执行结果集的排序方式。order by 子句位于 select 语句的末尾,它允许指定按照一个列或者多个列进行排序,还可以指定排序方式是升序(从小到大排列)还是降序(从大到小排列)。比如下面的 sql 语句演示了按照年龄排序所有员工信息的列表:
select * from t_employeeorder by fage asc 。
asc 代表升序,升序是默认的排序方式。select * from t_employee order by fage 。
如果需要按照降序排列,那么只要将 asc 替换为 desc 即可,其中 desc 代表降序。执行下面的 sql 语句:select * from t_employee order by fage desc 。
因为 order by语句允许指定多个排序列,各个列之间使用逗号隔开即可。执行下面的 sql 语句:
select * from t_employee order by fage desc,fsalary desc 。 可以看到年龄相同的记录按照工资从高到低的顺序排列了。对于多个排序规则,数据库系统会按照优先级进行处理。数据库系统首先按照第一个排序规则进行排序; 如果按照第一个排序规则无法区分两条记录的顺序, 则按照第二个排序规则进行排序; 如果按照第二个排序规则无法区分两条记录的顺序, 则按照第三个排序规则进行排序; ……以此类推。order by 子句完全可以与 where 子句一起使用,唯一需要注意的就是 order by 子句要放到 where 子句之后,不能颠倒它们的顺序。select * from t_employee where fage>23 order by fage desc,fsalary desc 。
1.2高级过滤功能
高级数据过滤技巧几乎同样适用于 update 语句和 delete 语句中的where 子句。
1.2.1通配符过滤
sql 中的通配符过滤使用 like 关键字,是一个二元操作符, 左表达式为待匹配的字段, 而右表达式为待匹配的通配符表达式。
1.2.1.1单字符匹配
“b_d” 匹配第一个字符为 b、第二个字符为任意字符、第三个字符为 d 的字符串。通配符表达式“_oo_”匹配第一个字符为任意字符、第二个字符为 o、第三个字符为 o、第四个字符为任意字符的字符串。
select * from t_employee where fname like '_erry' 。
select * from t_employee where fname like '__n_' 。
1.2.1.2多字符匹配
进行多字符匹配的通配符为半角百分号“%” ,它匹配任意次数(零或多个)出现的任意字符。比如通配符表达式“k%”匹配以“k”开头、任意长度的字符串。select * from t_employee where fname like 't%' 。
select * from t_employee where fname like '%n%'。
字符匹配和多字符匹配还可以一起使用。select * from t_employee where fname like '%n_' 。
1.2.2空值检测
没有添加非空约束列是可以为空值的(也就是 null)。待检测字段名is null”,比如要查询所有姓名未知的员工信息,则运行下面的sql语句:select * from t_employee where fname is null 。
如果要检测“字段不为空”,则要使用is not null,使用方法为“待检测字段名is not null”,比如要查询所有姓名已知的员工信息,则运行下面的sql语句:select * from t_employee where fname is not null 。
select * from t_employee where fname is not null and fsalary
1.2.3反义运算符
同时sql提供了通用的表示 “不等于” 的运算符 “” , 这样 “不等于”、“不大于”和“不小于”就分别可以表示成“”、“=”。检索所有年龄不等于22岁并且工资不小于2000元”,我们可以编写下面的sql语
句:select * from t_employee where fage22 and fsalary>=2000 。
因此要完成下面的功能“检索所有年龄不等于22岁并且工资不小于2000元”,我们可以编写下面的sql语句:
select * from t_employee where not(fage=22) and not(fsalary
1.2.4多值检测
可以使用or语句来连接多个等于判断。sql语句如下:select fage,fnumber,fname from t_employeewhere fage=23 or fage=25 or fage=28 。
select fage,fnumber,fname from t_employee where fage in(23,25,28) 。
1.2.5范围检测
检索所有年龄介于23岁到27岁之间的员工信息” ,可以使用下面的sql语
句:select * from t_employee where fage>=23 and fage 测的语句“bettween and”,它可以用来检测一个值是否处于某个范围中(包括范围的边界值,也就是闭区间)。使用方法如下“字段名 bettween 左范围值 and 右范围值”。select * from t_employee
where fage between 23 and 27 。
检索所有工资介于2000元到3000元之间以及5000元到8000元的员工信息” ,可以使用下面的sql语句:
select * from t_employee where (fsalary between 2000 and 3000)or (fsalary between 5000 and 8000) 。
数据库系统对“bettween and”进行了查询优化,使用它进行范围值检测将会得到比其他方式更好的性能,因此在进行范围值检测的时候应该优先使用“bettween and”。需要注意的就是“bettween and”在进行检测的时候是包括了范围的边界值的(也就是闭区间),如果需要进行开区间或者半开半闭区间的范围值检测的话就必须使用其他的解决方案了。
1.2.6低效的where 1=1
因为使用添加了 “1=1”的过滤条件以后数据库系统就无法使用索引等查询优化策略,数据库系统将会被迫对每行数据进行扫描 (也就是全表扫描) 以比较此行是否满足过滤条件, 当表中数据量比较大的时候查询速度会非常慢。 因此如果数据检索对性能有比较高的要求就不要使用这种 “简便” 的方式。
1.3数据分组
sql语句中使用group by子句进行分组,使用方式为“group by 分组字段”。分组语句必须和聚合函数一
起使用,group by子句负责将数据分成逻辑组,而聚合函数则对每一个组进行统计计算。
select fage from t_employee group by fage。 group by子句将检索结果划分为多个组,每个组是所有记录的一个子集。group by子句必须放到select语句的之后,如果select语句有where子句,则groupby子句必须放到where语句的之后。
select fage from t_employee where fsubcompany = 'beijing'group by fage 需要分组的所有列都必须位于group by子句的列名列表中,也就是没有出现在group by子句中的列(聚合函数除外)是不能放到select语句后的列名列表中的。
select fage,avg(fsalary) from t_employee group by fage 。group by子句中可以指定多个列,只需要将多个列的列名用逗号隔开即可。指定多个分组规则以后, 数据库系统将按照定义的分组顺序来对数据进行逐层分组, 首先按照第一个分组列进行分组,然后在每个小组内按照第二个分组列进行再次分组……逐层分组,从而实现“组中组”的效果, 而查询的结果集是以最末一级分组来进行输出的。
select fsubcompany,fdepartment from t_employee group by fsubcompany,fdepartment 。
select fage,count(*) as countofthisage from t_employee group by fage 。
select fsubcompany,fage,count(*) as countofthissubcompage from t_employee group by fsubcompany,fage 。
select fsubcompany,fage,count(*) as countofthissubcompage from t_employee group by fsubcompany,fage order by fsubcompany 。
“count(*)”对每一个分组统计总数,这样就可以统计出每个公司每个年龄段的员工的人数了。sum、avg、min、max也可以在分组中使用。比如下面的sql可以统计每个公司中的工资
的总值:select fsubcompany,sum(fsalary) as fsalarysum from t_employee group by fsubcompany 。
1.3.1having子句
有的时候需要对部分分组进行过滤,可以在数据库系统中执行下面的sql的时候, 数据库系统会提示语法错误, 这是因为聚合函数不能在where语句中使用,必须使用having子句来代替,比如:select fage,count(*) as countofthisage from t_employee group by fage having count(*)>1 。
having语句中也可以像where语句一样使用复杂的过滤条件,比如下面的sql用来检索人数为1个或者3个的年龄段,可以使用下面的sql:select fage,count(*) as countofthisage from t_employee
group by fage having count(*)=1 or count(*)=3 。
mysql中提供了limit关键字用来限制返回的结果集, limit放在select语句的最后位置,语法为 “limit 首行行号,要返回的结果集的最大数目” 。比如下面的sql语句将返回按照工资降序排列的从第二行开始(行号从0开始)的最多五条记录:select * from t_employee order by fsalary desc limit 2,5 。
distinct关键字是用来进行重复数据抑制的最简单的功能,而且所有的数据库系统都支持distinct,distinct的使用也非常简单,只要在select之后增加distinct即可。 distinct是对整个结果集进行数据重复抑制的, 而不是针对每一个列, 执行下面的sql语句:select distinct fdepartment,fsubcompany from t_employee 。distinct是对整个结果集进行数据重复抑制的。
联合结果集
有的时候我们需要组合两个完全不同的查询结果集, 而这两个查询结果之间没有必然的联系,只是我们需要将他们显示在一个结果集中而已。在sql中可以使用union运算符来将两个或者多个查询结果集联合为一个结果集中。
只要用union操作符连接这两个查询语句就可以将两个查询结果集联合为一个结果集,
sql语句如下:
select fnumber ,fname,fage from t_employee
union
select fidcardnumber ,fname,fage from t_t empempl oyee 。
联合结果集的原则
联合结果集不必受被联合的多个结果集之间的关系限制,不过使用union仍然有两个基本的原则需要遵守:一是每个结果集必须有相同的列数; 二是每个结果集的列必须类型相容。
