MySQL查询

基本查询语法

SELECT 查询内容(查询所有字段 SELECT * FROM 表名,*通配符表示所有字段)

FROM 表名

WHERE 表达式

GROUP BY 字段名(一般GROUP BY 是和聚合函数配合使用的)

HAVING 表达式(HAVING关键字都用于设置条件表达式对查询结果进行过滤,区别是HAVING后面可以跟聚合函数,而WHERE不能,通常HAVING关键字都与GROUP BY一起使用,表示对分组后数据进行过滤)

ORDEY BY 表达式

ORDEY BY 字段名(按照某个字段进行排序)

LIMIT 记录数(查询的条数,可以限制每次查询多少条数据)

数据过滤

数据过滤用在WHERE表达式里,通常的有基本查询过滤、条件查询过滤、模糊查询过滤、字段控制查询过滤以及正则表达式查询过滤。

基本查询过滤

可以用来查询过滤所有字段的数据或指定多个字段的数据。

条件查询过滤

条件查询过滤关键字为AND、OR、IN、NOT IN、IS NULL、IS NOT NULL、BETWEEN AND 。按关键字可以进行条件查询。

(1)AND:用AND进行查询的时候,查询出来的数据要求条件都的满足。

SELECT * FROM user WHERE age=20 and name='kevin';

(2)OR:只要满足一个要求。

SELECT * FROM user WHERE age=20 or name='kevin';

(3)IN(在范围内):查询出来的数据在这个范围内。

SELECT * FROM user WHERE id in (3,5,7);

(4)NOT IN(不在范围内):查询出来的数据不在这个范围内。

SELECT * FROM user WHERE id not in (3,5,7);

(5)IS(为空):用IS NULL进行查询的时候,用来查询某字段为空时用is null,而不用“=null”,因为MySQL中的null不等于任何其他值,也不等于另外一个null,优化器会把“=null”的查询条件过滤掉而不返回任何数据,查询某字段为非空时使用is not null。

SELECT * FROM user WHERE name is null;

(6)BETWEEN AND(在....区间):用BETWEEN AND 进行查询的时候,查询出来的数据在这个区间。

SELECT * FROM user WHERE age between 10 and 20;

模糊查询过滤

模糊查询过滤使用关键字LIKE进行查询。

(1)LIKE‘张%’:使用LIKE查询该字段以“张”开头的数据。

SELECT * FROM user name like '张%';

(2)LIKE '%明':使用LIKE查询该字段以“明”结尾的数据。

SELECT * FROM user name like '%明';

(3)LIKE'%明%':使用LIKE查询该字段包含“明”的数据。

字段控制查询过滤

字段控制查询过滤可以使用DISTINCT去除重复过滤,使用AS设置别名。

(1)DISTINCT:去除重复列值。

SELECT distinct age FROM user;

(2)AS:可以设置列的别名,也可以省略AS来设置关键字。

SELECT name as 姓名 FROM user;或者 SELECT name 姓名 FROM user;

正则表达式查询过滤

子查询

子查询是一个父类表达式调用另一个子表达式结果的查询操作,子表达式结果传给父表达式继续处理,子查询也被称为内嵌查询或者内部查询。

子查询可以包含普通SELECT 可以包含的任何子句,如distinct、GROUP BY、ORDEY BY、LIMIT、JOIN和UNION等;但对应的外部查询必须是以下语句之一:SELECT、INSERT、UPDATE、DELETE、set或者do。

按返回结果分类的子查询

(1)表子查询:返回的结果集有多行(至少一行)数据组成,作为表子查询要设置表的别名,常用于父查询的FROM子句中。

SELECT * FROM (SELECT (2)sex,age FROM user WHERE age>20) as user20;

(2)行子查询:返回结果集由一行数据组成,一行数据库里可以包含多列数据,常用于父查询的FROM子句中或者WHERE子句中。

SELECT * FROM user WHERE sex=(SELECT sex FROM user WHERE name='david');

(3)列子查询:返回的结果集有多行一列数据组成,可以使用in、any、all操作符。

in在指定项内,同IN(项1、项2...);any与比较操作符联合使用,any关键字必须接在一个表操作符的后面,表示与子查询返回的任何值比较为true,则返回true;all与比较操作符联合使用,all关键字必须接在一个比较操作符的后面,表示与子查询返回的所有值比较都为true,则返回true。

查询性别为女的id和name:

select id,name from user where id in (select id from user where sex='女');

查询年龄大于David的用户的id、name、age:

select id,name,age from user where age>any(select age from user where name='david');

查询年龄最小的用户:

select * from user where age<=all(select age from user);

(4)标量子查询:返回的结果集是一个标量集合,一行一列,也就是一个标量值;每个标量子查询也是一个行子查询和一个列子查询,反之则不是;每个行子查询和列子查询也是一个表子查询,反之则不是。

按返回结果的调用方法分类的子查询

(1)WHERE型子查询:把内层查询的结果作为外层查询的条件。

查询比小刚年龄大的用户:

select *from user where age>(SELECT AGE FROM USER NAME='小刚');

(2)FROM型子查询:将返回的结果集作为一个临时表,临时表要设置别名,然后再临时表中进行查询。

查询性别为男并且年龄大于12岁的用户:

select * from (select name,loginName,age,password from user where sex='男') as temp where temp.age>12;

(3)exists型子查询:把外层查询结果拿到内层,看内层的查询是否成立,使用exists关键字,内层查询语句不反悔查询的记录,而是返回一个真假值。

查询用户密码存在111111:

select * from user where exists(select * from user where password=111111');

聚合函数

AVG()函数:用来计算某列的平均值,如可以用于计算平均数、平均分数等。

select avg(age) from user;

COUNT()函数:计算表中记录的个数或者列中值的个数。

select count(*) from user where age>20;

MAX()/MIN()函数:用于选取数据中的最大值和最小值。

select max(age) from user;

select min(age) from user;

SUM()函数:用于计算满足条件的某一列的总和。

select sum(age) from user;

高级查询

内连接查询

内连接查询分为等值连接查询和非等值连接查询,使用关键字inner JOIN ON 。inner可以省略。他是从左表中取出每一条记录,去与右表中所有的记录进行匹配,匹配成功后才会保留结果,否则不保留。

select * from 左表 [INNER] JOIN 右表 ON 右表.字段=右表.字段;

(1)on关键字表示连接条件,条件字段代表相同的业务含义,如user.id和score.id。

(2)内连接可以没有连接条件,没有ON之后的内容,这样会保留所有结果。

(3)内连接可以使用WHERE代替ON,通常不用WHERE,因为WHERE没有ON效率高。ON指匹配到第一条成功记录后就结束,其他记录不匹配,若没有,则不进行匹配;而WHERE会一直匹配,并进行判断。

(4)等值连接:指使用等号“=”比较两个表的连接列的值,取两表连接列的值相等的记录。

(5)非等值连接:指使用大于号或者小于号比较两个表的连接列的值,取一个表大于或小于另一个表的连接列值的记录。

外连接查询

分为左外连接和右外连接查询。外连接查询是以一张表为基础,取出里面的所有记录,然后将每条记录与另外一张表进行连接,不管能不能匹配上,最终都保留。也就是能匹配正确保留;不能匹配,其他表的字段都置空null,使用关键字outer JOIN ON j进行连接查询。

select * fro 左表 LEFT/RIGHT JOIN 右表 ON 左表.字段=右表.字段;

(1)LEFT JOIN 也可以写成LEFT OOUTER JOIN ,左连接查询返回左表中符合条件的所有行,如果左表中的某行记录在右表中没有匹配,那么在结果集中,相关右表的列显示为空。

(2)RIGHT JOIN 也可以写成RIGHT OUTER JOIN ,右连接查询返回所有符合条件的右表记录,如果右表中的记录在左表中找不到匹配,那么相关左表的列显示为空

(3)ON后面的条件内容不可以省略。

自然连接查询

自然连接查询在连接的两个表中的列名称相等时才能使用,MySQL以相同名字段作为字段进行匹配,它使用关键字natural JOIN进行自然连接,这种连接很少用。

select * from 左表 left/right inner join 右表 on using(字段名)

自然内连接:

select * from user natural join score;

自然外连接:

select * from user natural left join score;

自然右连接:

select * from user natural right join score;

交叉连接查询

最终结果称为笛卡尔积,使用关键字CROSS JOIN 来进行交叉连接查询。

select * from 左表 CROSS JOIN 右表 或 from 左表,右表;

联合查询

将多次查询结果合并起来进行连接,其字段不会增加,要求两次查询的列数必须一致,列的类型可以不一样,多次SQL语句取出的列名可以不一致,此时以第一个SQL语句的列名为准;使用关键字UNION进行联合查询,会去掉重复的行,使用关键字UNION all 进行联合查询,不会去掉重复的行;ORDEY BY不能直接使用,需要对查询语句使用括号才行,要ORDER BY生效,就必须搭配LIMIT,LIMIT使用限定的最大数即可,推荐放到所有字句之后,及对最终合并的结果来排序或筛选。

SELECT column_name FROM table1

UNION(all)

SELECT column_name FROM table2

联合查询经常用于查询同一个表,但是需求不同,如查询学生信息、男生身高升序、女生身高降序;进行多表查询,多个表结构是完全一样的,保存的数据(结构)也是一样的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值