mysql基本语法(2)
数据准备
mysql> create table it_student( -> id int unsigned not null auto_increment primary key, -> name varchar(30), -> age tinyint unsigned, -> sex enum('man','woman'), -> salary decimal(11,2), -> subject varchar(30) -> ) engine=innodb default charset=utf8; Query OK, 0 rows affected (0.01 sec) mysql> insert into it_student values(null,'xianqian',20,'woman',21000.00,'tester'); insert into it_student values(null,'xiaoming',24,'man',16000.20,'java'); insert into it_student values(null,'laowang',29,'man',15000.00,'java'); insert into it_student values(null,'laowen',26,'man',10000.00,'yunwei'); insert into it_student values(null,'laotian',26,'man',14000.00,'pthon'); insert into it_student values(null,'tom',24,'man',13000.40,'java'); insert into it_student values(null,'jerry',27,'woman',21000.00,'tester'); insert into it_student values(null,'bullen',22,'man',8000.20,'pthon');Query OK, 1 row affected (0.01 sec) mysql> insert into it_student values(null,'xiaoming',24,'man',16000.20,'java'); Query OK, 1 row affected (0.01 sec) mysql> insert into it_student values(null,'laowang',29,'man',15000.00,'java'); Query OK, 1 row affected (0.03 sec) mysql> insert into it_student values(null,'laowen',26,'man',10000.00,'yunwei'); Query OK, 1 row affected (0.87 sec) mysql> insert into it_student values(null,'laotian',26,'man',14000.00,'pthon'); Query OK, 1 row affected (0.00 sec) mysql> insert into it_student values(null,'tom',24,'man',13000.40,'java'); Query OK, 1 row affected (0.00 sec) mysql> insert into it_student values(null,'jerry',27,'woman',21000.00,'tester'); Query OK, 1 row affected (0.00 sec) mysql> insert into it_student values(null,'bullen',22,'man',8000.20,'pthon'); Query OK, 1 row affected (0.01 sec)
一.高级查询语句
1.查询相关符号
(1)比较符号,
等于=
不等于!=,<>
大于>
小于<
小于等于<=
大于等于>=
(2)模糊查询
like:模糊匹配关键字
%:匹配0个或任意多个字符
_:匹配单个字符
(3)逻辑符号
条件1 and(&&) 条件2:和,同时满足条件1和条件2
条件1 or(||) 条件2:或,满足条件1或条件2
not(!) 条件1:不满足条件1即可
(4)判断列所在的返回
field between...and...:field的值在...和...之间的记录
field in (值1,值2...):field的值等于值1,值2...的记录
field not in (值1,值2...):field的值不等于值1,值2...的记录
(5)其他字符
regexp:可以匹配正则表达式
distinct:可以去除结果列中的重复值,只保留一个
2.查询案例
(1)比较符号使用
mysql> select * from it_student where name = 'xianqian'; +----+----------+------+-------+----------+---------+ | id | name | age | sex | salary | subject | +----+----------+------+-------+----------+---------+ | 1 | xianqian | 20 | woman | 21000.00 | tester | +----+----------+------+-------+----------+---------+ 1 row in set (0.00 sec) mysql> select * from it_student where sex != 'man'; +----+----------+------+-------+----------+---------+ | id | name | age | sex | salary | subject | +----+----------+------+-------+----------+---------+ | 1 | xianqian | 20 | woman | 21000.00 | tester | | 7 | jerry | 27 | woman | 21000.00 | tester | +----+----------+------+-------+----------+---------+ 2 rows in set (0.00 sec) mysql> select id ,name,salary from it_student where age>23; +----+----------+----------+ | id | name | salary | +----+----------+----------+ | 2 | xiaoming | 16000.20 | | 3 | laowang | 15000.00 | | 4 | laowen | 10000.00 | | 5 | laotian | 14000.00 | | 6 | tom | 13000.40 | | 7 | jerry | 21000.00 | +----+----------+----------+ 6 rows in set (0.00 sec) mysql> select id,name,salary from it_student where age<25; +----+----------+----------+ | id | name | salary | +----+----------+----------+ | 1 | xianqian | 21000.00 | | 2 | xiaoming | 16000.20 | | 6 | tom | 13000.40 | | 8 | bullen | 8000.20 | +----+----------+----------+ 4 rows in set (0.00 sec) mysql> select * from it_student where salary >=20000; +----+----------+------+-------+----------+---------+ | id | name | age | sex | salary | subject | +----+----------+------+-------+----------+---------+ | 1 | xianqian | 20 | woman | 21000.00 | tester | | 7 | jerry | 27 | woman | 21000.00 | tester | +----+----------+------+-------+----------+---------+ 2 rows in set (0.00 sec) mysql> select * from it_student where salary <=18000; +----+----------+------+------+----------+---------+ | id | name | age | sex | salary | subject | +----+----------+------+------+----------+---------+ | 2 | xiaoming | 24 | man | 16000.20 | java | | 3 | laowang | 29 | man | 15000.00 | java | | 4 | laowen | 26 | man | 10000.00 | yunwei | | 5 | laotian | 26 | man | 14000.00 | pthon | | 6 | tom | 24 | man | 13000.40 | java | | 8 | bullen | 22 | man | 8000.20 | pthon | +----+----------+------+------+----------+---------+ 6 rows in set (0.00 sec)
注意:当列值为null时,不能使用比较符号,需要使用field is null 或者field is not null
mysql> select * from it_student where sex is null; Empty set (0.01 sec) mysql> select * from it_student where age is not null; +----+----------+------+-------+----------+---------+ | id | name | age | sex | salary | subject | +----+----------+------+-------+----------+---------+ | 1 | xianqian | 20 | woman | 21000.00 | tester | | 2 | xiaoming | 24 | man | 16000.20 | java | | 3 | laowang | 29 | man | 15000.00 | java | | 4 | laowen | 26 | man | 10000.00 | yunwei | | 5 | laotian | 26 | man | 14000.00 | pthon | | 6 | tom | 24 | man | 13000.40 | java | | 7 | jerry | 27 | woman | 21000.00 | tester | | 8 | bullen | 22 | man | 8000.20 | pthon | +----+----------+------+-------+----------+---------+ 8 rows in set (0.00 sec)
(2)模糊匹配
mysql> select * from it_student where name like 'lao%'; +----+---------+------+------+----------+---------+ | id | name | age | sex | salary | subject | +----+---------+------+------+----------+---------+ | 3 | laowang | 29 | man | 15000.00 | java | | 4 | laowen | 26 | man | 10000.00 | yunwei | | 5 | laotian | 26 | man | 14000.00 | pthon | +----+---------+------+------+----------+---------+ 3 rows in set (0.00 sec) mysql> select * from it_student where name like '___'; +----+------+------+------+----------+---------+ | id | name | age | sex | salary | subject | +----+------+------+------+----------+---------+ | 6 | tom | 24 | man | 13000.40 | java | +----+------+------+------+----------+---------+ 1 row in set (0.00 sec)
(3)逻辑符号使用
select * from it_student where name='xianqian' or sex='woman';
select * from it_student where sex = 'woman' and age <25;
select * from it_student where not sex = 'woman';
mysql> select * from it_student where name='xianqian' or sex='woman'; +----+----------+------+-------+----------+---------+ | id | name | age | sex | salary | subject | +----+----------+------+-------+----------+---------+ | 1 | xianqian | 20 | woman | 21000.00 | tester | | 7 | jerry | 27 | woman | 21000.00 | tester | +----+----------+------+-------+----------+---------+ 2 rows in set (0.00 sec) mysql> select * from it_student where sex = 'woman' and age <25; +----+----------+------+-------+----------+---------+ | id | name | age | sex | salary | subject | +----+----------+------+-------+----------+---------+ | 1 | xianqian | 20 | woman | 21000.00 | tester | +----+----------+------+-------+----------+---------+ 1 row in set (0.01 sec) mysql> select * from it_student where not sex = 'woman'; +----+----------+------+------+----------+---------+ | id | name | age | sex | salary | subject | +----+----------+------+------+----------+---------+ | 2 | xiaoming | 24 | man | 16000.20 | java | | 3 | laowang | 29 | man | 15000.00 | java | | 4 | laowen | 26 | man | 10000.00 | yunwei | | 5 | laotian | 26 | man | 14000.00 | pthon | | 6 | tom | 24 | man | 13000.40 | java | | 8 | bullen | 22 | man | 8000.20 | pthon | +----+----------+------+------+----------+---------+ 6 rows in set (0.00 sec)
(4)判断范围
select * from it_student where age between 22 and 27;
select * from it_student where subject in ('java','python');
select * from it_student where subject not in ('php','yunwei','java');
mysql> select * from it_student where age between 22 and 27; +----+----------+------+-------+----------+---------+ | id | name | age | sex | salary | subject | +----+----------+------+-------+----------+---------+ | 2 | xiaoming | 24 | man | 16000.20 | java | | 4 | laowen | 26 | man | 10000.00 | yunwei | | 5 | laotian | 26 | man | 14000.00 | pthon | | 6 | tom | 24 | man | 13000.40 | java | | 7 | jerry | 27 | woman | 21000.00 | tester | | 8 | bullen | 22 | man | 8000.20 | pthon | +----+----------+------+-------+----------+---------+ 6 rows in set (0.00 sec) mysql> select * from it_student where subject in ('java','python'); +----+----------+------+------+----------+---------+ | id | name | age | sex | salary | subject | +----+----------+------+------+----------+---------+ | 2 | xiaoming | 24 | man | 16000.20 | java | | 3 | laowang | 29 | man | 15000.00 | java | | 6 | tom | 24 | man | 13000.40 | java | +----+----------+------+------+----------+---------+ 3 rows in set (0.00 sec) mysql> select * from it_student where subject not in ('php','yunwei','java'); +----+----------+------+-------+----------+---------+ | id | name | age | sex | salary | subject | +----+----------+------+-------+----------+---------+ | 1 | xianqian | 20 | woman | 21000.00 | tester | | 5 | laotian | 26 | man | 14000.00 | pthon | | 7 | jerry | 27 | woman | 21000.00 | tester | | 8 | bullen | 22 | man | 8000.20 | pthon | +----+----------+------+-------+----------+---------+ 4 rows in set (0.00 sec)
(5)其他符号使用
select distinct name from it_student;
select * from it_student where name regexp '^xian';
select * from it_student where name regexp 'qian$';
mysql> select distinct name from it_student; +----------+ | name | +----------+ | xianqian | | xiaoming | | laowang | | laowen | | laotian | | tom | | jerry | | bullen | +----------+ 8 rows in set (0.00 sec) mysql> select * from it_student where name regexp '^xian'; +----+----------+------+-------+----------+---------+ | id | name | age | sex | salary | subject | +----+----------+------+-------+----------+---------+ | 1 | xianqian | 20 | woman | 21000.00 | tester | +----+----------+------+-------+----------+---------+ 1 row in set (0.01 sec) mysql> select * from it_student where name regexp 'qian$'; +----+----------+------+-------+----------+---------+ | id | name | age | sex | salary | subject | +----+----------+------+-------+----------+---------+ | 1 | xianqian | 20 | woman | 21000.00 | tester | +----+----------+------+-------+----------+---------+ 1 row in set (0.00 sec)
二.SQL查询中的五子句
顺序:where 条件 group by field having 条件 order by field limit 条件
1.where子句可以对列进行过滤,只将满足条件的记录输出,在上面高级查询中都是使用where过滤
2.group by field子句
(1)group by field:field为表中的某一列,表示以该列进行分组,可以统计每一个分组的信息,通常会和一些统计函数联合使用,单独使用得到的数据没有意义
(2常见的统计函数
max(field):获取field列中的最大值
min(field):获取field列中的最小值
sum(field):获取filed列数据的总和
avg(field):获取filed列的平均值
count(*):获取记录的行数
案例:
select max(salary) from it_student;
select min(age) from it_student;
select sum(salary) from it_student;
select avg(salary) from it_student;
select count(*) from it_student;
mysql> select max(salary) from it_student; +-------------+ | max(salary) | +-------------+ | 21000.00 | +-------------+ 1 row in set (0.00 sec) mysql> select min(age) from it_student; +----------+ | min(age) | +----------+ | 20 | +----------+ 1 row in set (0.01 sec) mysql> select sum(salary) from it_student; +-------------+ | sum(salary) | +-------------+ | 118000.80 | +-------------+ 1 row in set (0.00 sec) mysql> select avg(salary) from it_student; +--------------+ | avg(salary) | +--------------+ | 14750.100000 | +--------------+ 1 row in set (0.00 sec) mysql> select count(*) from it_student; +----------+ | count(*) | +----------+ | 8 | +----------+ 1 row in set (0.01 sec)
(3)group by和统计函数的联合使用
select subject,count(*),sum(salary) from it_student group by subject;
select sex ,avg(salary) from it_student group by sex;
mysql> select subject,count(*),sum(salary) from it_student group by subject; +---------+----------+-------------+ | subject | count(*) | sum(salary) | +---------+----------+-------------+ | java | 3 | 44000.60 | | pthon | 2 | 22000.20 | | tester | 2 | 42000.00 | | yunwei | 1 | 10000.00 | +---------+----------+-------------+ 4 rows in set (0.00 sec) mysql> select sex ,avg(salary) from it_student group by sex; +-------+--------------+ | sex | avg(salary) | +-------+--------------+ | man | 12666.800000 | | woman | 21000.000000 | +-------+--------------+ 2 rows in set (0.00 sec)
3.having子句
having子句功能和where类似,可以过滤。不同的是having可以对分组后的结果集进行过滤,where不行
一般,可以通过where过滤列的都可以通过having过滤
案例:
select * from it_student having age between 23 and 27;
select subject,count(*) from it_student group by subject having count(*) >=2;
mysql> select * from it_student having age between 23 and 27; +----+----------+------+-------+----------+---------+ | id | name | age | sex | salary | subject | +----+----------+------+-------+----------+---------+ | 2 | xiaoming | 24 | man | 16000.20 | java | | 4 | laowen | 26 | man | 10000.00 | yunwei | | 5 | laotian | 26 | man | 14000.00 | pthon | | 6 | tom | 24 | man | 13000.40 | java | | 7 | jerry | 27 | woman | 21000.00 | tester | +----+----------+------+-------+----------+---------+ 5 rows in set (0.00 sec) mysql> select subject,count(*) from it_student group by subject having count(*) >=2; +---------+----------+ | subject | count(*) | +---------+----------+ | java | 3 | | pthon | 2 | | tester | 2 | +---------+----------+ 3 rows in set (0.00 sec)
4.order by 子句
order by field:可以对field列进行排序,默认是升序
order by field asc;升序排列,可以不写asc
order by field desc;降序排列
注意:可以排序字符串,数字,日期
案例:
select * from it_student order by salary;
select id, name, age, salary from it_student order by age desc;
mysql> select * from it_student order by salary; +----+----------+------+-------+----------+---------+ | id | name | age | sex | salary | subject | +----+----------+------+-------+----------+---------+ | 8 | bullen | 22 | man | 8000.20 | pthon | | 4 | laowen | 26 | man | 10000.00 | yunwei | | 6 | tom | 24 | man | 13000.40 | java | | 5 | laotian | 26 | man | 14000.00 | pthon | | 3 | laowang | 29 | man | 15000.00 | java | | 2 | xiaoming | 24 | man | 16000.20 | java | | 1 | xianqian | 20 | woman | 21000.00 | tester | | 7 | jerry | 27 | woman | 21000.00 | tester | +----+----------+------+-------+----------+---------+ 8 rows in set (0.00 sec) mysql> select id, name, age, salary from it_student order by age desc; +----+----------+------+----------+ | id | name | age | salary | +----+----------+------+----------+ | 3 | laowang | 29 | 15000.00 | | 7 | jerry | 27 | 21000.00 | | 4 | laowen | 26 | 10000.00 | | 5 | laotian | 26 | 14000.00 | | 2 | xiaoming | 24 | 16000.20 | | 6 | tom | 24 | 13000.40 | | 8 | bullen | 22 | 8000.20 | | 1 | xianqian | 20 | 21000.00 | +----+----------+------+----------+ 8 rows in set (0.00 sec)
5.limit,限制,可用于分页展示
limit 可以限制输出的记录数及从哪里开始输出
格式1:limit 数字n 输出前n条数据
格式2:limit 偏移量m 数字n 偏移量从0开始计算,0表示第一条记录,1表示第二条记录...,从第m+1条记录开始输出,共输出n条记录
select * from it_student order by salary desc limit 4; #显示工资最高的四位员工
select * from it_student order by age limit 5; #显示年龄最小的五位员工
select id,name,salary from it_student limit 3,3; #显示第4,5,6条数据
mysql> select * from it_student order by salary desc limit 4; +----+----------+------+-------+----------+---------+ | id | name | age | sex | salary | subject | +----+----------+------+-------+----------+---------+ | 1 | xianqian | 20 | woman | 21000.00 | tester | | 7 | jerry | 27 | woman | 21000.00 | tester | | 2 | xiaoming | 24 | man | 16000.20 | java | | 3 | laowang | 29 | man | 15000.00 | java | +----+----------+------+-------+----------+---------+ 4 rows in set (0.00 sec) mysql> select * from it_student order by age limit 5; +----+----------+------+-------+----------+---------+ | id | name | age | sex | salary | subject | +----+----------+------+-------+----------+---------+ | 1 | xianqian | 20 | woman | 21000.00 | tester | | 8 | bullen | 22 | man | 8000.20 | pthon | | 2 | xiaoming | 24 | man | 16000.20 | java | | 6 | tom | 24 | man | 13000.40 | java | | 4 | laowen | 26 | man | 10000.00 | yunwei | +----+----------+------+-------+----------+---------+ 5 rows in set (0.00 sec) mysql> select id,name,salary from it_student limit 3,3; +----+---------+----------+ | id | name | salary | +----+---------+----------+ | 4 | laowen | 10000.00 | | 5 | laotian | 14000.00 | | 6 | tom | 13000.40 | +----+---------+----------+ 3 rows in set (0.00 sec)
三.四则运算和合并函数
1.四则运算
mysql> select 2+3; +-----+ | 2+3 | +-----+ | 5 | +-----+ 1 row in set (0.00 sec) mysql> select 3-4; +-----+ | 3-4 | +-----+ | -1 | +-----+ 1 row in set (0.00 sec) mysql> select 9/4; +--------+ | 9/4 | +--------+ | 2.2500 | +--------+ 1 row in set (0.00 sec) mysql> select 2*8; +-----+ | 2*8 | +-----+ | 16 | +-----+ 1 row in set (0.00 sec)
也可以使用from dual;dual被称为万能表,它里面可以看作什么都没有
mysql> select 4+5 from dual; +-----+ | 4+5 | +-----+ | 9 | +-----+ 1 row in set (0.00 sec)
2.合并函数
concat()函数可以将括号中的所有参数按顺序连接起来
select concat(name,'=',salary) from it_student;
mysql> select concat(name,'=',salary) from it_student; +-------------------------+ | concat(name,'=',salary) | +-------------------------+ | xianqian=21000.00 | | xiaoming=16000.20 | | laowang=15000.00 | | laowen=10000.00 | | laotian=14000.00 | | tom=13000.40 | | jerry=21000.00 | | bullen=8000.20 | +-------------------------+ 8 rows in set (0.00 sec)
四.多表查询(后续补充)
1.内连接
select * from t1,t2 where t1.name = t2.name;
select * from t1,t2 where t1 inner join t2 on t1.name = t2.name;
2.外连接(左外连接和右外连接)
select * from t1,t2 where t1 left join t2 on t1.name = t2.name;
select * from t1,t2 where t1 right join t2 on t1.name = t2.name;