SQL—查询
--基本查询
select * from emp;
--all 查询某列所有
select all ename from emp;
-- distinct 过滤重复数据
select distinct esex from emp;
--count 统计
select count(*) from emp;
select count(esex) from emp;
select count(distinct esex) from emp;
--top取前N条记录
select top 3 * from emp;
--alias column name 列重命名
select eid as 编号, ename '名称', esex 性别 from emp;
--alias table name : 表重命名
select eid,ename,e.eid,e.ename from emp s;
--column : 列运算
select (pay+reward) col from erp;
select d.dname+'-'+e.ename from dept d,emp e where d.did=e.did;
--where条件
select * from emp where eage=20;
select * from emp where eage>20;
select * from emp where eage<20;
select * from emp where eage<>20;
select * from emp where eage>=20;
select * from emp where eage<=20;
select * from emp where eage!>20;
select * from emp where eage!<20;
--and 并且
select * from emp where eage>20 and esex='男';
--or 或者
select * from emp where eage>20 and esex='男';
--between...and ...相当于并且
select * from emp where eage between 20 and 22;
select * from emp where eage not between 20 and 22;
--like: 模糊查询
select * from emp where ename like '%a%';
select * from emp where ename like '%[m][i]%'; --中间有个mi的
select * from emp where ename not like '%a%'; --中间没有a字母的
select * from emp where ename like 'Jo%'; --以Jo开头的
select * from emp where ename not like 'Jo%' and name not like 'Be%'; --不是一Jo开头的
select * from emp where ename not like '%[jn]%'; --中间不含j或n的
select * from emp where ename like '%[jna]%'; --中间含有j或n或a的
select * from emp where ename like '[^RJT]%'; --不是以RJT开头的
select * from emp where ename like '[^J][o]%'; --第一个字母是不是J,第二个字母是o
select * from emp where ename like '[JTB][^o]%'; --第一个字符是J或B或T,第二个字母不是o的
select * from emp where ename like '%[ja_on]%';
--in : 条件范围
--语法: where 字duan in (值1,值2); 或
--问题: 求出emp表eid为1,3,5,7,9的员工信息
select * from emp where eid in(1,3,5,7,9);
--not in: 不在条件范围
--问题: 求出emp表eid不为1,3,5,7,9的员工信息
select * from emp where eage is null;
--为空判断: 判断某个列的值是否为空
--语法 : 字段名 is null
select * from student where age is null;
--不为空判断:
--语法: is not null
select * from emp where eage is not null;
--any、all、some
--求出市场部中年龄比开发部任何一个都大的员工信息
select * from emp where eid=3 and eage>all(
select eage from emp where eid=1);
--求出其它部门中,有比开发部年龄小的员工信息
select * from emp where eid<>1 and eage<any(
select eage from emp where eid=1);
--排序: 按某个列进行升降序显示
--语法: order by 列名1 [desc/asc], 列名2 [desc/asc],
--问题:
-- 1. 按工资排序
select * from erp order by pay; --默认为升序
-- 2. 按工资降序排序
select * from erp order by pay desc;
--3. 按工资升序排序
select * from erp order by pay asc;
--4. 先按工资降序排序,再按奖金升序排序
select * from erp order by pay desc, reward asc;
select * from emp,erp where emp.eid=erp.eid order by eage;
---综合案例一:
--需求描述:在数据库表中,数据行位置并不重要,但是一个单位中要根据奇数行和偶数行的数据来汇总,在这个汇总的基础上再得到一个数值,
--因此,要查询数据库表的奇数行和偶数行的总数, 但原表中的id列的值并不是完全连续的,其中有一些数据已经删除了.
create table tab1(
id int primary key,
total int
)
insert into tab1 values(1,33);
insert into tab1 values(3,44);
insert into tab1 values(4,2);
insert into tab1 values(5,6);
insert into tab1 values(8,88);
insert into tab1 values(9,3);
insert into tab1 values(15,33);
insert into tab1 values(17,34);
insert into tab1 values(19,34);
insert into tab1 values(20,29);
select * from tab1;
--解决方案: 只能依靠标识列的值来进行判断和选取, 但原有主键列已经不能用,所以必须生成一个新表,将原表的total列的数据插过去,并新增加标识列
--然后再在新表中通过新标识列来求奇数列值和偶数列值
--将一个表的数据插入到另一个表语法: select 列名, identity(种子,自增) into 新表名 from 源表名
select IDENTITY(int,1,1) as id, total
into newtab1
from tab1;
select SUM(total)
from newtab1
where ID%2=1
select SUM(total)
from newtab1
where ID%2=0
--聚合函数
select MAX(age), MIN(age),COUNT(age),AVG(age),SUM(age) from student;
--日期时间函数
select DATEADD(day,3,getDate());
select DATEADD(year,3,getDate());
select DATEADD(hour,3,getdate());
--返回跨两个指定日期的日期边界数和时间边界数
select DATEDIFF(day,'2012-06-1',getdate());
--相差秒数
select DATEDIFF(second,'2012-06-1 11:00:00',getdate());
--相差小时数
select DATEDIFF(hour,'2011-6-22 10:00:00',getdate());
select DATENAME(month,getdate()); -- 返回指定日期的指定日期部分的字符串
select DATENAME(minute, getdate());
select DATENAME(weekday,getdate());
select DATEPART(month,getdate()); --返回指定日期的指定日期部分的整数
select DATEPART(weekday,getdate());
select DATEPART(second,getdate());
select DAY(getdate()); --几号
select DAY('2012-06-06');
select MONTH(getdate());
select YEAR(getdate());
select GETDATE();
--数学函数
select PI();
select RAND(100),RAND(50),RAND(),RAND(); --100表示种子值,表所有的rand(100)都生成同样的值
select ROUND(rand(),3); --3表示精确到的位数
--元数据
select COL_NAME(object_id('student'),1); --student表中第一列列名
select COL_NAME(object_id('student'),2); --student表中第二列列名
--该列数据类型长度
select COL_LENGTH('student',col_name(OBJECT_ID('student'),2));
--返回类型名称,类型id
select TYPE_NAME(type_id('varchar')),TYPE_ID('varchar');
--字符串函数
select ascii('a');
select ASCII('A');
select CHAR(97);
select CHAR(65);
select NCHAR(65); --Unicode字符数据类型。Unicode字符数据类型包括Nchar、Nvarchar、Ntext三种。
select NCHAR(45231); --unicode转换字符
select UNICODE('A'),UNICODE('中'); --unicode编码
--匹配字符索引
--dex在dexjack中开始的索引下标 某一模式开始的索引下标
select patindex('dex%','dexjack'), PATINDEX('%a','ta'),PATINDEX('%ac%','jcaack');
--查找索引 下标从1开始
select charindex('o','hello world');
--返回指定字符串从左边开始的3个字符
select LEFT('hello world',3);
--返回指定字符串从右边开的3个字符
select right('hello world',3);
--返回指定的次数重复的字符串 将he空格重复3次输出
select replicate('he ',3);
--比较字符串是否相同
--在以下示例的第一部分,对两个非常相似的字符串的 SOUNDEX 值进行了比较,DIFFERENCE 返回的值为 4。
--在以下示例的第二部分,对两个差别很大的字符串的 SOUNDEX 值进行了比较,DIFFERENCE 返回的值为 0。
select difference('hello','hello world');
select DIFFERENCE('hello','h world');
--替换
select replace('abcedef','e','E');
--指定位置替换
select stuff('hello world',3,4,'ABC'); --从第三个开始的后面4个字符替换为ABC
--截取字符符串,截那个字符串,从哪里截,截多长
select substring('abc',1,1),substring('abc',1,2),SUBSTRING('hello world',7,5);
--返回字符串长度
select len('abc');
--反序
select reverse('sqlserver');
--取左边字符串
select left('leftstring',4), left('leftstring',7);
select right('leftstring',4), left('leftstring',7);
--大小写转换
select lower('aBc'),upper('aBc');
--去掉空格
select ltrim(' abc '),ltrim('# abc #'),rtrim(' abc '),rtrim('# abc #');
--安全函数
select CURRENT_USER;
select USER;
--系统函数
select APP_NAME(); --当前会话的应用程序名
--类型转换
--cast与convert最大的区别在于convert可以指定转换的样式,主要是对money、float类型和日期型的
select cast('2012' as datetime), cast('10' as money),cast('0' as char); --将一种数据类型的表达式转换为另一种数据类型的表达式。
select convert(datetime,'2012'); --将2012转换成日期型输出
select convert(varchar(20),GETDATE(),120); --120表示按yyyy-mm-dd hh:mi:ss(24h)的格式输出2012-12-12 将当前日期转换为字符串按120格式输出
select convert(money,'2011',[style]); --哪种格式的金钱表示方式
select convert(varchar(20),cast('2012' as money),120);--将2011转化成money类型,然后再将其转为字符串型以120(2,012.00)格式输出,默认输出为2012.00
--当前时间搓
select current_timestamp;
select CURRENT_TIMESTAMP;
--判断
select isdate(getdate()), isdate('abc'),isnumeric(1);
select datalength('abcd周'); -- 返回用于表示任何表达式的字节数。
select LEN('abdc周'); --返回字符表达式中的字符数。如果字符串中包含前导空格和尾随空格,则函数会将它们包含在计数内。LEN 对相同的单字节和双字节字符串返回相同的值