从零基础认识sql语法
来源:互联网 发布:成都收银软件系统 编辑:程序博客网 时间:2024/06/01 08:18
sql语法
1. 基础语句
1.重要命令
- SELECT - 从数据库中提取数据
- UPDATE - 更新数据库中的数据
- DELETE - 从数据库中删除数据
- INSERT INTO - 向数据库中插入新数据
- CREATE DATABASE - 创建新数据库
- ALTER DATABASE - 修改数据库
- CREATE TABLE - 创建新表
- ALTER TABLE - 变更(改变)数据库表
- DROP TABLE - 删除表
- CREATE INDEX - 创建索引(搜索键)
- DROP INDEX - 删除索引
2.DISTINCT 语法
查询列中的元素 减去 重复元素
SELECT DISTINCT column_name,column_nameFROM table_name;
3.insert语句
也可以不指定列进行插入
INSERT INTO Websites (name, url, country)VALUES ('stackoverflow', 'http://stackoverflow.com/', 'IND');
4.update语句
(注意where)
UPDATE Websites SET alexa='5000', country='USA' WHERE name='菜鸟教程';
5.delete语句
删除指定的行(注意where)
DELETE FROM WebsitesWHERE name='百度' AND country='CN';
6.TOP, LIMIT语句
限定查询的条数,对大记录表常用
1. Mysql的limit:SELECT * FROM Persons LIMIT 5;
Oracle的limit:
SELECT * FROM Persons WHERE ROWNUM <11;
查询前10条数据
top语句:
SELECT TOP 50 PERCENT * FROM Websites;
7.like语句
模糊搜索,下面是不包含语句 SELECT * FROM Websites WHERE name NOT LIKE '%oo%';
- ”_“单个字符通配符的使用 :
SELECT * FROM WebsitesWHERE name LIKE 'G_o_le';
- [charlist] 通配符
查询以A到H任何一个字符开头的信息,也可以写成^[ABC]
表示以ABC其中一个字符开头 s
8.in语法
相当于==,但是in可以一次规定多个值
SELECT * FROM WebsitesWHERE 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 )
9.between语法
SELECT * FROM access_logWHERE date BETWEEN '2016-05-10' AND '2016-05-14';
between可以对日期进行筛选,输出的值包括2016-05-10和2016-05-14,不包括between前面添加not
10.as别名
SELECT name, CONCAT(url, ', ', alexa, ', ', country) AS site_infoFROM Websites;
之中CONCAT将几个列组合成一个列,再给它设置别名
11.join语法
- INNER JOIN:如果表中有一个不匹配,则不返回行
- LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
- RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
- FULL JOIN:只要其中一个表中存在匹配,则返回行
[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中对应的列。
12.UNION操作符
UNION 中每个 SELECT 语句必须数量相同,数据类型相似,顺序相同。
SELECT column_name(s) FROM table1UNIONSELECT column_name(s) FROM table2;
如果想要显示值一摸一样的数据,则用UNION ALL
(查询交集使用intersect)
13.SELECT INTO复制
SELECT INTO 语句从一个表复制数据,然后把数据插入到另一个新表中。
1. 新建复制整个表 :CREATE TABLE 新表 SELECT * FROM 旧表
2. 新建复制指定列:
CREATE TABLE 新表 SELECT * FROM 旧表
3.新建复制表不包括内容:
SELECT *INTO newtableFROM table1WHERE 1=0;
4.复制已有表内容
INSERT INTO table2SELECT * FROM table1;
复制已有表内容的指定列
INSERT INTO Websites (name, country)SELECT app_name, country FROM apps;
14.sql约束
- NOT NULL - 指示某列不能存储 NULL 值。
- UNIQUE - 保证某列的每行必须有唯一的值。
每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。 - PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更_容易更快速地找到表中的一个特定的记录。
- FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
设置一个字段是另一个表的外键可以预防破坏表之间连接的行为
- CHECK - 保证列中的值符合指定的条件。
check约束用来定义一些值的规则
ALTER TABLE PersonsADD CHECK (P_Id>0)
P_Id的输入值必须大于0
- DEFAULT - 规定没有给列赋值时的默认值。
当值为空的时候,使用默认值
ALTER TABLE PersonsALTER City SET DEFAULT 'SANDNES'
15.索引
在 “Persons” 表的 “LastName” 列上创建一个名为 “PIndex” 的索引:
CREATE INDEX PIndexON Persons (LastName)
如果要创建唯一的索引值,再index前面添加unique
16.删除语句
- 删除索引
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
17.视图
- 创建视图CREATE
CREATE VIEW view_name ASSELECT column_name(s)FROM table_nameWHERE condition
- 更新视图语句CREATE OR REPLACE
CREATE OR REPLACE VIEW view_name ASSELECT column_name(s)FROM table_nameWHERE condition
- 删除视图
DROP VIEW view_name
18.case,when,then语句
将查询的数字转化为对应的文字输出
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
19.inst函数
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
20.Oracle trunc()函数
/****日期**********/
- select trunc(sysdate) from dual –2013-01-06 今天的日期为2013-01-06
- select trunc(sysdate, ‘mm’) from dual –2013-01-01 返回当月第一天.
- select trunc(sysdate,’yy’) from dual –2013-01-01 返回当年第一天
- select trunc(sysdate,’dd’) from dual –2013-01-06 返回当前年月日
- select trunc(sysdate,’yyyy’) from dual –2013-01-01 返回当年第一天
- select trunc(sysdate,’d’) from dual –2013-01-06 (星期天)返回当前星期的第一天
- select trunc(sysdate, ‘hh’) from dual –2013-01-06 17:00:00 当前时间为17:35
- select trunc(sysdate, ‘mi’) from dual –2013-01-06 17:35:00 TRUNC()函数没有秒的精确
/*****数字**********/
/*
TRUNC(number,num_digits)
Number 需要截尾取整的数字。
Num_digits 用于指定取整精度的数字。Num_digits 的默认值为 0。
TRUNC()函数截取时不进行四舍五入
*/
- select trunc(123.458) from dual –123
- select trunc(123.458,0) from dual –123
- select trunc(123.458,1) from dual –123.4
- select trunc(123.458,-1) from dual –120
- select trunc(123.458,-4) from dual –0
- select trunc(123.458,4) from dual –123.458
- select trunc(123) from dual –123
- select trunc(123,1) from dual –123
- select trunc(123,-1) from dual –120
【真实例子】
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')) delayfrom th_project_info a, th_project_superv b, c_task_info cwhere 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转化为字符串
21.Group by分组
group对部分信息的共性进行提取,一般和分组统计函数配合使用
Count:找到记录数Min:列的最小值 Max:列的最大值Sum:计算列的总和 Avg:计算列的平均数
【例子】查询每个雇员sales_rep_id总订单数
select sales_rep_id,sum(order_total) from orders group by sales_rep_id;
22.having限制搜索条件
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;
23.自连接
有时候需要将同一个表自身数据进行比较,这个时候就需要用自连接
SELECT FIRST.CNumber, SECOND.PCNumberFROM Course FIRST, Course SECONDWHERE FIRST.PCNumber=SECOND.CNumber;
24.自然连接
自然联结就是将有相同列的两个表进行组合成一张表,对应不上的就不显示,一对二的就拆分成两条数据
【例子】
select product_id,p.categroy_id,category_name from product_information p natural join categories ca;
- 从零基础认识sql语法
- 从零基础认识SQL注入
- 从零基础认识jdbc
- 从零基础认识事务
- 从零基础认识myBatis
- 从零基础认识Ioc
- 从零基础认识aop
- 从零基础认识ssm
- 从零基础认识ssm
- 从零基础认识连接池
- 从零基础认识maven工程构建
- 从零基础认识easyUI的dataGrid
- 从零基础认识分页插件Pagehelper
- 从零基础认识 easyUI tree插件
- 从零基础认识爬虫-简单爬取tripadvisor网站
- 从零基础认识Controller控制页面跳转
- 从零基础认识KindEditor实现图片上传
- 从零基础认识KindEditor富文本编辑器
- JTAG(SWD)的参考电压
- 机器学习常用算法总结(二)
- JavaWeb学习心得之开发环境搭建(Tomcat服务器)
- 7-20 奥运排行榜
- 变态的素数筛选题 精简到肝胆俱裂 时间<0.2s
- 从零基础认识sql语法
- 计算机网络 学习摘要(3)
- 欢迎使用CSDN-markdown编辑器
- 7-21 PAT排名汇总
- No MyBatis mapper was found in '[com.study.dal.***.mapper]' package
- 【LeetCode】Binary Tree Zigzag Level Order Traversal 二叉树的锯齿形层次遍历
- Rhyme/ 手写服务器 实现一个基于xml解析的简单的Tomcat服务器
- PTA 7-22 模拟EXCEL排序
- python yield 简单理解