sql语句学习

1.文本处理函数

LEFT() 返回字符串左边的字符
LENGTH() 返回字符串长度
LOWER() 将字符串转换为小写
LTRIM() 去除字符串左边的空格
RIGHT() 返回字符串右边的字符
RTRIM() 去除字符串右边的空格
SOUNDEX() 返回字符串的soundex值
  将任何文本串转换为描述其语音表示的字母,即搜索发音类似的

举例
比如要搜索customers_contact是michael green,但是记不清了拼写,只记得是michelle green 那么
select customers_contact
from customers
where soundex(customers_contact) = soundex(‘michelle green’)

UPPER() 将字符串转换为大写

2.日期处理

oracle

 to_number(to_char(order_date,‘yyyy’))=2012
分析,tochar用来提取日期,tonumber转换为数值,
或者 between to_Date(‘01-01-2012’) and to_date(‘12-31-2012’)

mysql

Year(order_date)=2012

3.数值处理函数

abs() 返回绝对值
cos() 返回余弦
exp() 返回指数值
pi() 返回圆周率
sin() 返回正弦
sqrt() 返回平方根
tan() 返回正切
cell()上限
floor()下限

3.聚合函数

avg() 忽略null
count() count(*)统计所有行数 count(column)统计对应列名的计数,不包含null
max()
min()
sum()

avg可以与distinct结合使用,比如说只统计不同数的平均值

4.联接

内连接和外链接示意图

5.组合查询

关键字 : union
把两个或两个以上的查询语句用union联接,求查询结果的并集
注意:
  union连接的查询必须包含相同的列,表达式或聚集函数。(不过,各个列不需要以相同的次序列出。)
如果不想取消重复行,用union all
关键字 : intersect
 返回两个查询相同的部分(交集)
关键字 : espect
 返回第一个查询有而第二个查询没有的部分

注意: 组合查询order by是对整体查询结果排序。
但是group by 和having可以分别应用于单独的每个查询。

6.插入

insert into 表名 (字段名) values (值)
把一个表的内容插到另一个表里:
   insert into A表 (字段名) select 字段名 from B表

7.复制表

select * into copy
from 原表

mysql中的语法
create table copy as select * from 原表

8.修改表名,列名

mysql
   ALTER TABLE 旧名RENAME TO 新名;
   ALTER TABLE 表名 CHANGE 字段名 新字段名 字段类型;

9.视图

视图可以重用sql语句,简化复杂的sql操作,使用表的一部分而不是整个表
可以保护数据,可以授予用户访问表的特定部分权限,而不是整个表的访问权限
create view 视图名(必须唯一) as 查询语句

10.约束

主键
创建表的时候指定属性 primary key
alter table tablename
add constraint primary key (字段名)
外键
创建表的时候 指定属性 references 另一个表的表名(关联字段)
alter table tablename
add constraint foreign key (字段名) references 另一个表名(关联字段)
唯一约束
unique :某个字段想要不能重复,但是不想作为主键,建表时候指定
检查约束
对这个字段的值进行一定的限制 check (该字段的限制表达式)

11.in和exists的区别

select * from A
where id in(select id from B)
in:后面的子查询只会执行一次,查询结果放到缓存中,这个查询语句执行的时候,每次查到a表的一个结果,都会遍历b表的查询结果去找有没有相同的,即嵌套遍历。
如果b表结果集太大,非常影响效率。
exists:不缓存,返回的是是否有这个值,对于每一个a结果集,都会判断b结果集有没有。遍历只有a结果集。相当于,遍历a中的每一个结果,查询b语句且条件为a的这个结果。但是每次exists后面的子查询都会查数据库,性能低
总结,b表数据小用in,b表数据大用exists

关于not in和not exists
用下面的例子说明

test001
1
3
4
7
null
test002
2
null
null
4
5

1.SELECT * FROM test001 WHERE NOT EXISTS (SELECT * FROM test002 WHERE test001.id=test002.id)
2.SELECT * FROM test001 WHERE id NOT IN(SELECT * FROM test002 WHERE test001.id=test002.id)
如果不加后面的限定条件,查询出来的为空
如果不加条件,语句2的子查询查出来的是1,3,4,7,null,就等价于id<>1,id<>3…id<>null
id<>null一定会返回unknown所以where条件一直不成立故返回空

比较注意点:一般判断是否为null用的都是is not null,is null

12.exists/not exists嵌套

例: 查询选修了全部课程的学生的名字

答:
select sname from student
where not exists
  select * from course where not exists
    select * from sc where course.cno=sc.cno andstudent.sno=sc.sno
解析: 思路:循环遍历,最外面选择每个学生,去课程表例查询每一个课程,然后到选课表找这个学生的这个课程是否被选,如果没被选,返回,,如果没有没选的课,最终返回这个学生名字。
sql优化:

13.求反(not)

1.不等于 !=或者<>
2.not between 不在…之间,边界也不包含
3.not in
4.not like

14. 字符函数

1.contact(,) 串接函数
2.translate(字段,原字符,现字符)
3.replace(字段名,元字符,现字符)
4.upper()
5.lower()
6.substr(字段名,开始位置,长度)起始位置是1并不是0
7.instr(字段名,字符),找字段里某个字符第一次出现的位置
8.ltrim(字段名,截取内容)从左截取
9.rtrim()从右截取
10.decode() oracle中的函数,
 mysql中用case when 条件 then 值 else 值 end代替
11.ifnull(字段名,替代)
12.lpad(字段名,总长度,填充内容)左填充
13.rpad()右填充
14.ascii()返回ascii码

15.字符串和数字互换

数字->字符串 concat(数字,’’)
字符串->数字 CAST(123 AS CHAR)这个函数只能char->number所以要把varchar变成char

16.日期和时间

mysql获取当前日期和时间 now()
日期+1:date_add(日期字段,interval 1 day)
dayname显示星期几
dayofmonth显示几日
dayofweek显示一年中第几个星期
dayofyear显示一年中的第几天

字符串和日期互相转换
date_format(date, format)
str_to_date(str, format)
时间字符串转时间戳
unix_timestamp(date/字符串) 时间或者字符串转时间戳
from_unixtime() 时间戳转时间
from_unixtime(1451997924,’%Y-%d’)时间戳转字符串

17. 索引

创建索引 create inde indexname on tablename(字段名)
唯一索引 create unique inde indexname on tablename(字段名)
组合索引 create inde indexname on tablename(字段名1,字段名2)
什么时候应该使用索引
  1.一般来说,大多数用于表结合的字段都应该设置索引。
  2.经常在order by 和group by中引用的字段也应该考虑设置索引。
  3.具有大量唯一值得字段,或是在where子句里会返回很小部分记录的字段。
什么时候应该避免使用索引
  1.小规模的表不应该使用索引
  2.该字段用于where子句作为过滤器会返回表里大部分记录时,该字段就不适合设置索引
  3.经常批量更新的表可以用索引,但是批量更新也会更新索引,导致性能下降,解决方案,批量更新前删除索引,更新后重新添加。
  4.不应该对含有大量null的字段创建索引
  5.经常操作的字段不应该设置索引。

18.简单sql优化

1.对于大规模表建立索引,避免全表扫描
2.让sql优化器先读取最严格条件,可以缩短查询时间
3.多用in代替or
4.尽量避免使用having子句,会额外增加工作
5.避免大规模排序
6.对经常使用的sql语句使用存储过程
7.批加载的时候关闭索引

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle SQL语句学习可以分为几个分类:DML、DDL、DCL和TCL。DML包括select、delete、update和insert语句,用于对数据进行操作。DDL包括create table、truncate、drop和alter table语句,用于定义和管理数据库对象。DCL包括grant和revoke语句,用于数据库控制。TCL包括commit和rollback语句,用于事务控制。\[2\] 在编写SQL SELECT语句时,可以使用以下格式:SELECT *|{\[DISTINCT\] column|expression \[alias\],...} FROM table; 可以使用DISTINCT关键字去除重复行,使用alias给列或表达式起别名。可以使用比较条件关系符(如=、<>、>、<、>=、<=、!=、^=)来限制数据。还可以使用其他比较条件关系符,如between and、in(set)、like和is null。\[2\] 在编写SQL语句时,要注意字母大小写、是否添加注释等细微差别会导致语句具有不同的散列值,从而导致Oracle对语句进行硬解析。为了提高性能,应该使用绑定变量而不是常量。使用绑定变量时,即使改变了绑定变量的值,Oracle仍然可以共享这个语句,提高了查询的效率。\[3\] #### 引用[.reference_title] - *1* *3* [Oracle SQL学习](https://blog.csdn.net/xhw979850818/article/details/88142059)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Oracle-SQL学习](https://blog.csdn.net/gundongdexueqiu/article/details/7055885)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值