SQL实例教程
现有person表一张,记录F公司的所有在职人员信息。表中的信息包括员工名字,年龄,薪酬
id | name | age | salary |
---|---|---|---|
1 | Joey | 23 | 4000 |
2 | Monica | 22 | 3300 |
3 | Ross | 25 | 8000 |
4 | Ross | 70 | 12000 |
... | ... | ... | ... |
查询语句
SQL中的查找使用select语句
你可以通过select查找person表中所有的信息
select * from person;
有些SQL语句需要以;结尾
如果你只想查找表中的名字
select name from person;
如果名字叫做Ross的人比较多,可以使用distinct去掉重复,只显示一个Ross
select distinct name from person;
如果你想知道关于Joey的信息,你可以使用where语句
select * from person where name='Joey';
但是,你发现有若干个Joey,而你只想查找年纪23的Joey,那你可以使用and语句
select * from person where name='joey' and age=23;
person表中有很多的名字叫Ross,你想把他们都找出来,并让他们按照年纪进行升序排序
select * from person where name='Ross' order by age;
如果你想让Ross的信息以年龄降序排列输出,可以
select * from person where name='Ross' order by age desc;
插入语句
有一天,公司来了一个采购部的经理助手,名字叫Rachel,年纪24岁,薪酬为4500。现在需要插入person表格中,你可以使用insert into语句
insert into person values ('Rachel',24,4500);
或者
insert into person (name,age,salary) values ('Rachel',24,4500);
update语句
在工作了几个月后,新来的Rachel同学深受Ross的赏识,于是决定给Rachel加薪到6000,你可以使用update-set-where调整Rachel的薪酬
update person set salary=6000 where name='Rachel';
删除语句
然而好景不长,又过了几个月,Rachel和Ross大吵了一架。伤心的Rachel决定离开F公司,另谋高就。我们可以使用delete from...where...语句删除表里面Rachel的信息
delete from person where name = 'Rachel';
limit语句
F公司对公司员工的年龄进行一次统计,于是你得找出公司中年龄最大的三个员工,你可以使用limit限制输出的员工信息条数
select name, age from person order by age desc limit 3;
like模糊查找
有一天,你闲得很疼,所以你决定查询一下除了Joey外,公司里面有多少人的名字中间带有"o"
select name from person where name like '%o%';
%匹配一个或多个字符,于是发现了Monica和Phoebe
如果你只想要匹配一个字符,可以使用_
[name]表示匹配任意name中一个字符,你可以通过一下方式查找名字不以"J","P","M" 开头的人
select name from person where name like '[!JPM]%';
in操作符
in操作符可以替代or,如果你想查找公司里面所有叫Joey和Phoebe的员工信息
select * from person where name in ('Joey','Phoebe');
between语句
F公司的员工信息是按照入职时间录入的,假设你想要查找在Joey入职后,到Phoebe入职期间,公司有多少个新职员
select * from person where name between 'Joey' and 'Phoebe';
Alias语句
Alias可以指定别名,如果你想查询F公司里面名字叫Joey,工资为8000的员工信息时,你可以
select name as n, salary as s from person;
join语句
现在假设F公司里面还有一张表vacation,表格里面记录了公司的各个员工的剩余休假天数
id | day | pid |
---|---|---|
1 | 6 | 3 |
2 | 7 | 5 |
3 | 0 | 2 |
... | ... | ... |
由于记录vacation表的时候使用的是员工的id,即本表中的pid,为了将两个表中的信息串联起来,于是你这样写:
select person.name,vacation.day from person,vacation where person.id = vacation.pid;
当然你也可以使用join语句
select person.name, vacation.day from person inner join vacation on person.id = vacation.pid;
union语句
如果你想要从person表和vacation表中查询数据,并把结果合并,可以使用union
select name from person
union
select day from vacation;
union默认去除相同的查询结果,如果你想要获取原始的查询结果可以使用union all
create语句
为了保险起见,F公司让你将person表进行备份,并将备份数据导入到备份数据库F.mdb中,于是你先要创建一个数据库F
create database F;
use F;
接着,你需要创建一个为名personcopy的备份表
create table personcopy
(
id int,
name varchar(255),
age int,
salary int
);
然后将person中的数据copy到备份表personcopy中
insert into personcopy select * form person;
这样就完成了备份工作,但,其实你还有一种更加简单的方法
create table usercopy(
select * from user
);
constraints约束
当你以第一种方法备份完数据库之后,主管马上找到了你,因为你在create table时犯了一些微小但是严重的错误:personcopy的列未添加约束。
主管建议你给id,age列都加上not null约束,并且作为表的唯一标识的id需要加上primary key约束以及自增auto_increment
create table personcopy (
id int not full auto_increament,
name not full,
salary
primary key (id)
);
alter语句
尽管你已经做得很好了,但是还是有一些细节忽略了,personcopy中的age不能小于18,salary默认应该为0。已经重建了一次表格的你不想再重建了,于是你使用alter来添加约束
alter table personcopy
alter salary set default 0;
alter table personcopy
add check (age>18);
又过了几天,主管又来提需求了,他需要你在personcopy中添加一个新的列,工龄workingage
alter table personcopy
add workingage int check(workingage>0);
drop语句
公司的老员工Gunther因为长期得不到公司的重视,于是,他做了一件极其不光彩的事
drop column salary;
他将person中的salary给删除掉了!
drop table person;
接着Gunther干脆把整个person给删掉了
drop database F;
然后Gunther跑路了