SQL操作数据
1.查询
-
检索数据select
-
-
检索
- 检索单个列、多个列、所有列
- 检索不同的值(distinct)
- select distinct idfrom products;
- 限制结果
- top
- select top 5 name from products;
- fetch first 5 rows only
- select name from products fetch first 5 rows only
- limit
- select name from products limit 5
- top
-
子句类别
-
排序检索order by
- 按多个列排序
- 按列位置排序
- 指定排序方向asc 与desv
会默认升序asc - order by要放到最后(包括where后面)
-
过滤where
- 操作符
- 不匹配检查 <> !=
- 范围值检查 between
- 空值检查 is null
- AND操作符与OR操作符
- 求值顺序 AND优先
- 解决求值顺序问题 可以用()
- where (a or b) and c
- IN操作符
- in (a,b)
- NOT操作符
- whete not a=1
-
like和通配符
- % 任何字符出现任意次数
- 需要特别注意,除了能匹配一个或多个字符外,%还能匹配0个字符。%代表搜索模式中给定位置的0个、1个或多个字符
- 通配符%看起来像是可以匹配任何东西,但有个例外,这就是NULL。子句WHERE prod_name LIKE '%’不会匹配产品名称为NULL的行。
- _ 匹配单个字符
- [ ] 指定一个字符集
- 技巧
- 不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符
- 在确实需要使用通配符时,也尽量不要把它们用在搜索模式的开始处。把通配符置于开始处,搜索起来是最慢的
- 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据
- % 任何字符出现任意次数
- 操作符
-
汇总/聚集函数 avg() count() ...
- avg()
- AVG()函数忽略列值为NULL的行。
- AVG()只能用来确定特定数值列的平均值,而且列名必须作为函数参数给出
- count()
- 使用COUNT(*)对表中行的数目进行计数,不管表列中包含的是空值(NULL)还是非空值
- 使用COUNT(column)对特定列中具有值的行进行计数,忽略NULL值
- DISTINCT不能用于COUNT(*)
- max() min() sum()
- avg()
-
分组 group by
- select a from tables group by b
- 过滤分组 having
- where和having
- HAVING支持所有WHERE操作符
- WHERE过滤行,而HAVING过滤分组。
- select a from tables group by b having count(*)>1
- where和having
-
-
子句顺序
- select
- from
- where
- group by
- having
- order by
-
-
-
子查询
-
- 利用子查询进行过滤
- select id from orders where numin (select a from tables where b =1)
- 作为子查询的SELECT语句只能查询单个列,企图检索多个列将返回错误
- 作为计算字段使用子查询
- select name,(select count(*) from orders) as test from customers order by name;
- 利用子查询进行过滤
-
-
联结表
-
- 自联结
- 一个表自己和自己连接
- 同样的功能可以用“ 子查询 ”去完成
-
-- 自联结 SELECT C1.vendname,C1.productname,C1.productprice,C1.weight,C1.guide FROM productinfo AS C1,productinfo AS C2 /*注意给同一个表区别名,为了区分*/ WHERE C1.vendname=C2.vendname AND C2.productname='hc_002' -- 子查询 SELECT vendname,productname,productprice,weight,guide FROM productinfo WHERE vendname=(SELECT vendname FROM productinfo WHERE productname='hc_002')
- 内联结
- 自然联结
-
自然联结 ”不需要使用where 或者是 on 限定条件
- 同样的功能可以用“ 内联结 ”去完成
-
--自然联结 SELECT p.*,v.* FROM productinfo AS p NATURAL JOIN vendors01 AS v --内联结 SELECT p.*,v.* FROM productinfo AS p INNER JOIN vendors01 AS v ON p.vendname=v.vendname01 /*对于1内联结来说,列名不一样没关系*/
-
- 外联结
- 左外联结 LEFT OUTER JOIN
- 右外联结 RIGHT OUTER JOIN
- 全外联结 FULL OUTER JOIN
- 检索两个表中的所有行并关联那些可以关联的行
- 自联结
-
-
组合查询union
-
-
SELECT cust_name,cust_contact,cust_email FROM Customers WHERE cust_state IN ('IL', 'IN', 'MI') UNION SELECT cust_name,cust_contact,cust_email FROM Customers WHERE cust_name = 'Fun4All'
- 包含或取消重复的行
- UNION从查询结果集中自动去除了重复的行;换句话说,它的行为与一条SELECT语句中使用多个WHERE子句条件一样
- 如果确实需要每个条件的匹配行全部出现(包括重复行),就必须使用UNION ALL
-
-
-
SQL查询栗子
2.插入、更新、删除
-
插入数据insert
- 插入完整的行
- 插入部分行
- 插入检索出的数据insert select
- 栗子
- 假如想把另一表中的顾客列合并到Customers表中
- 栗子
- 从一个表复制到另一个表select into
-
更新数据 update
- update customeres set email=null where...
-
删除数据delete
- delete from customers where...
3.计算
-
字段
- 拼接字段
- (+)或(||)
- 语句栗子
- select concat(name,''',country,')') from tables order by name
- 使用别名 AS(表和字段 等可以)
- 执行算术计算 +-*/
- select a*b from table
- 拼接字段
-
函数
- 处理文本字符串
- right(),left() 左边的字符
- length() 字符串长度
- lower() upper()
- rtrim();ltrim() 去掉字符串左边的空格
- soundex()
- 算术操作
- abs() 绝对值
- cos() sin() tan()
- exp() 指数
- pi() 圆周率
- sqrt() 平方根
- 处理日期和时间
- DATEPART()
- to_char() 提取日期的成分
- to_number() 将提取出的成分转换为数值
- YEAR()提取年份
- 返回正使用的特殊信息
- 处理文本字符串