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() 将字符串转换为大写
to_number(to_char(order_date,‘yyyy’))=2012
分析,tochar用来提取日期,tonumber转换为数值,
或者 between to_Date(‘01-01-2012’) and to_date(‘12-31-2012’)
Year(order_date)=2012
abs() 返回绝对值
cos() 返回余弦
exp() 返回指数值
pi() 返回圆周率
sin() 返回正弦
sqrt() 返回平方根
tan() 返回正切
cell()上限
floor()下限
avg() 忽略null
count() count(*)统计所有行数 count(column)统计对应列名的计数,不包含null
max()
min()
sum()
avg可以与distinct结合使用,比如说只统计不同数的平均值
关键字 : union
把两个或两个以上的查询语句用union联接,求查询结果的并集
注意:
union连接的查询必须包含相同的列,表达式或聚集函数。(不过,各个列不需要以相同的次序列出。)
如果不想取消重复行,用union all
关键字 : intersect
返回两个查询相同的部分(交集)
关键字 : espect
返回第一个查询有而第二个查询没有的部分
注意: 组合查询order by是对整体查询结果排序。
但是group by 和having可以分别应用于单独的每个查询。
insert into 表名 (字段名) values (值)
把一个表的内容插到另一个表里:
insert into A表 (字段名) select 字段名 from B表
select * into copy
from 原表
mysql中的语法
create table copy as select * from 原表
mysql
ALTER TABLE 旧名RENAME TO 新名;
ALTER TABLE 表名 CHANGE 字段名 新字段名 字段类型;
视图可以重用sql语句,简化复杂的sql操作,使用表的一部分而不是整个表
可以保护数据,可以授予用户访问表的特定部分权限,而不是整个表的访问权限
create view 视图名(必须唯一) as 查询语句
主键
创建表的时候指定属性 primary key
alter table tablename
add constraint primary key (字段名)
外键
创建表的时候 指定属性 references 另一个表的表名(关联字段)
alter table tablename
add constraint foreign key (字段名) references 另一个表名(关联字段)
唯一约束
unique :某个字段想要不能重复,但是不想作为主键,建表时候指定
检查约束
对这个字段的值进行一定的限制 check (该字段的限制表达式)
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
例: 查询选修了全部课程的学生的名字
答:
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优化:
1.不等于 !=或者<>
2.not between 不在…之间,边界也不包含
3.not in
4.not like
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码
数字->字符串 concat(数字,’’)
字符串->数字 CAST(123 AS CHAR)这个函数只能char->number所以要把varchar变成char
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’)时间戳转字符串
创建索引 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.经常操作的字段不应该设置索引。
1.对于大规模表建立索引,避免全表扫描
2.让sql优化器先读取最严格条件,可以缩短查询时间
3.多用in代替or
4.尽量避免使用having子句,会额外增加工作
5.避免大规模排序
6.对经常使用的sql语句使用存储过程
7.批加载的时候关闭索引