A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胡金超 初级黑马   /  2019-8-14 15:03  /  860 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文



/*****************************第二天*******************************/

/**** 排序 order by 排序的字段 排序的方式(asc(升序),desc(降序)) */
SELECT * FROM stu_score ORDER BY stu_score.`chinese` DESC ,stu_score.`math` ,stu_score.`english`;

/*
聚合函数 count(计算某列的个数),max,min,avg,sum
注意:聚合函数都是排除null的值,进行运算的!!!!,聚合函数后面也可以加条件的

*/
-- 查询表中的数据的个数
SELECT COUNT(*) FROM stu_score;
-- 查数学的平均值
SELECT AVG(math) FROM stu_score;
SELECT AVG(math) FROM stu_score WHERE math > 80;
-- 我想知道考试数学成绩100的人有多少个
SELECT COUNT(*) FROM stu_score WHERE math = 100;

SELECT * FROM stu_score;
-- GROUP BY分组的注意 1. 分组要查找的字段必须, 分组字段以及聚合函数(不要查找私有数据) 2. where和having
-- where是分组之前过滤, having是分组之后过滤, where不能跟聚合函数, having可以跟聚合函数

SELECT
        class,SUM(math)
FROM
        stu_score
GROUP BY
        class;
-- 数学成绩<60的过滤掉然后进行分组
SELECT
        class,SUM(math)
FROM
        stu_score
WHERE
        math > 60
GROUP BY
        class;
-- 数学成绩<60的过滤掉然后进行分组,分组后过滤出总分>200的 --->having
SELECT
        class,SUM(math) total -- 查询"班级",和"总分"这两列, 其中"班级"是分组字段, "总分"是聚合函数
FROM
        stu_score
WHERE
        math > 60 -- 分组前过滤出60分以上的, 分组前过滤有where
GROUP BY
        class        -- 按照班级分组
HAVING
        total > 200; -- 分组后过滤出 总分大于200的,分组后过滤用having
-- 按照班级分组查总人数
-- select count(*) from stu_score;
SELECT
        class,COUNT(*)
FROM
        stu_score
GROUP BY
        class;
-- 查询第三页,每页3条
-- select * from stu_score limit 3,3;

SELECT * FROM stu_score ORDER BY math DESC;
-- 其实每页一个,要第三页 开始索引 = (3 - 1) * 1
SELECT * FROM stu_score ORDER BY math DESC LIMIT 0,1;
/*
select
        要查询的列
from
        要查询的表
where
        分组前的过滤条件
group by
        按照什么来分组
having
        分组后的过滤条件
order by
        排序规则
limit
        分页限定

*/

/*************************约束*********************************/
/*
        非空约束 ---> not null
        1.创建表时添加
                create table 表名(
                        字段的名称 字段类型 not null
                );
        2.创建表后添加
                alter table 表名 modify 字段名称 字段类型 not null; -- 要求这一列里面不能有null的数据
        3.移除非空约束
                alter table 表名 modify 字段名称 字段类型;
*/
-- 修改表将sname和class添加非空约束
ALTER TABLE stu_score MODIFY sname VARCHAR(10) NOT NULL;
ALTER TABLE stu_score MODIFY class VARCHAR(10) NOT NULL;
-- 修改表将class的非空约束去掉
ALTER TABLE stu_score MODIFY sname VARCHAR(10);




/*
        唯一约束UNIQUE ----> 注意:唯一对null是没有效果的
        1.创建表时添加
                create table 表名(
                        字段的名称 字段类型 UNIQUE
                );
        2.创建表后添加
                alter table 表名 modify 字段名称 字段类型 UNIQUE; -- 要求这一列里面不能有重复的数据
        3.移除唯一约束
                alter table 表名 drop index 字段名
               
*/

-- 修改id类,添加唯一约束
ALTER TABLE stu_score MODIFY id INT UNIQUE;
-- 移除id的唯一约束
ALTER TABLE stu_score DROP INDEX id;

/*
        主键:PRIMARY KEY 非空且唯一,注意: 一张只能有一个主键
        1.创建表时添加
                create table 表名(
                        id int primary key,
                        name varchar(20)
                );
        2.创建表后添加
                alter table 表名 modify 列名 类型 primary key;
        3.移除主键约束
                alter table 表名 drop primary key;
        注意:因为主键非空且唯一, 在插入数据时候,不能重复, 在书写起来很不方便,我们必须在检查主键
        需要一个东西管理我们的主键
        1.主键是整数类型---->一般和auto_increment结合,让自动增长管理主键
        2.字符串类型---> 会通过随机生成一个永远不会重复的字符串来作为主键

*/

SELECT * FROM stu_score;
-- 添加主键
ALTER TABLE stu_score MODIFY id INT PRIMARY KEY;
-- 移除主键
ALTER TABLE stu_score DROP PRIMARY KEY;
-- 给主键列添加自动增长
ALTER TABLE stu_score MODIFY id INT AUTO_INCREMENT;

-- 将主键的自动增长去掉
ALTER TABLE stu_score MODIFY id INT;

/*
        外键约束:FOREIGN KEY 作用---->用来约束"表"和"表"之间的数据,能够保证数据的完整性,安全性
        1.创建表时添加
                create table 表名(
                        id int primary key auto_increment,
                        name varchar(20),
                        tid int, -- 希望tid作为外键关联另外一张表
                        [contraint 外键的名字] foreign key(tid) references 另外一张表(字段名字)
                       
                );
        2.创建表后添加
                alter table 表名 add [contraint 外键的名字] foreign key(tid) references 另外一张表(字段名字);
        3.移除外键约束
                alter table 表名 drop  foreign key 外键名;
               
        4. 级联操作
                级联更新 on update cascade
                级联删除 on delete cascade
                例如:
                alter table 表名 add [contraint 外键的名字] foreign key(tid) references 另外一张表(字段名字) on update cascade
       
*/
CREATE TABLE classroom(
        cid INT PRIMARY KEY AUTO_INCREMENT,
        cname VARCHAR(20)
);

CREATE TABLE student(
        sid INT PRIMARY KEY AUTO_INCREMENT,
        sname VARCHAR(20),
        cid INT, -- 希望cid作为外键关联classroom的cid,用到外键约束
        CONSTRAINT stu_class_fk FOREIGN KEY(cid) REFERENCES classroom(cid)
);
-- 插入数据,先插主表,后插从表
INSERT INTO classroom VALUES(NULL,'801');
INSERT INTO classroom VALUES(NULL,'802');

INSERT INTO student VALUES(NULL,'杜傲德',1);
INSERT INTO student VALUES(NULL,'贾倩稳',1);
INSERT INTO student VALUES(NULL,'刘子豪',2);
INSERT INTO student VALUES(NULL,'赵放',2);

SELECT * FROM classroom;
SELECT * FROM student;
-- 删除外键约束, 需要外键的名字才可以删除
ALTER TABLE student DROP FOREIGN KEY student_ibfk_1;
-- 添加外键约束时给名字
ALTER TABLE student ADD CONSTRAINT stu_class_fk  FOREIGN KEY(cid) REFERENCES classroom(cid);
-- 添加外键约束时不给名字
ALTER TABLE student ADD  FOREIGN KEY(cid) REFERENCES classroom(cid);
-- 查找表的创建语句,其实为了找到外键名!!!!!如果在创建外键的时候没有给外键起名字,系统会自动生成一个,需要这个语句查询
SHOW CREATE TABLE student;


/*
        一对多的关系: 建表原则,在多的一方建立外键,关联一的一方的主键
        例如: 客户和订单
*/
CREATE TABLE USER( -- 一的一方

        uid INT PRIMARY KEY AUTO_INCREMENT,
        uname VARCHAR(20),
        nickname VARCHAR(20)
);

CREATE TABLE orders( -- 多的一方,建立外键和一的一方进行关联
        oid INT PRIMARY KEY AUTO_INCREMENT,
        odate TIMESTAMP,
        price DOUBLE,
        uid INT,
        CONSTRAINT orders_user_fk FOREIGN KEY(uid) REFERENCES USER(uid)
);


/* 多对多 : 建表原则 ---> 需要借助第三张中间表, 这个中间表至少有两个字段, 分别作为外键指向主表的主键*/

CREATE TABLE restrant( -- 多的一方

        rid INT PRIMARY KEY AUTO_INCREMENT,
        rname VARCHAR(20),
        address VARCHAR(20)
);

CREATE TABLE dish( -- 多的一方
        did INT PRIMARY KEY AUTO_INCREMENT,
        dname VARCHAR(20),
        price DOUBLE
);
-- 需要借助第三张中间表,描述restrant和dish的关系, 至少包含二个字段, 分别作为外键指向主表的主键

CREATE TABLE rest_dish_mid(
        rid INT,
        did INT,
        PRIMARY KEY(rid,did), -- 联合主键只出现在中间表中!!!!!!
        CONSTRAINT mid_rest_fk FOREIGN KEY (rid) REFERENCES restrant(rid),
        CONSTRAINT mid_dish_fk FOREIGN KEY (did) REFERENCES dish(did)
       
);

INSERT INTO restrant VALUES(NULL,'沙县小吃','广安大街302号');
INSERT INTO restrant VALUES(NULL,'铁锅焖面','广安大街303号');
INSERT INTO restrant VALUES(NULL,'幸福大锅菜','广安大街304号');

INSERT INTO dish VALUES(NULL,'酸辣土豆丝',8);
INSERT INTO dish VALUES(NULL,'红烧排骨饭',12);
INSERT INTO dish VALUES(NULL,'红烧鲤鱼',20);
INSERT INTO dish VALUES(NULL,'焖面',20);
INSERT INTO dish VALUES(NULL,'大锅菜',10);
INSERT INTO dish VALUES(NULL,'飘香拌面',5);

INSERT INTO rest_dish_mid VALUES(1,6);
INSERT INTO rest_dish_mid VALUES(1,1);
INSERT INTO rest_dish_mid VALUES(1,1);

INSERT INTO rest_dish_mid VALUES(2,4);
INSERT INTO rest_dish_mid VALUES(2,1);
INSERT INTO rest_dish_mid VALUES(2,2);

INSERT INTO rest_dish_mid VALUES(3,5);
INSERT INTO rest_dish_mid VALUES(3,1);
INSERT INTO rest_dish_mid VALUES(3,2);
INSERT INTO rest_dish_mid VALUES(3,3);
/*
        一对一: 在任何一方建议唯一外键方式来去关联(很少见!!!!!)
*/
/*数据库的备份

        命令:
                保存: mysqldump -uroot -p密码 数据库的名字 > 路径
                还原: source 路径
        图形化界面:
                保存:右键-->导出-->备份数据库
                还原:右键-->导入-->执行sql脚本
*/


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马