python -m pip install --user --upgrade pip==9.0.3
identity(1,1) 自动增加从1开始,每次增加1
1)把"一方"单独建表
2)把"多方"也建个表(要依赖"一方": 通过外键(补一个字段) )
外键:位于依赖的那个表,它是被依赖那个表是的主键
3)SQL代码实现
create table person2(
id varchar(32) primary key,
name varchar(30),
sex char(1),
age int
);
insert into person2 values('P1001','小花','0',25);
insert into person2 values('P1002','玉芬','0',24);
insert into person2 values('P1003','Tom','1',25);
insert into person2 values('P1004','Rose','0',23);
create table car(
id varchar(32) primary key,
name varchar(30),
price numeric(10,2),
pid varchar(32),
constraint car_fk foreign key(pid) references person2(id)
);
insert into car values('C001','BMW',82.5, 'P1001');
insert into car values('C002','BMW',111.5, 'P1001');
insert into car values('C003','Benz',78.5, 'P1001');
insert into car values('C004','BMW',55.5, 'P1002');
insert into car values('C005','Audio',82.5, 'P1002');
insert into car values('C006','QQ',6.5, 'P1003');
insert into car(id,name,price) values('C007','ABC',6.6);
查询://i. 查哪些人有哪些车
select person2.name, car.name, car.price from person2 inner join car on person2.id= car.pid;
select person2.name, car.name, car.price from person2 inner join car on person2.id = car.pid where person2.name ='小花';
//iii. 查询哪些人有两辆及以上的车
SELECT NAME FROM person2 WHERE id IN(SELECT pid FROM car GROUP BY pid HAVING COUNT(pid)>=2);
//iv. 查询哪些人没有车
SELECT NAME FROM person2 WHERE id not IN(SELECT pid FROM car GROUP BY pid HAVING COUNT(pid)>=1);
※关联(Join):把多个表的数据获取出来,在内存中生成一个新的表
Left Join(左关联):以左表为主(左表完整。右表中,跟左表有依赖关系的那些记录加进来,形成新表)
Right Join(右关联):以右表为主(右表完整。左表中,跟右表有依赖关系的那些记录加进来,形成新表)
Inner Join(内关联):两个表中存在依赖关系的那些记录抽取出来形成新表
Full Join(全关联)和 Outter Join(外关联),MySQL不支持!
新版(用左关联):
SELECT person2.name FROM person2 LEFT JOIN car ON person2.id = car.pid WHERE car.pid IS NULL;
新版(用右关联):
SELECT person2.name FROM car RIGHT JOIN person2 ON person2.id = car.pid WHERE car.pid IS NULL;
1、select name from person where part_id in (select nid form part where caption = "x");
2、链表方法 left join
select * from person left join part on person.part_id = part.nid;
left join:相当于将part表匹配的部分直接移动到person的列后面,组合起来显示。
select * from person left join part on person.part_id = part.nid where part.caption = "x";
select person.name from person left join part on person.part_id = part.nid where part.caption = "x";
join连接的条件,使用 on 进行对接的,条件写在on后面。
A left join B on a.xx = b.xx
left join的特点:
1、以A为主
2、将A中的所有数据罗列
3、B则只显示与A相对应的数据
select * from part left join person on person.part_id = part.nid;
right join 和left join刚好相反,以后面的表为主,显示其所有的数据。
inner join 会将没有建立关系的数据忽略掉,不管谁在前,结果都是一样。
select * from person inner join part on person.part_id = part.nid;
总结:
1、这几个join可以写多个的,意思就是一个表可以同时有多个外键。
2、当选择的列名,是所有表中唯一的话,可以不用写前缀的表名。如:person.part_id就可以直接写成part_id.
3、上面的part表,有个别名叫,字典表
1、创建主表:
create table UserInfo(
UserID int identity(1,1) primary key, --递增主键
UserAccounts varchar(20),
UserName varchar(20),
UserPwd varchar(10));
2、创建附表(含外键)
create table News(
NewsID int identity(1,1) primarykey,
UserID int,
NewsTitle varchar( 50 ),
NewsRelease varchar( 200 ),
NewsReleaseTime datetime,
FOREIGN KEY (UserID) REFERENCES UserInfo(UserID)); --外键约束
如果附表已存在,但没外键,可采用以下方法:
alter table profession add constraint fk_prov_id foreign key(prov_id) references province(prov_id) on update cascade on delete cascade;