SQL基础语法(3)

这篇blog是SQL基础语法,只是作为我平时查阅和备份,仅适合初学者学习阅读,高手绕行。
转载时注明地址: http://fuchangle.iteye.com/blog/1772779
SQL基础语法(1)访问 http://fuchangle.iteye.com/blog/1772395
SQL基础语法(2)访问 http://fuchangle.iteye.com/blog/1772523

单表查询
select语句的功能就是查询数据。select语句也是SQL语句中功能最丰富的语句,select语句不仅可以执行单表查询,而且可以执行多表连接查询,还可以进行子查询,select语句

用于从一个或多个数据表中选出特定行、特定列的交集。
单表查询的select语句的语法如下:
select colimn1 colimn2 
form 数据源 
[WHERE condition]

上面的语法格式中的数据源可以是表、视图等。从上面的语法格式中可以看出,select后的列表用于选择哪些列,where条件用于确定选择哪些行,只有满足where条件的记录才会
被选择出来;如果没有where条件,则默认选出所有行。

下面的SQL语句将会选择出teacher_table表中的所有行、所有列的数据。
select * from teacher_table;

如果增加where条件,则只选择符合where条件的记录,如下SQL语句将选择出student_table表中java_teacher值大于3的记录student_name列的值为
select student_name from student_table where java_teacher > 3;


当使用select语句进行查询时,还可以在select语句中使用算术运算符(+、-、*、/),从而形成算术表达式:使用算术表达式的规则如下:
1.对数值型数据列、变量、常量可以使用算术运算符(+、-、*、/) 创建表达式;
2.对日期型数据列、变量、常量可以使用部分算术运算符(+、-、)创建表达式,两个日期之间可以进行减法运算,日期和数值之间可以进行加、减运算;
3.运算符不仅可以在列和常量、变量之间进行运算,也可以在两列之间进行运算。

下面的select语句中使用了算术运算符
#数据列实际上可当成一个变量
select teacher_id + 5 from teacher_table;
#查询出teacher_table表中teacher_id * 3 大于4的记录
select * from teacher_table where teacher_id * 3 > 4;

需要指出的是,select后的不仅可以是数据列,也可以是表达式,还可以是变量、常量等,例:
#数据列实际上可当成一个变量
select 3*5, 20 from teacher_table;

SQL语言中算术符的优先级与java语言的运算符优先级完全相同,Mysql使用concat函数来进行字符串连接运算。
select concat(teacher_name, 'xx') form teacher_table;

对于MySQL而言,如果在算术表达式中使用null,将会导致整个算术表达式的返回值为null;如果在字符串连接运算符中出现null,将会导致连接后的结果也是null,如
select concat(teacher_name, null) from teacher_table;


如果不希望直接使用列名作为列标题,则可以为数据列或表达式起一个别名,为数据列或表达式起别名时,别名紧跟数据列,中间以空格隔开,或者使用as关键字隔开。如
select teacher_id + 5 as MY_ID from teacher_table;

如果需要选择多列,并为多列起别名,则多列与列之间以逗号隔开,但列和列名之间以空格隔开。
select teacher_id + 5 MY_ID, teacher_name 老师名
from teacher_table;

不仅可以为列或表达式起别名,也可以为表起别名,为表起别名的语法和为列或表达式起别名的语法完全一样,如
select teacher_id + 5 MY_ID, teacher_name 老师名
from teacher_table t;


select 默认会把所有符合条件的记录全部选出来,即使两行记录完全一样。如果想去除重复行,则可以使用distinct关键字从查询结果中清除重复行,比较下面两条SQL语句的执
行结果:
#选出所有记录,包括重复行
select student_name,java_teacher from student_table;
#去除重复行
select distinct student_name, java_teacher from student_table;

注:使用distinct去除重复行时,distinct紧跟select关键字,它的作用是去除后面字段组合的重复值,而不管对应对应记录在数据库是否重复。

前面已经看到了where字句的作用:可以控制只选择指定的行。因为where字句里包含的是一个条件表达式,所以可以使用>、>=、<、<=、=和<>等基本的比较运算符。SQL中的比较

运算符不仅可以比较数值之间的大小,也可以比较字符串、日期之间的大小。
SQL判断两个值是否相等的比较运算符是单等号=,判断不等的运算符是<>;SQL中的赋值运算符不是等号,而是冒号等号(:=);
除此之外,SQL还支持如表所示的特殊的比较运算符
运算符-----------含义
expr1 between expr2 and expr3 -------------- 要求expr1 >= expr2 并且 expr2 <= expr3
expr1 in(expr2,expr3,expr4,...)-------------- 要求expr1等于后面括号里任意一个表达式的值
like-------------- 字符串匹配,like后的字符串支持通配符
is null-------------- 要求指定值等于null

下面的SQL语句选出student_id大于等于2,且小于等于4的所有记录.
select * from student_table where student_id between 2 and 4;


使用in比较运算时,必须在in后的括号里列出一个或多个值,它要求指定列必须与in括号里任意一个值相等,如
#选出student_id、java_teacher列的值为2或4的所有记录
select * from student_table where student_id in(2,4);
与之类似的是,in括号里的值既可以是常量,也可以是变量或者列名,如:
#选出student_id、java_teacher列的值为2的所有记录
select * from student_table where 2 in(student_id,java_teacher);


like运算符主要用于进行模糊查询,例如,若要查询名字以“孙”开头的所有记录,这就需要用到迷糊查询,在模糊查询中需要使用like关键字。
SQL语句中可以使用两个通配符:下划线(_)和百分号(%),其中下划线可以代表一个任意的字符,百分号可以代表任意多个字符。
如下SQL语句将查询出所有学生中名字以"孙"开头的学生。
select * from student_table
where student_name like '孙%';


下面的SQL语句将查出名字为两个字符的所有学生
select * from student_table
#下面使用两个下划线代表来个字符
where student_name like '__';


is null 用于判断某些值是否为空,判断是否为空不能用=null来判断,因为SQL中null=null返回null。
如下SQL语句将选择出student_table表中student_name为null的所有记录。
select * from student_table
where student_name is null;


如果where字句后面有多个条件需要组合,SQL提供了and 和 or 逻辑运算符来组合2个条件,并提供了not来对逻辑表达式求否,如下SQL语句将选出学生名字为2个字符,
且student_id 大于3的所有记录。
select * from student_table
where student_name like '__' and studnent_id > 3;


下面的SQL语句将选出student_table表中姓名不以下划线开头的所有记录。
select * from student_table
#使用not 对where 条件取否
where not student_name like '\_%'; 


执行查询后的结果默认按插入顺序排序;如果需要在查询结果按某列值的大小进行排序,则可以使用order by字句。order by字句的语法如下:
order by column_name1 [desc], column_name...

进行排序时默认按升序排序排列,如果强制按降序排序,则需要在列后使用desc关键字(与之对应的是asc关键字,用不用该关键字的效果完全一样,因为默认是按升序排列)。
上面语法中设定排序列时可采用列名、序列名和列别名。如下SQL语句选出student_table表中的所有记录,选出后按java_teacher列的升序排列。
select * from student_table
order by java_teacher;


如果需要按多列排序,则每列的asc、desc必须单独设定。如果指定了多个排序列,则第一个排序列是首要排序列,只有当第一列中存在多个相同值时,第二个排序才会起作用。如
果SQL语句先按java_teacher列的降序排序,当java_teacher列的值相同按student_name 列的升序排列。
select * from student_table
order by java_teacher desc, student_name;

---------------------------------

数据库函数
每个数据库都会在标准的SQL基础上扩展一些函数,这些函数用于进行数据处理或复杂计算,他们通常对一组数据进行计算,得到最终需要的输出结果。
函数一般都会有一个或者多个输入,这些输入被称为函数的参数,函数内部会对这些参数进行判断和计算,最终只有一个值作为返回值。函数可以出现在SQL语句中的各个位置,比

较常用的位置是select之后的where子句中。
根据函数对多行数据的处理方式,函数被分为单行函数和多行函数,单行函数对每行输入值单独计算,每行得到一个计算结果返回给用户;多行函数对多行输入值整体计算,最后

只会得到一个结果,
SQL中的函数和java语言中的方法有点相似,但SQL中的函数是独立的程序单元,也就是说,调用函数时无需使用任何类、对象作为调用者,而是直接执行函数。如下:
function_name(arg1,arg2...)


多行函数也称为聚集函数、分组函数,主要用于完成一些统计功能,在大部分数据库中基本相同。但不同数据库中的单行函数差别

非常大,MySQL中的单行函数具有如下特征.
1.单行函数的参数可以是变量、常数或数据列。单行函数可以接收多个参数,但只返回一个值.
2.单行函数会对每行单独起作用,每行(可能包括多个参数)返回一个结果。
3.使用单行函数可以改变参数的数据类型。单行函数支持嵌套使用,即内层函数的返回值是外层函数的参数。

MySQ数据库的数据类型大致分为数值型、字符型、和日期时间型。所以mysql分别提供了对应的函数。转换函数主要负责完成类型转

换,其他函数又大致分为如下几类。
1.位函数
2.流程控制函数
3.加密解密函数
4.信息函数

每个数据库都包含了大量的单行函数,这些函数的用法也存在一些差异,但有一点是相同的--每个数据库都会为一些常用的计算功能提供相应的函数,这些名字可能不同,用法可能有差异,但所有数据库提供的函数库所能完成的功能大致形似。下面通过一些例
子来介绍MySQ单行函数的用法.

#选出teacher_table表中teacher_name列的字符长度
select char_length(teacher_name) from teacher_table;

#计算teacher_name列的字符长度的sin值
select sin(char_length(teacher_name)) from teacher_table;

#为指定日期添加一定的时间,在这种用法下interval是关键字,需要一个数值还有一个单位
select DATE_ADD('1998-01-02', interval 2 MONTH);

#获取当前日期
select CURDATE();

#获取当前时间
select curtime();

#下面的MD5是MD5加密函数
select MD5('testing');


待续...

猜你喜欢

转载自fuchangle.iteye.com/blog/1772779