Mysql复习
1、distinct关键字只在select单个属性时有效果,多个属性无效。
select distinct a,b from A;
//若有两个元组分别为(a=1,b=1)和(a=1,b=2)
//该次选择是会把这两条元组都筛选出来的
2、exists关键字
score表有s_id,c_id,score三个字段。
select * from score a where exists (select * from score b );
和
select * from score a where exists (select s_id from score b );
返回结果相同,即若内外查询无指定关联,只要内查询结果不为空,那就返回外查询成功的全部元组,否则返回空。
not exists关键字与exists关键字含义相反,表示后面跟的内查询返回值若为True,则外查询返回空;若内查询返回False,外查询则正常返回筛选的元组。
3、两个select语句可以并union、做交intersect、做差except。
4、改名操作:
查询的列改名要加as
select s_id as 学号,avg(s_score) as 平均成绩 from score
group by s_id
having avg(s_score)>60
order by s_id;
表重命名直接写在表名后面就行
select a,b
from sc A,st B
where A.c=B.c;
4、join、left join 、 right join、full join
其中join为内连接,剩下三个外连接。
join和full join可以不加on或using()限制(根据我本人测试mysql好像不支持full join 加on条件,不知道咋回事),此时join和full join都变成笛卡尔积。
不写outer也会默认为外连接,自然连接需指定natural关键字
用using作为限制条件时候,取两表的共有属性名,using(A1,A2),必须加括号。
5、插入数据:
insert into SC(A,B) values(a1,b1),(a2,b2),etc
//如果是全部属性的元组插入可略去表名后的(列名)
即:insert into SC values(a,b);
删除数据:
delete from SC [where ...]
//不加where则将表清空(表还在,只是没数据了)
修改数据:
update t3 set x=5,y='e' where y='a';
//mysql里update语句好像不支持row关键字
6、调整表结构:
新建表:
create table SC
(A int(10), //主键不必加NOT NULL
B char(10) not null,
primary key (A),
reference T(A)); //假设另一个表T中有同一个字段A,则这里指明外键关系
删除表:
drop table SC cascade/restrict;
表结构改动:
alter table SC add C int(11);
//添加新列C到SC表中
alter table SC drop C cascade/restrict;
//删除C列
alter table SC modify C char(50);
//将C列改成char(50)类型
7、嵌入式sql:
exec sql 打头,ebd_exec结束,共享变量前加:
8、mysql中的if和case语句:
case语句:
表示等于的简单版:
select *,(CASE sex WHEN '1' THEN '男' WHEN '0' THEN '女' ELSE '保密' END) as sex_text
from user
表示大小于:case when X1 then Y1 when X2 then Y2 else Y3 end
mysql> select *,(case when s_score>60 then'pass' else 'fail'end)as status from score;
+------+------+---------+--------+
| s_id | c_id | s_score | status |
+------+------+---------+--------+
| 01 | 01 | 80 | pass |
| 01 | 02 | 90 | pass |
| 01 | 03 | 99 | pass |
| 02 | 01 | 70 | pass |
| 02 | 02 | 60 | fail |
| 02 | 03 | 80 | pass |
| 03 | 01 | 80 | pass |
| 03 | 02 | 80 | pass |
| 03 | 03 | 80 | pass |
| 04 | 01 | 50 | fail |
| 04 | 02 | 30 | fail |
| 04 | 03 | 20 | fail |
| 05 | 01 | 76 | pass |
| 05 | 02 | 87 | pass |
| 06 | 01 | 31 | fail |
| 06 | 03 | 34 | fail |
| 07 | 02 | 89 | pass |
| 07 | 03 | 98 | pass |
+------+------+---------+--------+
if语句:
if(exp1,exp2,exp3)
若exp1为真返exp2字段否则exp3字段
ifnull(exp1,exp2)
若exp1空返回exp2
9、
select from where 语句的执行顺序:
先from取表,再where筛选,groupby分组,having条件筛选组,select挑选属性,最后orderby排序