编程语言
C#编程语言基础
C#面向对象与多线程
C#数据及文件操作
JavaScript基础
JavaScript的数据类型和变量
JavaScript的运算符和表达式
JavaScript的基本流程控制
JavaScript的函数
JavaScript对象编程
JavaScript内置对象和方法
JavaScript的浏览器对象和方法
JavaScript访问HTML DOM对象
JavaScript事件驱动编程
JavaScript与CSS样式表
Ajax与PHP
ECMAScript6的新特性
Vue.js前端开发
PHP的常量与变量
PHP的数据类型与转换
PHP的运算符和优先规则
PHP程序的流程控制语句
PHP的数组操作及函数
PHP的字符串处理与函数
PHP自定义函数
PHP的常用系统函数
PHP的图像处理函数
PHP类编程
PHP的DataTime类
PHP处理XML和JSON
PHP的正则表达式
PHP文件和目录处理
PHP表单处理
PHP处理Cookie和Session
PHP文件上传和下载
PHP加密技术
PHP的Socket编程
PHP国际化编码
MySQL数据库基础
MySQL数据库函数
MySQL数据库账户管理
MySQL数据库基本操作
MySQL数据查询
MySQL存储过程和存储函数
MySQL事务处理和触发器
PHP操作MySQL数据库
数据库抽象层PDO
Smarty模板
ThinkPHP框架
Python语言基础
Python语言结构与控制
Python的函数和模块
Python的复合数据类型
Python面向对象编程
Python的文件操作
Python的异常处理
Python的绘图模块
Python的NumPy模块
Python的SciPy模块
Python的SymPy模块
Python的数据处理
Python操作数据库
Python网络编程
Python图像处理
Python机器学习
TensorFlow深度学习
Tensorflow常用函数
TensorFlow用于卷积网络
生成对抗网络GAN
SELECT语句是最常见的数据库查询语句,功能强大,但使用方式有些复杂,需要详细说明。
SELECT [DISTINCT] [concat(col1,":",col2) as col] selection_list //要查询的内容,选择哪些列
FROM table_list //指定数据表
WHERE primary_constraint //查询时需要满足的条件
GROUP BY grouping_columns //对结果分组
ORDER BY sorting_columns //对结果进行分组
HAVING secondary_constraint //查询时满足的第二条件
LIMIT count //限定输出的查询结果
1.单表查询:
从一张表中查询所需要的数据,查询操作比较简单。
1)查询所有字段:
指查询表中所有字段的数据,使用*代表所有的列。语法:
SELECT * FROM tablename;
2)查询指定字段:
SELECT col_name1,col_name2 FROM tablename;
查询多个字段,使用逗号对字段分隔。示例:
select user,pwd from tb_login;
3)查询指定数据:
如果要从很多记录中查询出指定的记录,就需要一个查询的条件,要使用WHERE子句。WHERE子句经常需要使用一些运算符来设定查询条件。示例:
select * from tb_login where user='mr';
常用比较运算符见表:
运算符 |
名称 |
示例 |
运算符 |
名称 |
示例 |
= |
等于 |
id=5 |
is not null |
n/a |
id is not null |
> |
大于 |
id<5 |
between |
n/a |
id between and 15 |
< |
小于 |
id>5 |
in |
n/a |
id in (3,4,5) |
=> |
大于等于 |
id=>5 |
not in |
n/a |
Name not in(shi,li) |
<= |
小于等于 |
id<=5 |
like |
模式匹配 |
Name like ('%shi%') |
!=或<> |
不等于 |
id!=5 |
not like |
模式匹配 |
Name not like ('%shi%') |
is null |
n/a |
id is null |
regexp |
常规表达式 |
Name 正则表达式 |
⑴带IN关键字的查询:
IN关键字可以判断某个字段的值是否在指定的集合中。示例:
select * from tb_login where user in('mr','lx');
select * from tb_login where user not in('mr','lx');
⑵带BETWEEN AND的范围查询:
BETWEEN AND关键字可以判断某个字段的值是否在指定的范围内。示例:
select * from tb_login where id between 5 and 7;
select * from tb_login where id not between 5 and 7;
⑶带LIKE的字符匹配查询:
LIKE可以实现模糊查询,有两种通配符:%和下划线。其中,%可以匹配零个、一个或多个字符,代表任意长度的字符串;下划线只匹配一个字符,代表任意一个字符。示例:
select * from tb_login where user like '%mr%';
⑷用IS NULL关键字查询空值:
IS NULL关键字可以判断字段的值是否为空值NULL。示例:
select books,row from tb_login where row is null;
4)带AND的多条件查询:
AND关键字可以用来联合多个条件进行查询,查询同时满足多个条件的记录。示例:
select * from tb_login where user='mr' and section='php';
5)带OR的多条件查询:
OR关键字也可以用来联合多个条件进行查询,查询只要满足其中一个条件的记录。示例:
select * from tb_login where section='php' or section='javascript';
6)用DISTINCT关键字去除结果中的重复行:
select distinct name from tb_login;
7)用ORDER BY关键字对查询结果排序:
查询结果可以升序ASC或降序DESC排列,默认为升序排列。示例:
select * from tb_login order by id desc;
8)用GROUP BY关键字分组查询:
通过GROUP BY子句可以将数据划分到不同的组中,实现对记录分组查询。示例:
select id,books,talk from tb_name group by talk;
GROUP BY关键字还可以与GROUP_CONCAT()函数一起使用,将组中的所有字段值都显示出来。示例:
select id,books,GROUP_CONCAT('talk') from tb_name group by talk;
GROUP BY关键字还可以按多个字分组。
9)用LIMIT限制查询结果的数量:
查询数据时,可能会得到很多记录,往往需要限制查询结果的数量。示例:
select * from tb_login order by id asc limit 3;
还可以从结果集中取出中间的一部分,要定义两个参数,参数1是开始读取的第一条记录的编号,参数2是要查询记录的个数。注意查询结果中第一条记录的编号是0。示例:
select * from tb_login where id order by id asc limit 1,2;
2.聚合函数查询:
聚合函数根据一组数据求出一个值,只计算非NULL的值。这些函数包括:
函数 |
说明 |
Avg(字段名) |
获取指定列的平均值 |
Count(字段名) |
如指定一个记录,会统计该字段中非空记录数,如前面使用DISTINCT,则会统计不同值的记录,相同的值当作一条记录。 |
Min(字段名) |
获取指定字段的最小值 |
Max(字段名) |
获取指定字段的最大值 |
Std(字段名) |
指定字段的标准背离值 |
Stdtev(字段名) |
与Std相同 |
Sum(字段名) |
指定字段所有记录的总和 |
1)COUNT()函数:
COUNT()函数对于除*之外的任何参数,返回所选择集合中非NULL值的行的数目;对于参数*,返回选择集合中所有行的数目,包含NULL值的行。没有WHERE的COUNT()函数是经过内部优化的,能够快速返回表中所有的记录总数。示例:
select count(*) from tb_book;
2)SUM()函数:
可以求出表中某个字段取值的总和。示例:
select sum(row) from tb_login;
3)AVG()函数:
可以求出表中某个字段取值的平均值。示例:
select avg(row) from tb_book;
4)MAX()函数:
可以求出表中某个字段取值的最大值。示例:
select max(row) from tb_book;
5)MIN()函数:
可以求出表中某个字段取值的最小值。示例:
select min(row) from tb_book;
3.连接查询:
连接,是把不同表的记录连到一起。连接语句可以以多种高级方法来组合表记录。
1)内连接查询:
内连接是最普遍的连接类型,要求构成连接的每一部分的每个表都匹配,不匹配的行将被排除。最常见的例子是相等连接,也就是连接后的表中的某个字段与每个表中的都相同,最后的结果集只包含参加连接的表中与指定字段相符的行。示例:
select name,books from tb_login,tb_book where tb_login.user=tb_book.user;
2)外连接查询:
外连接是指使用OUTER JOIN关键字将两个表连接起来。外连接生成的结果集不仅包括符合连接条件的行数据,而且还包括左表(左外连接时的表)、右表(右外连接时的表)或两边连接表(全外连接时的表)中所有的数据行。语法:
SELECT col_list FROM tb_name1 LEFT|RIGHT JOIN tb_name2 ON tb_name1.col1=tb_name2.attr2
外连接分左外连接(LEFT JOIN)、右外连接(RIGHT JOIN)和全外连接3种类型。
⑴左外连接LEFT JOIN:
LEFT JOIN是指将左表中的所有数据分别与右表中的每条数据进行连接组合,返回的结果除内连接的数据外,还包括左表中不符合条件的数据,并在右表的相应列中添加NULL值。
select section,tb_login.user,books,row from tb_login left join tb_book on
tb_login.user=tb_book.user;
⑵右外连接RIGHT JOIN:
RIGHT JOIN是指将右表中的所有数据分别与左表中的每条数据进行连接组合,返回的结果除内连接的数据外,还包括右表中不符合条件的数据,并在左表的相应列中添加NULL。
select section,tb_book.user,books,row from tb_book right join tb_login on
tb_book.user=tb_login.user;
3)复合条件连接查询:
在连接查询时,也可以增加其他的限制条件。通过多个条件的复合查询,可以使查询结果更加准确。示例:
select section,tb_login.user,books,row from tb_book,tb_login
where tb_book.user=tb_login.user and row>5;
4.子查询:
子查询就是SELECT查询是另一个查询的附属。MySQL可以嵌套多个查询,在外面一层的查询中使用里面一层查询产生的结果集。当遇到这样的多层查询时,MySQL从最内层的查询开始,然后向外向上移动到外层查询。在这个过程中产生的结果集都被赋给包围它的父查询,接着这个父查询被执行,它的结果也被指定给它的父查询。
子查询可以用在任何可以使用表达式的地方,必须由父查询包围,并且必须包含一个字段列表、一个具有一个或多个表名字的FROM子句以及可选的WHERE、HAVING和GUOUP BY子句。
1)带IN关键字的子查询:
假如一个子查询返回的结果集是值的列表,这时就必须用IN运算符。IN运算符可以检测结果集中是否存在某个特定的值,如果检测成功就执行外部的查询。示例:
select * from tb_login where user in(select user from tb_book);
NOT IN关键字的作用相反。
2)带比较运算符的子查询:
子查询可以使用比较运算符,只有子查询返回的结果列包含一个值时才适用。示例:
select id,books,row from tb_book where row>=(select row from tb_row where id=1);
3)带EXISTS关键字的子查询:
使用EXISTS关键字时,内层查询不返回查询的记录,而是返回一个真假值。如果内层查询语句查询到满足条件的记录,就返回一个真true,否则就返回假false。当返回的值为true时,外层查询语句将进行查询;当返回的为false时,外层查询语句不进行查询或者查询不出任何记录。示例:
select * from tb_row where exists (select * from tb_book where id=27);
select id,books,row from tb_book where row>=90 and exists(select * from tb_row where name='优秀');
NOT EXISTS与EXISTS相反,当返回的值是true时外层查询语句不执行查询,当返回false时外层查询语句将执行查询。
4)带ANY关键字的子查询:
ANY关键字表示满足其中任意一个条件。使用ANY关键字时,只要满足内层查询语句返回的结果中的任意一个,就可以通过该条件来执行外层查询语句。示例:
select books,row from tb_book where row<ANY(select row from tb_row);
5)带ALL关键字的子查询:
ALL关键字表示满足所有条件。使用ALL关键字时,只有满足内层查询语句返回的所有结果,才可以执行外层查询语句。示例:
select books,row from tb_book where row>=ALL(select row from tb_row);
5.合并查询结果:
合并查询结果,是将多个SELECT语句的查询结果合并到一起。合并查询结果使用UNION和UNION ALL关键字。其中,UNION关键字是将所有的查询结果合并到一起,然后去除相同记录;而UNION ALL关键字则只是简单的将结果合并到一起。示例:
select user from tb_book UNION select user from tb_login;
select user from tb_book UNION ALL select user from tb_login;
6.定义别名:
查询时,可以为表和字段取一个别名,这个别名可以代替其指定的表和字段。
1)为表取别名:
当表的名称特别长时,查询中使用表名很不方便,这时可以为表取一个贴切的别名。示例:
select * from tb_program p where p.talk="PHP";
2)为字段取别名:
当查询数据时,MySQL会显示每个输出列的名字。默认情况下,显示的列名是创建表时定义的列名,也可以为这个列取一个别名。示例:
select section AS login_section,name AS login_name from tb_login;
7.使用正则表达式:
正则表达式是用某种模式去匹配一类字符串的一个方式。正则表达式的查询能力比通配字符的查询能力更强大,而且更灵活。
MySQL中使用REGEXP关键字来匹配查询正则表达式。基本形式为:
col_name REGEXP 'expr'
正则表达式支持的匹配字符见下表:
字符 |
含义 |
示例 |
^ |
匹配以特定字符或字符串开头的记录 |
select books from tb_book where books REGEXP '^php' |
$ |
匹配以特定字符或字符串结尾的记录 |
select books from tb_book where books REGEXP 'php$' |
. |
匹配字符串的任意一个字符,包括回车和换行 |
select books from tb_book where books REGEXP 'P.' |
[字符集合] |
匹配字符集合中的任意一个字符 |
select books from tb_book where books REGEXP '[PCA]' |
[^字符集合] |
匹配除字符集合以外的任意一个字符 |
select books from tb_book where books REGEXP '[^c-z]' |
S1|S2|S3 |
匹配S1、S2、S3中的任意一个字符串 |
select books from tb_book where books REGEXP 'php|java|c' |
* |
匹配多个该字符之前的字符,包括0和1个 |
select books from tb_book where books REGEXP 'J*A' |
+ |
匹配多个该字符之前的字符,包括1个 |
select books from tb_book where books REGEXP 'J+A' |
str{N} |
匹配字符串出现N次 |
select books from tb_book where books REGEXP 'a{3}' |
str{M,N} |
匹配字符串出现至少M次,最多N次 |
select books from tb_book where books REGEXP 'a{2,4}' |
这里的正则表达式与Java、PHP等编程语言中的基本一致。
1)匹配指定字符中的任意一个:
使用方括号可以将需要查询的字符字符组成一个字符集。只要记录中包含方括号中的任意字符,该记录将会被查询出来。示例:
select * from info where name REGEXP '[ceo]';
2)使用*和+来匹配多个字符:
正则表达式中,*和+都可以匹配多个该符号之前的字符。但,+至少表示一个字符,而*可以表示0个字符。示例:
select * from info where name REGEXP 'a*c';
select * from info where name REGEXP 'a+c';