简单sql语法(上)
SQL数据简单查询
- 使用SELECT语句可以从数据表中或视图中进行查询,并将查询结果以表格的形式返回,以表格的形式返回的结果称为数据集
- SELECT语句的主要结构如下:
SELECT select_list [INTO new_table] FROM table_name [WHERE search_condition] [GROUP BY group_by_expression] [HAVING search_condition] [ORDER BY order_expression [ASC|DESC]];
- 在SQL中,SQL关键字比如
select
这些不严格区分大小写,因此使用SELECT
、select
和Select
都会起到一样的效果,而不会报错 - 在SQL Server和MySQL数据库中,SQL代码末尾的分号
;
可以省略,但是在其他数据库(Oracle)中不能省略末尾分号 - 我们可以在查询结果集中使用别名来代替原本的列名来增强阅读性,创建别名可以通过单引号、双引号、不使用引号和使用
AS
关键字四种方式来创建:SELECT goods_name "商品名称" FROM goods; SELECT goods_name '商品名称' FROM goods; SELECT goods_name 商品名称 FROM goods; SELECT goods_name AS "商品名称" FROM goods;
- 当对多个表进行查询时,有可能会出现相同的列名,这种情况很容易给用户造成误解,这时就可以使用别名来区分列名是属于哪个表的。我们还可以对多个列进行计算,计算后会产生一个新列,这时可以使用别名给该列指定名称,如不指定该列列名,则默认列名为“(无列名)”。我们也可以为使用聚合函数的列设置别名
DISTINCT
关键字可以从SELECT
语句的结果中删除重复的行,在使用时须将DISTINCT
关键字放在第一个字段名的前面。在SELECT
列表中只能使用一次DISTINCT
关键字,且必须放在第一位,不要在其后面加逗号- 在SQL Server数据库中使用
SELECT
语句时,可以使用TOP
关键字来限制最多返回多少行。TOP
关键字可以指定返回表中的前n行数据,语法如下:SELECT TOP n FROM table
- 在MySQL数据库中可以使用
LIMIT n
来限制查询前n条数据,使用LIMIT
还可以从查询结果的中间部分取值,参数1为开始读取的第一条记录的编号;参数2是要查询记录的个数。也可以使用LIMIT n offset m
语句来限制查询结果,n是查询的行数,m是查询的起始位置。在查询结果中,第一个结果的记录编号是0,不是1 - 在Oracle数据库中需要使用
ROWNUM
来计算行
计算列查询和条件查询
- 连接列值是将多个列中的数据合并到一列中,合并多列后需要给该列设置一个别名,以方便用户查看,如不设置别名,该列的默认列名为“(无列名)”。连接列值使用
+
号 - 我们也可以使用算术运算符来辅助完成一些查询功能,常见的算术运算符有
+、-、*、/、%
,运算优先级是先乘除再加减。 - 数值表达式使用
+
号时会执行相加操作,而字符表达式使用+
号是会执行连接列值的操纵,而Oracle中的拼接字符串的运算符为||
。 - 当查询表中满足自己需要的数据时,我们可以使用
WHERE
关键字指定查询条件,来对数据进行查询。=
表示等于,<>或!=
表示不等于,!>
表示不大于,!<
表示不小于 - 范围查询是用来查询给定的两个值之间的数据,通常使用
BETWEEN...AND
和NOT...BETWEEN...AND
来指定范围条件 - 使用
BETWEEN...AND
查询条件时,指定的第一个值必须小于第二个值,因为BETWEEN...AND
等价于>=...<=
。我们可以使用BETWEEN...AND
查询两个值之间的数据以及查询两个日期之间的数据,可以通过GETDATE()函数
和DATEADD()函数
获取当天的日期和前一天的日期,再通过使用BETWEEN...AND
来查询出在这两个日期之间的数据。 - 如果需要查询出不在指定范围内的数据时,可以使用
NOT...BETWEEN...AND
- 转换日期格式可以使用SQL Server中的
convert
函数实现类型的转换CONVERT (data_type[(length)],expression,style)
参数说明:
data_type
:要转换的数据类型
expression
:DATETIME类型的数据
style
:指定转换形式 - 如需将日期格式中的“-”转换为“/”,可以使用
REPLACE()
函数寻找列值中的“-”将其替换为“/”。要想计算两个日期的间隔天数,可以使用DATEDIFF()
函数实现,语法格式如下:DATEDIFF(datepart,startdate,enddate)
datepart
:规定了应在哪一日期部分计算间隔差额的参数,比如day
、year
、week
等
startdate
和enddate
分别表示开始日期和终止日期 DAY()、MONTH()、YEAR()
函数分别返回代表指定日期的天、月、年部分的整数
使用逻辑运算符过滤数据
- 如果想把几个单一条件组合成一个复合条件,这就需要使用逻辑运算符
NOT、AND和OR
才能完成复合条件查询 - 在查询表时如果需要查询不满足给定条件的数据,可以在
WHERE
子句中使用NOT
运算符来实现 - 逻辑运算符的优先级从
NOT、AND、OR
依次下降,要解决优先级问题可以使用括号 - 使用
IN
关键字可以判断某个字段的值是否在指定的集合中,使用IN
操作符查询数据的基本语法格式如下:SELECT column_name FROM table_name WHERE column_name IN (value1,value2,...)
- 在
IN
操作符后的值列表不但可以使用数值类型数据,还可以使用字符类型数据,也可以使用算术表达式,并且可以使用列名作为值列表,比如:SELECT market_price,shop_price FROM goods WHERE 3899 IN (market_price,shop_price);
NOT IN
操作符可以查询出给定条件之外的数据,也可以使用NOT IN
查询后面几行的数据,前提条件是需要知道表中共有多少行数据,比如共有10条记录,查询后两行的数据的SQL语句如下:SELECT order_id,order_sn,total_amount FROM orderform WHERE order_id NOT IN(SELECT TOP 8 order_id FROM orderform)
格式化结果集
- 在SQL Server中,对日期进行格式化可以使用
CONVERT()
函数来实现,CONVERT()
函数将某种数据类型的表达式转换为指定样式的另一种数据形式,CONVERT()
的语法格式如下:CONVERT (data_type[(length)],expression [,style])
参数说明:
data_type
:规定目标数据类型
length
:nchar、nvarchar、char、varchar、binary或varbinary数据类型的可选参数,用于规定输出的长度
expression
:需要转换的值
style
:可选参数,规定日期/时间的输出格式。 - 在MySQL中,对日期进行格式化使用的是
DATE_FORMAT()
函数,该函数用于以不同的格式显式日期和时间,语法格式如下:DATE_FORMAT(date,format)
参数说明:
date
:一个合法的日期
format
:规定日期/时间的输出格式 - 在Oracle数据库中,对日期格式化使用的是
TO_CHAR()
函数,该函数用于将指定的数据按照指定的格式转换为字符串型数据,语法格式如下:TO_CHAR(expression,format)
参数说明:
expression
:需要转换的日期或数字
format
:转换后的格式 - SQL Serve中,
CAST()
函数可以将某种数据类型的表达式转换为另一种数据类型,语法格式如下:CAST(expression AS data_type)
应用
CAST()
将浮点型数据转换为整型,小数部分会舍去而不会进行四舍五入。如果试图进行不可能的转换,比如将含有字母的varchar类型转换为int类型,SQL Server会显示一条错误信息 - 如果通过
CAST()
将数字字符串转换为decimal,首先需要定义decimal的精度和小数位数,精度和小数位数的默认值分别是18和0,如果不设置这个值,SQL Server会对小数部分进行四舍五入。Oracle中格式转换函数也是CAST()
函数 LTRIM()
函数用于去除字符串左边多余的空格,语法格式如下:LTRIM(character_expression)
character_expression
:字符或二进制数据表达式,可以是常量、变量或列,必须是可以隐式转换为varchar的数据类型,否则需要使用CAST()
函数
模糊查询和行数据过滤
- 在查询表中数据时需要返回符合某种匹配格式的所有记录,这时就需要使用
LIKE
或NOT LIKE
谓词来指定模糊查询条件。定义模糊查询条件需要使用通配符在字符串中查找指定的搜索模式,通配符即用来匹配值的一部分的特殊字符 %
表示由零个或多个字符组成的任意字符串,_
表示任意单个字符,[]
表示用于指定范围内的任意单个字符,[^ ]
表示指定范围之外的任意单个字符- 在使用通配符查询数据时,数据中可能也包含着通配符,这个时候我们可以定义
ESCAPE
关键字定义转义字符来解决这个问题。当把定义的转义字符放在通配符之前时,该通配符就被解释为普通字符 - 在SQL Server中查询表中的第n行数据可以先将表中的前n行数据查询出来,再将表中的前n-1行数据查询出来,最后通过使用
NOT EXISTS
操作符将表中的第n行数据显式出来 - 在SQL Server中随机查询一行数据,可以使用
NEWID()
函数来实现,NEWID()
函数可以生成一个唯一的标识符值,是一个不确定函数,连续调用可能返回不同的值。在MySQL中随机查询可以通过RAND()
函数来实现,这个函数可以生成一个0-1间的随机数,Oracle数据库中随机查询可以通过使用DBMS_RANDOM.VALUE()
函数来实现 - 我们可以通过产生一个新的列来完成添加行号的功能方便用户查看。我们可以使用SQL Server中的
ROW_NUMBER() OVER()
函数为每一行分配一个行号并使用求模运算符过滤掉所有双数行数据就可以查询出所有单数行的数据。同时结合BETWEEN...AND
也能查询指定范围内的所有行数据。MySQL不支持这个函数,Oracle支持 - 空值不包括0、一个或多个空格组成的字符串,空值说明还没有向数据库中输入相应的数据,或者某个特定的记录行不需要使用该列。
- 在实际操作中下列几种情况可使一列成为空值:
(1)其值未知
(2)其值不存在
(3)列对表行不可用 - 在查询某列是否存在空值时不能使用
=NULL
这种写法,可以使用IS NULL
操作符对空值进行查询,查询非空值就是IS NOT NULL
- 我们实际使用数据时通常需要将空值转换为一个有效的值,SQL专门有几个用于处理空值的函数。
ISNULL()
函数可以将空值转换为有效值,而NULLIF()
函数可以根据指定的条件来生成空值。当数值不为空值时,ISNULL()
函数将会返回原值,否则会对其进行处理,用我们所设置的值来替换空值 - 在Oracle中,将空值转换为有效的值使用的是
NVL()
函数,在MySQL中,ISNULL()
函数只有一个参数,它的作用是判断其参数值是否为NULL,如果参数值为NULL,则返回1,否则返回0
数据排序
ORDER BY
子句使数据库对查询结果排序,ORDER BY
子句必须放在查询语句的末尾,ASC
表示递增排序,默认是递增排序,DESC
表示递减排序- 使用
ORDER BY
子句需要注意的是该子句一定是SELECT语句的最后一个子句,否则会出现查询错误 - 在
ORDER BY
子句中使用别名时,如果在SELECT查询中设置的别名含有空格,这时别名需要加上单引号或双引号,而Oracle中只能加上双引号,不能加上单引号 - 如果需要对多列的字段进行排序,可以对所有要用于排序的列加以限制,当对多列数据进行排序时,优先顺序应按从左到右依次降低,所以在查询语句中的
ORDER BY
子句的各个列的排列顺序很重要。 - 在
ORDER BY
子句中的第一列为“主排列”,第二列为“次排列”,如果“主排列”没有重复值,则不进行“次排列”,如果“主排列”有重复值,则需要进行“次排列” - 在实际的应用中,可以在
ORDER BY
子句中引用前面SELECT查询中没有使用到的字段,但是如果在SELECT查询语句中使用了DISTINCT
或UNIQUE
关键字,那么就只允许使用在SELECT查询中明确列出的那些字段进行排序,否则会出现错误。 - 在SQL Server中可以将
ORDER BY
子句与TOP
关键字结合起来使用,可以对数据表中的前几行数据进行排序,在Oracle中需要使用本身自带的rownum
属性,但是由于其都是从1开始的,1以上的自然数在rownum
做等于判断时都被认为是false,要想查询到第二列以后的数据需要使用子查询的方式,但是使用rownum<=n
的条件时满足的,此时不需要使用子查询的方式 - 在SQL Server中,
ORDER BY
子句的优先级高于TOP
关键字,这意味着首先会进行排序再获取,而在Oracle中rownum
属性的优先级高于ORDER BY
子句,会先进行选取再排序,此时需要使用子查询 - 我们可以通过
COLLATE
关键字设置表和ORDER BY
子句的排序规则来使用姓氏笔画和姓氏拼音来为汉字进行排序
数据统计分析
- 聚合函数对一组值进行计算并返回单一的值,包括
SUM()、AVG()、COUNT()、MAX()和MIN()
,它们的作用是在查询结果集中生成汇总值 AVG()
函数只能用于单个列或多个列的计算值,如果要获得多个列的平均值,只能使用多个AVG()
函数。如果要获得非重复值的平均值,可以使用DISTINCT
关键字,在对数值列求平均值时,如果存在空值,在计算平均值时将忽略该行记录COUNT(*)
是最准确返回表中行的总计函数,而COUNT(expression)
则是对表达式的返回值进行处理,它返回的值可描述为传递到此函数的列中非零值的计数,只对这列中不是NULL的行进行计数COUNT(*)
不能使用DISTINCT
关键字,因为COUNT(*)
统计的是一个表中所有行的数目,而不需要考虑这些行是否重复或者包含NULL值,而COUNT(expression)
可以使用DISTINCT
关键字- 在确定列中的最大值时,
MAX()
函数忽略NULL值,但是如果该列中的所有行都为NULL,那么MAX()
函数将会返回NULL - 每一个聚合函数都返回单个值,这时可以将这个值作为
WHERE
子句得条件进行查询,但是由于聚合函数不能与字段进行比较操作,所以聚合函数只能放在子查询中 - Oracle中的
NVL()
函数是将NULL值转换为某一个实际的值,语法格式如下:NVL(string,replace_with)
如果string为NULL,则
NVL()
函数返回replace_with的值,否则返回string的值,如果两个参数都为NULL则返回NULL,string和replace_with的数据类型必须一致 - 在同时使用多个聚合函数时应该注意以下两点:
(1)多个聚合函数在SQL Server中不能嵌套,但在Oracle中可以嵌套
(2)子查询不能作为一个聚合函数的表达式 - 尽管使用聚合函数为查询带来了便利,但使用多个聚合函数可能会使系统查询效率明显降低,特别是在对容量大的数据表进行桩的操作是更为明显。