查询列中的元素 减去 重复元素
SELECT DISTINCT column_name,column_name
FROM table_name;
也可以不指定列进行插入
INSERT INTO Websites (name, url, country)
VALUES ('stackoverflow', 'http://stackoverflow.com/', 'IND');
(注意where)
UPDATE Websites
SET alexa='5000', country='USA'
WHERE name='菜鸟教程';
删除指定的行(注意where)
DELETE FROM Websites
WHERE name='百度' AND country='CN';
限定查询的条数,对大记录表常用
1. Mysql的limit:SELECT * FROM Persons LIMIT 5;
Oracle的limit:SELECT * FROM Persons WHERE ROWNUM <11;
查询前10条数据
top语句:SELECT TOP 50 PERCENT * FROM Websites;
模糊搜索,下面是不包含语句
SELECT * FROM Websites WHERE name NOT LIKE '%oo%';
SELECT * FROM Websites
WHERE name LIKE 'G_o_le';
^[ABC]
表示以ABC其中一个字符开头 s相当于==,但是in可以一次规定多个值
SELECT * FROM Websites
WHERE name IN ('Google','菜鸟教程');
转化成where就是where name='Google' or name='菜鸟教程'
,相比之下in的效率更高
【真实例子】
select
tpi.* from th_project_info tpi, th_contract_management tcm, th_project_superv tps
where
tpi.code = tcm.proid and tps.projectcode = tpi.code
and
tps.refen1 = '0'
and
tpi.state > 3
and
tpi.code
not in
(select
ar.PROJECTCODE
from
th_apply_record ar,th_project_apply tpa
where
ar.applycode=tpa.code
and
tpa.refen2 <>'1'
and
ar.APPLYFLAG ='2')
首先从tpi,tcm,tps中筛选出信息,然后排除掉包含ar,tpa筛选出来的PROJECTCODE列内容的行
in只要有一个符合就返回true
(相似的有 exists )
SELECT * FROM access_log
WHERE date BETWEEN '2016-05-10' AND '2016-05-14';
between可以对日期进行筛选,输出的值包括2016-05-10和2016-05-14,不包括between前面添加not
SELECT name, CONCAT(url, ', ', alexa, ', ', country) AS site_info
FROM Websites;
之中CONCAT将几个列组合成一个列,再给它设置别名
[TEST@ORA1] SQL>select * from a;
编号 姓名
---- ----------
1000 张三
2000 李四
3000 王五
[TEST@ORA1] SQL>select * from b;
编号 商品
---- ----------
1000 电视机
2000 录像机
4000 自行车
[TEST@ORA1] SQL>set null 空值--这里为了显示方面我把NULL定义成了[空值]
[TEST@ORA1] SQL>select a.*,b.* from a inner join b on a.编号=b.编号;
编号 姓名 编号 商品
---- ---------- ---- ----------
1000 张三 1000 电视机
2000 李四 2000 录像机
[TEST@ORA1] SQL>select a.*,b.* from a left join b on a.编号=b.编号;
编号 姓名 编号 商品
---- ---------- ---- ----------
1000 张三 1000 电视机
2000 李四 2000 录像机
3000 王五 空值 空值
[TEST@ORA1] SQL>select a.*,b.* from a right join b on a.编号=b.编号;
编号 姓名 编号 商品
---- ---------- ---- ----------
1000 张三 1000 电视机
2000 李四 2000 录像机
空值 空值 4000 自行车
[TEST@ORA1] SQL>select a.*,b.* from a full join b on a.编号=b.编号;
编号 姓名 编号 商品
---- ---------- ---- ----------
1000 张三 1000 电视机
2000 李四 2000 录像机
3000 王五 空值 空值
空值 空值 4000 自行车
(以上数据内容引自一位网友的博客,由于名字,所以没把名字加上去,可联系我添加博客链接)
【真实例子】
select a.*,l.lock_seq as lockSeq,l.lock_remark as addMan from th_project_batch a left join th_lock l on l.lock_seq=a.code
以th_project_batch为主表,通过l.lock_seq=a.code连接,将主表所有的列显示出来,附带th_lock中对应的列。
UNION 中每个 SELECT 语句必须数量相同,数据类型相似,顺序相同。
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
如果想要显示值一摸一样的数据,则用UNION ALL
(查询交集使用intersect)
SELECT INTO 语句从一个表复制数据,然后把数据插入到另一个新表中。
1. 新建复制整个表 :CREATE TABLE 新表 SELECT * FROM 旧表
2. 新建复制指定列:
CREATE TABLE 新表 SELECT * FROM 旧表
3.新建复制表不包括内容:
SELECT *
INTO newtable
FROM table1
WHERE 1=0;
4.复制已有表内容
INSERT INTO table2
SELECT * FROM table1;
复制已有表内容的指定列
INSERT INTO Websites (name, country)
SELECT app_name, country FROM apps;
设置一个字段是另一个表的外键可以预防破坏表之间连接的行为
check约束用来定义一些值的规则
ALTER TABLE Persons
ADD CHECK (P_Id>0)
P_Id的输入值必须大于0
当值为空的时候,使用默认值
ALTER TABLE Persons
ALTER City SET DEFAULT 'SANDNES'
在 “Persons” 表的 “LastName” 列上创建一个名为 “PIndex” 的索引:
CREATE INDEX PIndex
ON Persons (LastName)
如果要创建唯一的索引值,再index前面添加unique
mysql:ALTER TABLE table_name DROP INDEX index_name
oracle:DROP INDEX index_name
DROP TABLE table_name
DROP DATABASE database_name
TRUNCATE TABLE table_name
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
DROP VIEW view_name
将查询的数字转化为对应的文字输出
select u.id,u.name,
(case u.sex
when
1 then '男'
when
2 then '女'
else
'空的'
end
)性别
from
users u;
【真实例子】
select * from
(select
t.*,t.type as projectType,
case
when
t.current_step is null or t.current_step =''
then 0
when
t.current_step is not null
then t.current_step
end
projectState
from
fhq_project_info t) a
查询的时候当current_step为空或者null,则显示0.否则显示原来的数据(必须),显示的列为projectState
instr(string1,string2[,start_position[,nth_appearence]])
string1:要在此字符串中查找。
string2:要在string1中查找的字符串。
start_position:从string1开始查找的位置。可选,默认为1,正数时,从左到右检索,负数时,从右到左检索。
nth_appearence:查找第几次出现string2。可选,默认为1,不能为负。
注:如果没有查找到,返回0。
例如:
select instr(‘abcd’,’a’) from dual; –返回1
select instr(‘abcd’,’c’) from dual; –返回3
select instr(‘abcd’,’e’) from dual; –返回0
【真实例子】
select rownum, ta.*
from (select t.*,
tnu.noticestate1,
tnu.code as usercode,
tnu.refen2 as throle,
tnu.receiveuser1 as thuser,
(select wm_concat(tpi.pname)
from th_notice_group g, th_project_info tpi
where instr(g.proids, tpi.code) > 0
and g.refen1 = t.code) as pname, t.code as tcode
from th_project_notice t, th_notice_user tnu
where t.code = tnu.refen1 and t.del_flag!=1
and t.noticetypt > 1
order by tnu.noticestate1 asc, t.sendtime desc) ta
查找tpi.pname,筛选它的g.proids是否包含tpi.code
/****日期**********/
/*****数字**********/
/*
TRUNC(number,num_digits)
Number 需要截尾取整的数字。
Num_digits 用于指定取整精度的数字。Num_digits 的默认值为 0。
TRUNC()函数截取时不进行四舍五入
*/
【真实例子】
select a.id,a.code,a.pname,a.cuser,a.cusername,a.scope,a.cdate,a.principal,a.contact,a.famount,
a.state,a.refen2,a.refen7,a.backopinion,a.constructioncycle,a.modify_date,
b.supervname,b.projectcode,b.refen1,
c.business_id,c.receive_time,
trunc(SYSDATE - to_date(c.receive_time,'yyyy-MM-dd HH24:mi:ss')) delay
from
th_project_info a,
th_project_superv b,
c_task_info c
where
c.receive_time < to_char(SYSDATE - 5, 'yyyy-MM-dd')
and a.refen2 = '待评审单位初审'
and a.abolish = '0'
and b.refen1='3'
and a.code = b.projectcode
and a.code = c.business_id
to_date() 作用将字符类型按一定格式转化为日期类型
trunc在这里的作用就是将(系统时间-获取时间)转化为yyyy-MM-dd格式,然后作为delay参数输出。
to_char将时间按yyyy-MM-dd转化为字符串
group对部分信息的共性进行提取,一般和分组统计函数配合使用
Count:找到记录数
Min:列的最小值
Max:列的最大值
Sum:计算列的总和
Avg:计算列的平均数
【例子】查询每个雇员sales_rep_id总订单数
select sales_rep_id,sum(order_total) from orders group by sales_rep_id;
having跟where类似,对查询进行设置条件。区别在于:where是先设置条件再查询,而having是查询后再进行条件筛选。 (尽量使用where)
从苹果树上摘好的苹果(where);把很多苹果一起摘下来,挑选好的一部分(having)
having通常配合统计函数使用
【例子】查询总订单数再150 000以上的统计数据
select sales_rep_id ,sum(order_total)
from orders
group by sales_rep_id
having sum(order_total) > 150000;
有时候需要将同一个表自身数据进行比较,这个时候就需要用自连接
SELECT FIRST.CNumber, SECOND.PCNumber
FROM Course FIRST, Course SECOND
WHERE FIRST.PCNumber=SECOND.CNumber;
自然联结就是将有相同列的两个表进行组合成一张表,对应不上的就不显示,一对二的就拆分成两条数据
【例子】
select product_id,p.categroy_id,category_name
from product_information p
natural join categories ca;