DBMS: database manager system
检索数据
select 检索表中的一个或多个列
子句:SQL语句由子句构成,有些是必须的,有些可选.比如select语句的from就是子句
order by子句 排序检索子句
位置:保证是select语句的最后一条子句
可以通过非选择列排序
按多个列排序如 order by name,price 先排名字,如果名字相同在排价格
按列位置排序如 order by 2,3 先排select清单的第二列如果相同再排第三列(select排序用的是
非select清单的列就不能使用)
指定排序方向 升序(A-Z) 默认asc
降序(Z-A) order by price desc
where子句 过滤数据
位置:再from子句之后
where子句操作符
= 等于
<> 不等于
!= 不等于
< 小于
<= 小于等于
!< 不小于
> 大于
>= 大于等于
!> 不大于
between 在指定值之间(包括两端)
is null 为null值
单引号的使用:限定字符串(串类型的数据用) 非串类型不用
如 where name = 'wy' where price = 100;
检查单个值 < >
不匹配检查 <> !=什么的
范围值检查 where price between 10 and 100;
空值检查 where price is null;
高级数据过滤
组合where子句:SQL允许使用多个where子句.这些子句用and子句或or子句的方式使用
操作符:用来联结或改变where子句中的子句的关键字.(也叫逻辑操作符)
and操作符 where price = 100 and where name = 'wy';
or操作符 where price = 100 or where name = 'wy';
计算次序 where可以包含任意的and和or操作符结合以进行更复杂的过滤操作
无圆括号优先处理and 由括号处理括号
in操作符 指定条件范围,范围中每个条件都可以进行匹配,值用','分开且在括号内(XXX,XXX,XXX);
where name in ('wy','zyx');
not操作符 否定后面的条件(mysql只支持not exists)
通配符过滤
like操作符:搜索子句使用通配符时,必须用like操作符
%通配符:任何字符出现任意次数 fish% fish开头的字符串
%fish% 包含fish的字符串
_通配符:匹配单个字符 fish_ fishX X为一个字符
[]通配符:
创建计算字段
计算字段
拼接字段:||(推荐)或 + 将字段联结起来
(mysql不支持||+,但是使用concat()函数 count(name, '(' ,id , ')' ); 结果wy(001) );
CONCAT(vend_name,'---', vend_country); 网易--中国
使用别名: as关键字: as XXX
执行算数计算 可以将字段运算结果作为字段输出(+-*/)
select price*quantity as price from order;
数据处理函数(不同的数据库可能不同)
常见函数
获取串 sunstring()
数据类型转换 convert()
获取当前日期 getdate()
使用
1.处理文本串(删除或填充值,转换大小写)
2.算数操作(返回绝对值,代数运算)
3.处理日期和时间值(日期只差,日期有效性)
4.返回特殊信息(用户登录信息)
文本处理函数
left() 返回串左边的字符 select left('cat and dog',5); 结果 cat a
length() 返回串的长度
lower() 转小写
ltrim() 去掉串左边的空格
right() 返回串右边的字符
rtrim() 去掉串右边的空格
soundex() 返回串的soundex值(匹配发音类似的东东)
upper() 转大写
日期于时间处理函数 日期格式 'xxxx-xx-xx' '1002-12-22 01:20:21' 不是很严格(容错强)
select year(日期); 获取年
select mouth(日期); 月
select hour(日期); 小时
........
数据汇总
聚集函数:运行在行组上返回单个值
1.确定符合条件的行数
2.获得表中行组的和
3.找出特定列极值,平均
avg() 求平均 忽略值为null的列
count() 某列的行数 count(*)包括null的列 count(XXX)忽略值为null的列
max() 某列的max 忽略值为null的列 最大值最大时间最大文本的列的值
min()
snm() 求和 忽略值为null的列 sum(quantity*item_price) 求总价钱
聚集不同值
默认指定参数all(不需指定)
distinct参数去重复 select avg(distinct price) from orders;
//distinct 只能用于count(XXX) 不能用于count(*)
分组数据
分组是在select语句的group by子句中建立的
1.group by 可以包含任意数目的列
2.如果group by 内嵌套了分组,数据将在最后的分组上进行汇总
3.group by子句列出的每个列都必须是检索列或有效的表达式(不能是聚集函数).
4.
5.select语句的每个列都必须在group by 中给出(否则没意义)
6.如果分组中由null则作为一个分组返回.如果有多个null,他们将分为一个组.
7.group by 子句出现在where之后,order by 之前
过滤分组:因为where过滤的是列而不是组,所以用having子句对组过滤
where子句可以用的语法having也可以用(通配符,多个操作符什么的)
区别:
where:在分组前过滤
having:分组后过滤
分组与排序
使用子查询
子查询:嵌套在其他查询中的查询
利用子查询进行过滤
只能是单列:作为子查询的select只能是查询单个列
作为计算字段使用子查询
联结表
创建联结表
select id,name from t1,t2 where 条件;
where语句过滤(如果不规律最大输出t1*t2条记录)
内部联结
select id,name from t1 inner join t2 on 条件;
与上条语句一样
完全限定列名(防止歧义) 表名.字段
创建高级联结
使用表别名
1.缩短SQL语句
2.允许在单条select语句中多次使用相同的表
表名 as 表别名
自联结
插入数据
数据插入(要保证由足够权限)
insert into t1 values(值1,值2…);
插入部分行 (省略的列必须允许null,有默认值)
insert into t1(字段1,字段2…) values(值1,值2…);
插入检索出的数据
insert into t1 (字段…) select 字段… from t2;
复制oracle的 select into语句
select 字段1, 字段2…into tCopy from t;
select * into tCopy from t;
mysql的
create table tCopy as select * from t;
更新和删除数据update,delete(小心使用)
更新
1.更改特定行
2.更改所有行
update 表名 set 字段名=XXX where XXXX;(不写where过滤就麻烦了,全改)
删除
1.删除特定行
2.删除所有行
delete from 表名 where XXX;(不写where过滤就麻烦了,全删内容表还在)
truncate炸掉表(表都木有)
创建和操纵表
创建
create table 表名 (字段1,字段2….);
create table 表名 (字段1 not null,字段2,字段3….);
使用null值
见上条语句(就一个字段不写not null)
指定默认值
create table 表名 (字段1 default 1,字段2,字段3….);
一般默认的是时间值(mysql用curren_date());
create table stu2 (
id int,
name varchar(100) default ‘xiaoming’,
sdate timestamp default current_timestamp //时间默认为当前时间
);
更新表alter table
加字段 alter table 表名 add 字段;
删字段 alter table 表名 drop 字段;
修改列类型 ALTER TABLE 表名 MODIFY job varchar(60);
修改列名 ALTER TABLE user CHANGE name username varchar(100);
删除表drop
drop table 表名;
重命名rename
RENAME TABLE employee TO user;
未完待续~~