SQL查询基本用法

-- 单列查询
select 编号 from employees

-- 多列查询
select 编号,姓名 from employees

-- 查询所有列
select * from employees

-- 将查询结果创建新表
select 编号,姓名 into 新表 from employees

-- 为查询结果的列创建别名
select  编号 学号 , 姓名 as 昵称 , 出生日期 = 生日 , 地址 '家庭住址', 电话 "家庭电话" from employees

-- 多表查询设置别名
SELECT employees.[姓名] , [ Salary ].收入 as 工资 FROM employees , [ Salary ] where [ Salary ].[编号]=employees.[编号]

-- 为计算结果设置别名
select (收入 - 支出 ) as 纯收入 from  [ Salary ]

-- 删除重复数据 DISTINCT 必须在最前面,表示删除输出的行完全一样的,还带升序
select distinct 支出 from [ Salary ]

-- 在SQLServer中限制查询结果 只显示前5
SELECT TOP 5 * FROM employees

-- 在MySQL中限制查询结果 只显示前5和编号5开始的前10条数据
SELECT  * FROM employees limit 5
SELECT TOP 5 * FROM employees limit 5 ,10

-- 在Oracle中限制查询结果
SELECT  * FROM employees where rownum<= 5;

-- 连接列值,在Oracle会报错因为拼接字符串使用||
SELECT 姓名+地址+电话 As 个人信息 from employees

-- 条件查询
SELECT * FROM [ Salary ] where 收入>3000

-- 范围查询 BETWEEN ...And ... ,包含边界,也可以查询两个日期之间的数据
SELECT * FROM [ Salary ] where 收入  BETWEEN 2400.8 and 3160

-- 获取当前日期
SELECT GETDATE();
-- 函数表达式CONVERT(date_type[(length)],expressoon,style) mysql中使用DATE_FORMAT(date,format) Oracle中使用TO_CHAR(date,format)
-- 可以将长日期转换成短日期格式数据
CONVERT( char(10),getdate(),120)
-- REPLACE(CONVERT( char(10),getdate(),120), '-', '/')可以将日期中— 变成/
-- DATEDIFF(单位, 开始, 结束)计算两个日期间隔天数
-- DAY(日期)返回那一天
-- MONTH(日期)返回那个月份
-- YEAR(日期)返回那一年
-- 逻辑运算符优先等级 not and or

-- 使用in操作符过滤数据,相当用多个or
SELECT * from employees where 姓名 in ('程锋' , '李丽' ,'刘明')
SELECT * from employees where 姓名 not in ('程锋' , '李丽' ,'刘明')
SELECT * from employees where 姓名  in (SELECT TOP 2 姓名 from employees)
SELECT * from employees where '程锋' in (姓名)

-- SQLsercer:CAST(数值  AS  类型)数据表类型转换
-- LTRIM(character_expression)去除左空格

-- 模糊查询like %任意0或多字符  _ 任意单字符 []表示范围 ^[]范围外
-- ESCAPE定义转义字符,使各以上通配符能做正常使用
-- 匹配xx5%
SELECT * from employees where  姓名 like '%5/%' ESCAPE '/'

-- 查找指定行,则查询前n性,再查询前n-1行,使用NOT EXISTS 操作符删除重复,进而得到n
-- SQLSrever 随机一行
SELECT top 1 * from employees ORDER BY NEWID()
-- MySQL随机一行
SELECT  * from employees ORDER BY RAND () limt 1

-- 查询空值
SELECT  * from employees WHERE 姓名 IS NUll
SELECT  * from employees WHERE 姓名 IS not NUll
-- 空值处理
SELECT 姓名,生日, ISNULL(地址, '北京') as 住址  FROM employees
-- mysql只能使用ISNULL()单个参数判断是非为空,空就为1,否则就0

-- 排序
SELECT  * from employees ORDER BY 编号 ASC
SELECT  * from employees ORDER BY 编号 DESC
-- 也可以使用别名排序
-- 多对列排序也就是进行多级排序
-- 优先顺序从左到右
-- 获取说有排序规则  跟在order by后面COLLATE 设置排序规则
select *from ::fn_helpcollations()

-- 聚合函数
-- SUM():数字求和  AVG():数字求平均
-- MIN:数字字符日期求最小
-- MAX:数字字符日期求最大
-- COUNT:统计行数量 null不统计·也可使用DISTINCT 统计不重复
-- 多个聚合函数在SQL Server中不能嵌套
-- 在Oracle中嵌套必须设置group by

-- 分组统计
SELECT 性别 ,COUNT(*) as su FROM employees GROUP BY 性别
SELECT 性别 ,min(生日) as su FROM employees GROUP BY 性别
-- 可以进行多列分组,列必须是查询表中的列,结果为总的
-- 可利用ROLLUP和CUBE和WITH关键字对 GROUP BY 进行分类汇总和总汇总
-- 可使用having子语句对分组组内过滤,和where类似,但是不能离开group by单独使用
-- GROUP BY的列不一定要在select列中出现


-- 子查询最多32层,使用(),任何使用表达式的地方都可以使用子查询,只要返回是单个值
-- 不能有order by
-- 使用in和not in实现子查询的交集和差集运算
-- EXISTS判断子查询结果是否存在数据行
-- ALL操作符比较子查询中的每一个值只有全为true,结果才为true
-- some和any是一样的
SELECT [编号], [收入] from [ Salary ] where [收入]>any(SELECT AVG(收入) FROM [ Salary ])

-- 内连接:使用比较运算符进行列和列之间的比较
SELECT [姓名],[地址],[收入]from employees,[ Salary ]where employees.[编号]=[ Salary ].[编号]
SELECT [姓名],[地址],[收入]from employees INNER join [ Salary ] ON employees.[编号]=[ Salary ].[编号]

-- 外连接:将某些不满足连接条件的数据也在连接结果中输出
-- 左连接:保留第一个表中所有行,
SELECT [姓名],[地址],[收入]from employees left join [ Salary ] ON employees.[编号]=[ Salary ].[编号]

-- 右连接:保留第2个表中所有行,
SELECT [姓名],[地址],[收入]from employees right join [ Salary ] ON employees.[编号]=[ Salary ].[编号]

-- 全外连接:保留左右连接
SELECT [姓名],[地址],[收入]from employees full join [ Salary ] ON employees.[编号]=[ Salary ].[编号]

-- 交叉连接
SELECT [姓名],[地址],[收入]from employees cross join [ Salary ] 

-- 组合查询:必须两个以上的select语句,语句之间用union 关键字分隔
-- 每个列中的数目、类型相同或兼容
-- union all 返回重复行

猜你喜欢

转载自www.cnblogs.com/LBJN/p/12757657.html