-- 单列查询 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 返回重复行