mysql笔记二----mysql数据库乱码出现的原因、解决办法和表之间的设计,增加约束

INSERT INTO sstud(sno,sname,sage,saddress,ssex) VALUES(‘1013’,’Big’,25,’自己人’,’男’);
DELETE FROM sstud WHERE sno=’1013’;
UPDATE sstud SET saddress=’中国北京’ WHERE sno=’1013’;
SELECT * FROM sstud ;
SELECT COUNT(*) FROM sstud GROUP BY saddress;
解决中文乱码,如下三个编码保持一致就可以。
character_set_client、character_set_connection、character_set_results
show VARIABLES WHERE Variable_name LIKE ‘character%’;查看数据库的编码信息
SET character_set_results =utf8 //更改的是某个客户端的编码,其他客户端不影响

CASE-WHEN THEN END
SELECT sno,sname,saddress ,(CASE ssex WHEN ‘1’ THEN ‘男’ WHEN ‘0’ THEN ‘女’ ELSE ‘其他’ END) AS 性别 FROM sstud;//对表中了数据进行重命名

※无关子查询
//查询具有相同年龄的人个数
SELECT sname FROM sstud GROUP BY sage HAVING COUNT(sage) > 1 ORDER BY COUNT(*) DESC
※相关子查询
//查询不但具有相同年龄,而且性别是男的那些人

SELECT * FROM sstud GROUP BY sage HAVING COUNT(sage)>1 AND ssex=’1’;

表与表之间的关系(尽量满足第三范式)
1、一对一
需要两个表。当然做项目时为了省空间,通常只建一个表,如果要实现一对一的查询,可以建两个视图。示例如下:
1)建物理表,初始化数据
CREATE TABLE person(
id INT,
NAME VARCHAR(10),
sex CHAR(1),
wife INT,
husband INT
);
INSERT INTO person VALUES(1,’小花’,’0’,0,3);
INSERT INTO person VALUES(2,’玉芬’,’0’,0,4);
INSERT INTO person VALUES(3,’张三’,’1’,1,0);
INSERT INTO person VALUES(4,’李四’,’1’,2,0);
INSERT INTO person VALUES(5,’王五’,’1’,0,0);
2) 建立两个视图
CREATE VIEW women AS SELECT * FROM person WHERE sex=’0’;
CREATE VIEW man AS SELECT * FROM person WHERE sex=’1’;
3) 查询夫妻信息
SELECT women.NAME AS 妻子,man.name AS 丈夫 FROM women,man WHERE women.husband=man.id;
//采用内联接–98以后的新方式–效率更高
SELECT women.NAME AS 妻子,man.NAME AS 丈夫 FROM women INNER JOIN man WHERE women.husband=man.id;

2、一对多,多对一

数据库设计分析
※案例:一个人可以拥有多辆汽车,要求查询出某人所拥有的所有汽车。
方案一(差的设计):
编号 姓名 性别 年龄 汽车编号 车型 排量 价格
P001 Jack 男 25 C001 BMW 12L 80w
P001 Jack 男 25 C002 Benz 12L 100w
P001 Jack 男 25 C003 Benz 12L 90w
P002 Tom 男 25 C004 BMW 12L 80w
P002 Tom 男 25 C005 Benz 12L 100w
P003 Rose 女 25 C006 Benz 12L 100w

方案二(好的设计):
1)把一方单独建个表
编号 姓名 性别 年龄
P001 Jack 男 25
P002 Tom 男 25
P003 Rose 女 25
2)把多方也建个表(依赖一方,通过外键–补一个字段)
外键:位于依赖一方,它是被依赖一方是主键
汽车编号 车型 排量 价格 车主
C001 BMW 12L 80w P001
C002 Benz 12L 100w P001
C003 Benz 12L 120w P001
C004 BMW 12L 80w P002
C005 Benz 12L 100w P002
C006 Benz 12L 100w P003
3) 代码实现
CREATE TABLE person2(
id VARCHAR(4) PRIMARY KEY,
NAME VARCHAR(10) NOT NULL,
sex VARCHAR(1) DEFAULT ‘男’,
age INT
)

INSERT INTO person2(id,NAME,sex,age) VALUES(‘P001’,’小花’,’0’,25);
INSERT INTO person2 VALUES(‘P002’,’张三’,’1’,22);
INSERT INTO person2 VALUES(‘P003’,’Jack’,’1’,24);
INSERT INTO person2 VALUES(‘P004’,’Rose’,’0’,25);

CREATE TABLE car (
id VARCHAR(4) PRIMARY KEY,
NAME VARCHAR(10) NOT NULL,
prices NUMERIC(6,2),
pid VARCHAR(4),
/为字段pid定义一个外键约束(来自person2表的字段id)/
CONSTRAINT fk_car FOREIGN KEY(pid) REFERENCES person2(id)
)
ALTER TABLE car DROP COLUMN prices;
ALTER TABLE car ADD COLUMN prices NUMERIC(6,2) ;
INSERT INTO car(id ,NAME,prices,pid) VALUES(‘C001’,’BWM’,80.8,’P001’);
INSERT INTO car(id ,NAME,prices,pid) VALUES(‘C002’,’Benz’,200.8,’P001’);
INSERT INTO car(id ,NAME,prices,pid) VALUES(‘C003’,’BWM’,100.8,’P001’);
INSERT INTO car(id ,NAME,prices,pid) VALUES(‘C004’,’Benz’,800.8,’P002’);
INSERT INTO car(id ,NAME,prices,pid) VALUES(‘C005’,’BYD’,8.8,’P002’);
INSERT INTO car(id ,NAME,prices,pid) VALUES(‘C006’,’BIKE’0.8,’P003’);
DELETE FROM person2 WHERE id=’p001’;
DROP TABLE person2;
DROP TABLE car;

3、多对多
数据库设计分析
※案例:一个人可以选择多门课程,一门课程又可以被很多人选择。
方案一(差的设计):
1)学生表
编号 姓名 性别 年龄 电话 …
P001 Jack 男 25
P002 Tom 男 25

P003 Rose 女 25

2)课程表
编号 名称 教材 学分… 学生
S001 Java … …… P001
S001 Java … …… P002
S001 Java … …… …
S002 数据库 … …… P001
S002 数据库 … …… P002
……

方案二(好的设计:两个实体表+一个关系表):
1)学生表(独立)—实体
编号 姓名 性别 年龄 电话 …
P001 Jack 男 25
P002 Tom 男 25
P003 Rose 女 25
2)课程表(独立)—实体
编号 名称 教材 学分…
S001 Java … ……
S002 数据库 … ……
S003 XML … ……
3)选课表(专为体现多对多的关系而新增的表)–关系
课程编号 学生编号
S001 P001
S001 P002

S002 P002
S002 P003

S003 P001

外键 外键
| |
|━━━━|
|
联合主键

4) 代码实现

CREATE TABLE stud (
id VARCHAR(5) PRIMARY KEY,
NAME VARCHAR(10) UNIQUE,
age INT
)

CREATE TABLE course(
id VARCHAR(5) PRIMARY KEY,
NAME VARCHAR(10) NOT NULL
)
CREATE TABLE sc(
sid VARCHAR(5),
cid VARCHAR(5)
)
//单独添加约束(注意顺序: 要先添加联合主键,再添加外键)
//创建联合主键
ALTER TABLE sc ADD CONSTRAINT pk_sc PRIMARY KEY(sid,cid);//增加主键
ALTER TABLE sc DROP PRIMARY KEY ;//删除主键。不需要其他参数
ALTER TABLE sc ADD CONSTRAINT fk_stud FOREIGN KEY(sid) REFERENCES stud(id);//添加外键
ALTER TABLE sc ADD CONSTRAINT fk_course FOREIGN KEY(cid) REFERENCES course(id);添加外键
ALTER TABLE sc DROP FOREIGN KEY fk_stud;/删除外键/
ALTER TABLE sc DROP FOREIGN KEY fk_course;//删除外键

INSERT INTO stud(id,NAME,age) VALUES(‘P001’,’小孩’,25);
INSERT INTO stud VALUES(‘P002’,’Jack’,23);
INSERT INTO stud VALUES(‘P003’,’Tom’,24);
INSERT INTO stud VALUES(‘P004’,’张三’,24);
INSERT INTO stud VALUES(‘P005’,’赵子龙’,26);

INSERT INTO course VALUES(‘C001’,’Java’);
INSERT INTO course VALUES(‘C002’,’JavaEE’);
INSERT INTO course VALUES(‘C003’,’XML’);
INSERT INTO course VALUES(‘C004’,’数据库’);
INSERT INTO course VALUES(‘C005’,’JQuery’);

INSERT INTO sc VALUES(‘P001’,’C001’);
INSERT INTO sc VALUES(‘P001’,’C003’);
INSERT INTO sc VALUES(‘P002’,’C001’);
INSERT INTO sc VALUES(‘P002’,’C002’);
INSERT INTO sc VALUES(‘P002’,’C003’);
INSERT INTO sc VALUES(‘P003’,’C001’);
INSERT INTO sc VALUES(‘P004’,’c002’);
INSERT INTO sc VALUES(‘P004’,’c003’);
DELETE FROM sc WHERE sid=’p004’ AND cid=’c003’//能删除
DELETE FROM stud WHERE id=’p004’;//外键约束,不能删除

关联(连接):左关联(LEFT JOIN) 右关联(RIGHT JOIN) 内关联(INNER JOIN)
mysql不支持: 全关联(FULL JOIN) 外关联(outter JOIN)
//关联,可理解成把几个合成一个新的表,然后在新表中进行查询

//1查询哪些人选了哪些课
– 92标准
SELECT stud.name,stud.age,course.name FROM stud,sc,course WHERE stud.id=sc.sid AND sc.cid=course.id;
– 96标准
SELECT stud.name,stud.age,course.name FROM stud INNER JOIN sc ON stud.id=sc.sid
INNER JOIN course ON course.id=sc.cid ;
//2查询哪些人没有选课
//92标准
SELECT stud.name AS 姓名 FROM stud WHERE stud.id NOT IN (SELECT sc.sid FROM sc);
//96标准
SELECT * FROM stud LEFT JOIN sc ON sc.sid=stud.id LEFT JOIN course ON sc.cid=course.id WHERE sc.cid IS NULL;//左关联
//3查询哪些课程没人选
//96标准–左关联
SELECT course.name FROM course LEFT JOIN sc ON sc.cid=course.id LEFT JOIN stud ON stud.id=sc.sid WHERE stud.name IS NULL;
//96标准–右关联
SELECT course.name FROM stud RIGHT JOIN sc ON stud.id=sc.sid RIGHT JOIN course ON sc.cid=course.id WHERE stud.name IS NULL;

※演示自动增长列与字段值唯一性约束
CREATE TABLE aa(
id INT AUTO_INCREMENT PRIMARY KEY,
nm VARCHAR(32) UNIQUE
);
INSERT INTO aa(nm) VALUES(‘uuu’);
INSERT INTO aa(nm) VALUES(‘2uuu’);

sql增加约束
–主键约束(Primary Key constraint):要求主键列的数据唯一,并且不允许为空。

–唯一约束(Unique Constraint):要求该列唯一,允许为空,但只能出现一个空值。

–检查约束(Check Constraint):某列取值范围限制、格式限制等,如有关年龄的约束。

–默认约束(Default Constraint):某列的默认值,如我们的男性同学较多,性别默认为男。

–外键约束(Foreign Key):用于在两表之间建立关系需要制定引用主表的哪一列。

语法如下

alter table 表名

add constraint 约束名 约束类型具体的约束说明

示例:

–添加主键约束

alter table stuInfo

add constraint PK_stuNo primary key(stuNo)

–添加唯一键约束

alter table stuInfo

add constraint UQ_stuID unique(stuID)

–添加默认约束

alter table stuInfo

add constraint DF_stuAddress default(‘地址不详’) for stuAddress

–添加检查约束

alter table stuInfo

add constraint CK_stuAge check(stuAge between 15 and 40)

–添加外键约束

alter table stuInfo

add constraint FK_stuNo foreign key(stuNo) references stuInfo(stuNo)

删除约束

alter table 表名 drop constraint 约束名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值