第六章 查询数据

基本查询语句

select的基本语法:

select 属性列表

from 表名和视图列表

[where 条件表达式1]

[group by 属性名1 [having 条件表达式2]]

[order by 属性2 [asc|desc]]

 

单表查询

如下表:

   

   

查询所有字段

mysql> select * from employee;

   

   

查询指定字段

select name,sex,homeaddr from employee;

   

   

查询指定记录

where 条件表达式

   

select * from employee where d_id=2;

   

查询条件:

查询条件

关键字

比较

=,<,<=,>,>=,!=,!>,!<

指定范围

between and ,not between and

指定集合

in,not in

匹配字符

like,not like

是否为空

is null,is not null

多个查询条件

and , or

   

带in关键字的查询

select * from employee where d_id in (2,3);

   

注:如果元素是字符,必须加上单引号

   

带between and的范围查询

select * from employee where age between 15 and 23;

   

   

带like的字符匹配查询

[not] like '字符串'

字符串必须加单引号。

"%"可以用来代表任意长的的字符串,b%k可以代表bk,bok,book

"_"只能表示单个字符。

   

select * from employee where name like 'Li%y';

   

   

查询空值

select * from employee where name is null;

   

带and的多条件查询

select * from employee where d_id = 1 and sex like '男';

   

   

select * from employee where age<23 and sex like '男';

   

   

带or的多条件查询,类上

   

查询结果不重复

select distinct d_id from employee;

如果d_id 存在重复,使用该语句,将显示所有该字段的不同值

   

对查询结果排序

order by 属性名 [asc|desc]

   

select * from employee order by age;

   

注:空值默认为最小值

   

分组查询

group by 属性名 [having 条件表达式][with rollup]

   

a.单独使用group by关键字来分组

select * from employee group by sex;

   

   

如上,按照性别分组后只显示每组的一条记录,因此意义不大。

   

b.group by关键字与group_concat()函数一起使用

select sex,group_concat(name) from employee group by sex;

   

   

c. group by关键字与集合函数一起使用

select sex,count(sex) from employee group by sex;

   

   

d. group by关键字与having一起使用

select sex,count(sex) from employee group by sex having count(sex)>=2;

   

   

e. 多个字段分组

select * from employee group by d_id,sex;

   

f. group by关键字与with rollup一起使用

select sex,count(sex) from employee group by sex with rollup;

   

使用rollup后,新加一条记录来显示分组值得总和

   

mysql> select sex,group_concat(name) from employee group by sex with rollup;

   

   

用limit限制查询结果的数量

select * from employee limit 2;

   

   

可以指定起始位置:

select * from employee limit 1,2;

   

 

指定从第一条开始(默认从第零条开始)

   

   

   

使用集合函数查询

1.count()函数

统计总的记录数

mysql> select count(*) from employee;

   

   

统计不同d_id的记录数

mysql> select d_id,count(*) from employee group by d_id;

   

2.sum()函数

统计如下表某些记录的字段值的总和

   

mysql> select name,sum(grade) from student group by s_id;

   

   

3.avg()函数

类上

4.min()函数

类上

3.max()函数

类上

   

   

   

连接查询

有以下两张表:

   

   

   

   

内连接查询

mysql> select num,name,employee.d_id,sex,d_name,function

-> from employee,department

-> where employee.d_id = department.d_id;

   

   

外连接

select 属性名列表

from 表名1 left| right join 表名2

on 表名1.属性名1 = 表名2.属性名2;

   

"属性名列表"参数表示要查询的字段,他们可以来自不同表。

"表名1"和"表名2"参数表示将这两个表进行外连接。

"left"和"right"指定左连接查询还是右连接查询。

"on"后面是连接条件

   

a.左连接查询

mysql> select num,name,employee.d_id,age,sex,d_name,function from employee left join department on employee.d_id=department.d_id;

   

先取出employee表数据,再根据连接条件取出department表的数据

b.右连接查询

mysql> select num,name,employee.d_id,age,sex,d_name,function from employee right join department on employee.d_id=department.d_id;

   

先取出department表的数据,再根据连接条件取出employee表数据

   

复合条件连接查询

mysql> select num,name,employee.d_id,sex,d_name,function from employee,department where employee.d_id = department.d_id and age<24;

   

   

   

   

   

子查询

带in关键字的子查询

mysql> select * from employee where d_id in (select d_id from department);

   

   

mysql> select * from employee where d_id not in (select d_id from department);

   

   

带比较运算符的子查询

有以下两个表:

   

   

mysql> select id,name,score from computer_stu

-> where score>=(select score from schoolship where level=1);

   

   

   

带exists关键字的子查询

使用该查询语句时,内层查询语句不返回查询记录,而是返回一个真假值,如果查到满足条件的记录则返回true,当返回true时,外层查询语句才进行查询。

   

mysql> select * from employee where exists (select d_name from department where d_id=1002);

   

   

带any关键字的子查询

该关键字表示满足其中任意一个条件。只要满足内层查询语句返回的结果中的任何一个,就可以通过该条件来执行外层查询语句。

   

如下两个表:

   

   

mysql> select * from computer_stu where score>= any(select score from schoolship);

   

如上,可以查询所有可以获得奖学金的学生

   

带all关键字的子查询

该关键字表示满足所有条件。只要满足内层查询语句返回的结果中的所有结果,才可以通过该条件来执行外层查询语句。

   

合并查询结果

将从多个表中查询的数据合并到一起显示,语法如下:

select 语句1

union|union all

select 语句2

union|union all

select 语句3;

   

union关键字表示将查询结果合并后,除掉相同记录。union all则是简单的合并。

   

mysql> select d_id from employee

-> union

-> select d_id from department;

   

mysql> select d_id from employee

union all

select d_id from department;

   

   

   

   

为表和字段取别名

为表取别名

mysql> select * from department dpt where dpt.d_id =1001;

   

   

   

为字段取别名

mysql> select name as employee_name,age as employee_age from employee;

   

   

   

使用正则表达式查询

基本形式:

属性名 regexp '匹配方式'

   

模式字符

含义

^

匹配字符串开始的地方

$

匹配字符串结束的地方

.

代表字符串中的任意一个字符,包括回车和换行

[字符集合]

匹配字符集合中的任意字符

[^字符集合]

匹配字符集合以外的任意字符

S1|S2|S3

匹配S1|S2|S3中的任意一个字符串

*

代表多个该字符串之前字符,包括0个和1个

+

代表多个字符串之前的字符,包括1个

字符串{N}

字符串出现N次

字符串{M,N}

字符串出现至少M次,至多N次

   

查询特性字符串开头的记录

mysql> select * from employee where name regexp '^K';

   

   

查询特性字符串结尾的记录

mysql> select * from employee where name regexp 'y$';

   

   

用符号"."来代替字符串的任意一个字符

mysql>select * from employee where name regexp '^K...y';

   

   

匹配指定字符中的任意一个

mysql> select * from employee where name regexp '[ks]';

   

   

匹配指定字符串以外的字符

mysql> select * from employee where name regexp '[^a-zA-Z]';

   

  

posted @ 2016-05-24 21:41  且听风吟-wuchao  阅读(295)  评论(0编辑  收藏  举报