【MySQL笔记】数据库的查询

数据库的查询

注:文中 [ ...] 代表该部分可以去掉。

理论基础:对表对象的一组关系运算,即选择(selection)、投影(projection)和连接(join)

1、select语句

子语句顺序:

select  [distinct | distinctRow | all]    ----distinct关键字会在结果集中去掉重复的值而只保留一个值,否则有重复值

from

where

group by

having

order by                                            ----order by中加入关键字desc,升序则加入关键字asc,默认是升序

limit

procedure

into outfile ‘filename‘                        ----格式的select语句将选择的行写入一个文件,文件在服务器上被创建,并且不能是已经存在的,且在服务器主机上

                          还必须有file权限以使用这种select

2、列的选择与指定

2.1 基本查询:

  1. select * from table;

2.2 定义并使用列的别名:(注:where子句不允许有列别名)

  1. select colname1,colname2 as 第二列, colname3 from table;

2.3 更改查询结果数据表:

  1. select cust_name,
  2. case
  3. when cust_sex=‘M‘ then ‘男‘
  4. else ‘女‘
  5. end [as 性别]
  6. from table;

2.4 查询+计算:查询cust_i列加上100后的值

  1. select cust_name,cust_sex,cust_id+100
  2. from table;

2.5 聚合函数(aggregation function):一般和group by子句连用,否则只返回一行结果

注:除count以外的函数都会忽略空值。

2.5.1常用聚合函数有

2.5.2MySQL的行转列、列转行、连接字符串  concat、concat_ws、group_concat函数

2.5.2.3GROUP_CONCAT函数

1)格式

GROUP_CONCAT([DISTINCT] expr [,expr ...] [ORDER BY {unsigned_integer | col_name | expr} [ASC |DESC] [,col_name ...]] [SEPARATOR str_val])

2)例子

  1. SELECT student_id, GROUP_CONCAT(courses_id) AS courses FROM student_courses
  2. WHERE student_id=2
  3. GROUP BY student_id;

结果

+------------   +---------   +

| student_id | courses |

+------------   +---------   +

| 2                 | 3,4,5      |

+------------   +---------   +

3)修改自定义分隔符,默认是以“,”作为分隔符,若要改为“|||”,则使用SEPARATOR来指定,例如:

  1. SELECT student_id, GROUP_CONCAT(courses_id SEPARATOR ‘|||‘) AS courses FROM student_courses
  2. WHERE student_id=2
  3. GROUP BY student_id;

+------------   +---------   +

| student_id | courses |

+------------   +---------   +

| 2                 | 3|||4|||5   |

+------------   +---------   +

4)排序再连接成字符串,例如按courses_id降序来排:

  1. SELECT student_id, GROUP_CONCAT(courses_id ORDER BY courses_id DESC) AS courses FROM student_courses
  2. WHERE student_id=2
  3. GROUP BY student_id;

+------------   +---------   +

| student_id | courses |

+------------   +---------   +

| 2                 | 5,4,3      |

+------------   +---------   +

2.5.2.4GROUP_CONCAT注意事项

1)int字段的连接陷阱:当你用group_concat的时候请注意,连接起来的字段如果是int型,一定要转换成char再拼起来,否则在你执行后(ExecuteScalar或者其它任何执行SQL返回结果的方法)返回的将不是一个逗号隔开的串,而是byte[]。

解决办法:CAST() 和CONVERT() 函数可用来获取一个类型的值,并产生另一个类型的值。

CAST(expr AS type), CONVERT(expr,type) , CONVERT(expr USING transcoding_name)

这个类型type可以是以下值其中的 一个:

BINARY[(N)]

CHAR[(N)]

DATE

DATETIME

DECIMAL

SIGNED [INTEGER]

TIME

UNSIGNED [INTEGER]

2)长度陷阱:用了group_concat后,select里如果使用了limit是不起作用的。用group_concat连接字段的时候是有长度限制的,并不是有多少连多少。但你可以设置一下。

使用group_concat_max_len系统变量,你可以设置允许的最大长度。程序中进行这项操作的语法如下,其中 val 是一个无符号整数:

SET [SESSION | GLOBAL] group_concat_max_len = val;

若已经设置了最大长度,则结果被截至这个最大长度。在SQLyog中执行 SET GLOBAL group_concat_max_len = 10 后,重新打开SQLyog,设置就会生效。

参考链接:

http://blog.sina.com.cn/s/blog_4e808acf01009qna.html

http://blog.csdn.net/aya19880214/article/details/41280893

其它实例:

http://www.cnblogs.com/lhj588/p/3315876.html

http://www.cnblogs.com/dyfzwj/archive/2012/08/25/2655694.html

2.6 From子句与连接表

1、交叉连接(笛卡尔积,也称没有连接no join),连接后行数为两表行数相乘,FROM子句中关键字:CROSS JOIN。

2、内连接:系统默认的表连接。FROM子句中关键字:INNER JOIN 或者 JOIN。ON子句设置连接的条件。WHERE子句过滤最终表内容

3、相等连接是内连接的一种,ON子句后用运算符“=”。FROM子句中关键字:INNER JOIN 或者 JOIN

4、不等连接也是内连接的一种,ON子句后用除“=”以外的比较运算符。FROM子句中关键字:INNER JOIN 或者 JOIN

5、自连接也是内连接的一种,将表与自身相连。FROM子句中关键字:INNER JOIN 或者 JOIN

6、自然连接:两张表中名称都相同时,返回笛卡儿积的结果集。FROM子句中关键字:NATURAL JOIN。

7、外连接:连接的两张表分别为基表和参考表,以基表为依据返回满足和不满足条件的记录。

左外连接:左边为基表,可以一对多关系的连接。左表有而右表没有的情况,会将右表的列设为NULL。FROM子句中关键字:LEFT [OUTER] JOIN。

右外连接:同上。

  • 内、外连接的区别:内连接连接的左右表共有的,外连接会以基表为依据连接,返回结果最少也有基表行条数据。

2.7 Where子句与文本匹配

1、比较运算:

1)any 是任意一个

例:查询出01班中,年龄大于 02班所有人的同学

  1. select * from student where 班级=‘01‘ and age > all (select age from student where 班级=‘02‘);

等同于:

  1. select * from student where 班级=‘01‘ and age > (select max(age) from student where 班级=‘02‘);

2)all 是所有

例:查询出01班中,年龄大于 02班任意一个的同学

  1. select * from student where 班级=‘01‘ and age > any (select age from student where 班级=‘02‘);

等同于:

  1. select * from student where 班级=‘01‘ and age > (select min(age) from student where 班级=‘02‘);

注:“=”是等于运算符;

当两个表达式值中有一个为空值或都为空值时,则返回UNKNOWN;

当使用“<=>”,若两个表达式相等或者都为空值,返回TRUE,若表达式不相等或者其中一个为空值,则返回FALSE。不会返回UNKNOWN!

2、字符串匹配:LIKE语句

常用通配符:

1、%:表示任何字符串,可出现任何次数(包括0次)

2、_:只用匹配单个字符,不是多个也不是0个

3、ESCAPE指定转义字符,来临时改变通配符的作用和意义。如下,ESCAPE指定转义字符‘#’,改变‘_’原有的特殊作用,使其在搜索模式中成为一个普通字符。

  1. select colname from table
  2. where colname like ‘%#_%‘ escape ‘#‘;

注意事项:

  • 不要过度使用通配符,通配符检索的处理一般会比其他检索花费更长的时间。
  • 尽量不要把通配符用在搜索模式的开始处,否则会使检索更慢。
3、文本匹配:

正则表达式是用来匹配文本的特殊串或字符集合,是文本匹配运算中的一种搜索模式。使用关键字REGEXP指定正则表达式。使用正则表达式进行文本匹配需要注意大小写。

1)基本字符匹配

  1. select colname from table
  2. where colname regexp ‘市‘;

等同于字符串匹配:

  1. select colname from table
  2. where colname like ‘%市%‘;

2)选择匹配:”|“

3)范围匹配”[a-d]

4)特殊字符匹配:"\\"+特殊字符

5)字符类匹配:"[:upper:]"表示任意大写字母

6)重复匹配:p73

7)定位符匹配:

4、判定范围

1)BETWEEN AND

  1. select * from tabel
  2. where colname between 1 and 3;

2)IN 和 NOT IN

  1. select * from table
  2. where colname in (1,2.3);
5、子查询

多层查询时,MySQL会从内层向外向上移动到外层(主)查询,在这个过程中每个查询结果集都赋值给包围它的父查询,接着父查询也会把结果集赋值给它的父查询。

1)结合关键字 IN 和 NOT IN 使用的子查询

2)结合比较运算符使用的子查询

比较运算符以及{ALL|SOME|ANY}(SOME和ANY同意)

3)结合关键字EXIST使用的子查询,子查询返回逻辑值,若为True,父查询才进行查询。

用于判断子查询的结果是否为空

6、UNION语句与联合查询

同时执行多个查询,并将结构作为单个查询结果集返回。

1)UNION:去除重复值

2)UNION ALL:不去除重复值

2.8 Group by 和 Having子句

1)GROUP BY:将结果集中的数据行根据选择列的值进行逻辑分组

ASC|DESC:排序

WITH ROLLUP:计算各分组的汇总行

2)HAVING:查询结果集中,过滤结果,必须跟在Group by后面!

  • Where 和 Having的区别:Where子句过滤数据行,是在数据分组之前进行的过滤,Having子句过滤分组,且可以包含聚合函数,是在分组进行后过滤。

2.9其它子句

1)Order by子句:排序

  1. select colname from table
  2. order by colname1 DESC, colname2 ASC;

2)Limit子句:限制select返回行数:limit [offset] row_count

如果给定1个参数,它指出返回行的最大数目;如果给定2个参数,第一个指定要返回的第一行的偏移量,第二个指定返回行的最大数目,初始行的偏移量是0。

如下返回从第5位用户(偏移4位)开始的3位客户

  1. select cust_id from table
  2. order by cust_id
  3. limit 4,3;

参考资料:

21分钟 MySQL 入门教程http://www.cnblogs.com/mr-wid/archive/2013/05/09/3068229.html#c2

菜鸟教程:http://www.runoob.com/mysql/mysql-install.html

来自为知笔记(Wiz)

时间: 2024-10-17 18:09:26

【MySQL笔记】数据库的查询的相关文章

mysql笔记--数据库基本增删改查 修改表结构

数据库基本增删改查 1. 增-添加/插入数据,insert into 插入哪张表,那些列,什么值, 语句:insert into 表名(列1,列2,列3)values (值1,值2,值3): 可以不按原列的顺序插入,也可以插入部分列,但是值与列要一一对应,不能混乱!!! 一次插入多行数据 : Insert into 表名(列1,列2)values (值1,值2),(值1,值2): 2. 改-更新数据update 更新哪张表,哪些列,哪些值 语句:update 表名 set 列1=值1,列2=值2

MySQL笔记:数据查询

一.基本查询语句 WHERE:按照指定的条件进行查询,如果没有WHERE默认查询所有记录. GROUP BY:按照指定字段进行分组,若存在HAVING则只有满足HAVING指定的条件才能输出. ORDER BY:按照指定字段进行排序,支持ASC和DESC排序方式.默认情况下为ASC(升序). CREATE DATABASE MYDB; USE MYDB; CREATE TABLE STUDENT ( NUMBER INT PRIMARY KEY, NAME CHAR(20) NOT NULL,

mysql导入数据库进程查询命令

导入数据需要占用一个终端,需要重新开启另一个终端查询 [[email protected] ~]# mysqladmin -uroot -p123456 pro 导完以后可以看到类似以下的界面,如果没有导完,会显示正在insert...... 原文地址:http://blog.51cto.com/13590962/2157287

《高性能MySQL》读书笔记--查询缓存

1.MySQL查询缓存 很多数据库产品都能够缓存查询的执行计划,对于相同类型的SQL就可以跳过SQL解析和执行计划生成阶段.MySQL还有另一种不同的缓存类型:缓存完整的SELECT查询结果,也就是"查询缓存". 查询缓存系统会跟踪查询中涉及的每个表,如果这些表发生变化,那么和这个表相关的所有的缓存数据都将失效. 查询缓存对应用程序是完全透明的.应用程序无须关心MySQL是通过查询缓存返回的结果还是实际执行返回的结果. 另外,随着现在的通用服务器越来越强大,查询缓存可能是一个影响服务器

mysql笔记1_数据库发展史

数据库发展史 萌芽阶段--文件系统 初级阶段--第一代数据库:网状模型.层次模型的数据库. 中级阶段--第二代数据库:关系型数据库和结构化查询语句. 高级阶段--第三代数据库:“关系-对象”型数据库. 数据库管理系统(DBMS) SQL(Strutured Query Language)结构化查询语言 DDL(Data Definition Language)数据定义语言 DML(Data Management Language)数据操作语言.mysql自动提交(auto commit),Ora

笔记:PHP查询mysql数据后中文字符乱码

新建表Clubs CREATE TABLE `Clubs` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(30) CHARACTER SET utf8 NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; id name 1 程序员2 架构师3 产品经

MySQL学习笔记-数据库文件

数据库文件 MySQL主要文件类型有如下几种 参数文件:my.cnf--MySQL实例启动的时候在哪里可以找到数据库文件,并且指定某些初始化参数,这些参数定义了某种内存结构的大小等设置,还介绍了参数类型以及定义作用域: 日志文件:记录MySQL对某种条件做出响应时候写入的文件,包括错误日志.查询日志.慢查询日志.二进制日志: Mysql表结构文件:存放MySQL表结构定义文件,不论采用何种存储引擎,MySQL都有一个以frm为后缀名的文件: Socket文件:当用linux的MySQL命令行窗口

《高性能MySQL》读书笔记--查询性能优化

对于高性能数据库操作,只靠设计最优的库表结构.建立最好的索引是不够的,还需要合理的设计查询.如果查询写得很糟糕,即使库表结构再合理.索引再合适,也无法实现高性能.查询优化.索引优化.库表结构优化需要齐头并进,一个不落. 6.1 为什么查询速度会慢 通常来说,查询的生命周期大致可以按照顺序来看:从客户端>>服务器>>在服务器上进行解析>>生成执行计划>>执行>>返回结果给客户端.其中执行可以认为是整个生命周期中最重要的阶段,这其中包括了大量为了检索

MySQL、SqlServer、Oracle三大主流数据库分页查询 (MySQL分页不能用top,因为不支持)

一. MySQL 数据库 分页查询MySQL数据库实现分页比较简单,提供了 LIMIT函数.一般只需要直接写到sql语句后面就行了.LIMIT子 句可以用来限制由SELECT语句返回过来的数据数量,它有一个或两个参数,如果给出两个参数, 第一个参数指定返回的第一行在所有数据中的位置,从0开始(注意不是1),第二个参数指定最多返回行数.例如:select * from table WHERE … LIMIT 10; #返回前10行select * from table WHERE … LIMIT