{MySQL} 数据库束缚& 表的关系& 新增&&删除& 修改& 查询
提示:文章写完后,目录可以自动天生,怎样天生可参考右边的资助文档前言
提示:这里可以添加本文要纪录的大概内容:
承接上文,继承讲一下MySQL
提示:以下是本篇文章正文内容,下面案例可供参考
一、数据库束缚
1.1束缚范例:
NOT NULL - 指示某列不能存储 NULL 值。
UNIQUE - 包管某列的每行必须有唯一的值。
DEFAULT - 规定没有给列赋值时的默认值。
PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标
识,有助于更容易更快速地找到表中的一个特定的纪录。
FOREIGN KEY - 包管一个表中的数据匹配另一个表中的值的参照完备性。
CHECK - 包管列中的值符合指定的条件。对于MySQL数据库,对CHECK子句举行分析,但是忽略CHECK子句。
1.2 NULL束缚
DROP TABLE IF EXISTS student;
CREATE TABLE student (
id INT NOT NULL,
sn INT,
name VARCHAR(20),
qq_mail VARCHAR(20)
);
1.3unique 唯一束缚
-- 重新设置学生表结构
DROP TABLE IF EXISTS student;
CREATE TABLE student (
id INT NOT NULL,
sn INT UNIQUE,
name VARCHAR(20),
qq_mail VARCHAR(20)
);
1.4 DEFAULT:默认值束缚
DROP TABLE IF EXISTS student;
CREATE TABLE student (
id INT NOT NULL,
sn INT UNIQUE,
name VARCHAR(20) DEFAULT 'unkown',
qq_mail VARCHAR(20)
);
1.5 PRIMARY KEY:主键束缚
DROP TABLE IF EXISTS student;
CREATE TABLE student (
id INT NOT NULL PRIMARY KEY,
sn INT UNIQUE,
name VARCHAR(20) DEFAULT 'unkown',
qq_mail VARCHAR(20)
);
可以用auto_increment
-- 主键是 NOT NULL 和 UNIQUE 的结合,可以不用 NOT NULL
id INT PRIMARY KEY auto_increment,
1.6 FOREIGN KEY:外键束缚
外键用于关联其他表的主键或唯一键
CREATE TABLE classes (
id INT PRIMARY KEY auto_increment,
name VARCHAR(20),
`desc` VARCHAR(100)
);
DROP TABLE IF EXISTS student;
CREATE TABLE student (
id INT PRIMARY KEY auto_increment,
sn INT UNIQUE,
name VARCHAR(20) DEFAULT 'unkown',
qq_mail VARCHAR(20),
classes_id int,
FOREIGN KEY (classes_id) REFERENCES classes(id)
);
1.7 CHECK束缚
drop table if exists test_user;
create table test_user (
id int,
name varchar(20),
sex varchar(1),
check (sex ='男' or sex='女')
);
二、新增
DROP TABLE IF EXISTS student;
CREATE TABLE student (
id INT PRIMARY KEY auto_increment,
sn INT UNIQUE,
name VARCHAR(20) DEFAULT 'unkown',
qq_mail VARCHAR(20),
classes_id int,
FOREIGN KEY (classes_id) REFERENCES classes(id)
)
DROP TABLE IF EXISTS test_user;
CREATE TABLE test_user (
id INT primary key auto_increment,
name VARCHAR(20) comment '姓名',
age INT comment '年龄',
email VARCHAR(20) comment '邮箱',
sex varchar(1) comment '性别',
mobile varchar(20) comment '手机号'
);
-- 将学生表中的所有数据复制到用户表
insert into test_user(name, email) select name, qq_mail from student;
三.查询
3.1查询
https://i-blog.csdnimg.cn/blog_migrate/8838097075e5dd778d5455877d41e040.png
写俩个
//数学成绩总分
SELECT SUM(math) FROM exam_result;
-- 不及格 < 60 的总分,没有结果,返回 NULL
SELECT SUM(math) FROM exam_result WHERE math < 60;
SELECT AVG(chinese + math + english) 平均总分 FROM exam_result;
3.2.GROUP BY子句
代码如下(示例):
create table emp(
id int primary key auto_increment,
name varchar(20) not null,
role varchar(20) not null,
salary numeric(11,2)
);
insert into emp(name, role, salary) values
('马云','服务员', 1000.20),
('马化腾','游戏陪玩', 2000.99),
('孙悟空','游戏角色', 999.11),
('猪无能','游戏角色', 333.5),
('沙和尚','游戏角色', 700.33),
('隔壁老王','董事长', 12000.66);
查询每个角色的最高最低工资
select role,max(salary),min(salary),avg(salary) from emp group by role;
select role,max(salary),min(salary),avg(salary) from emp group by role
having avg(salary)<1500;
https://i-blog.csdnimg.cn/blog_migrate/0edd16e66059b809e75b2a2fd7cffc65.png
表明一下:依据角色选出最高最低工资,而且工资都是小于1500.
3.3HAVING
上面谁人例子就阐明了having的用法。
但是留意:GROUP BY 子句举行分组以后,需要对分组结果再举行条件过滤时,不能使用 WHERE 语句,而需要用HAVING。
四、 团结查询
4.1 内连接
语法:
select 字段 from 表1 别名1 join 表2 别名2 on 连接条件 and 其他条件;
select 字段 from 表1 别名1,表2 别名2 where 连接条件 and 其他条件;
SELECT
stu.sn,
stu.NAME,
stu.qq_mail,
sum( sco.score )
FROM
student stu
JOIN score sco ON stu.id = sco.student_id
GROUP BY
sco.student_id;
https://i-blog.csdnimg.cn/blog_migrate/7c61a169bc002ad9c8fbc5cd5032a233.png
https://i-blog.csdnimg.cn/blog_migrate/d2cf09b8eefbea6a09575af9f7b220c7.png
细细对比一下其实后面这个group by后面是什么不告急,主要是由于前面用了聚合函数sum,以是必须要加上group by;或者表明说把grou by 相同的分类再同一个组中,以是差距不大
4.2外连接
//左外连接
select * from student stu left join score sco on stu.id=sco.student_id;
-- 对应的右外连接为:
select * from score sco right join student stu on stu.id=sco.student_id;
4.3区别:
内连接(Inner Join):
内连接只返回两个表中连接条件匹配的行。
如果连接条件中的数据在两个表中没有匹配项,那么这些行将被忽略,不包含在结果中。
右外连接(Right Outer Join):
右外连接返回连接条件匹配的行以及右表中不匹配的行。
如果连接条件中的数据在左表中没有匹配项,左表的列将包含 NULL 值。
左外连接(Left Outer Join):
左外连接返回连接条件匹配的行以及左表中不匹配的行。
如果连接条件中的数据在右表中没有匹配项,右表的列将包含 NULL 值。
4.4归并查询
以使用集合操纵符 union,union all。使用UNION
和UNION ALL时,前后查询的结果会合,字段需要一致
select * from course where id<3
union
select * from course where name='英文';
-- 或者使用or来实现
select * from course where id<3 or name='英文'
俩个意思一样
union all
该操纵符用于取得两个结果集的并集。当使用该操纵符时,不会去掉结果会合的重复行。
案例:查询id小于3,或者名字为“Java”的课程
-- 可以看到结果集中出现重复数据Java
select * from course where id<3
union all
select * from course where name='英文';
总结
好了,这个是mysql的一些知识,渴望各人支持呀~~
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]