MySQL学习(一)SQLYOG之db1

INSERT INTO stu(id,NAME,age) VALUES(1,'知识',18);

SELECT * FROM stu; -- 显示表内数据

INSERT INTO stu VALUES(2,'地点',22,98.3,NULL,NULL);

INSERT INTO stu VALUES(3,'语句',20,99.5,"98-7-9",NULL);

DELETE FROM stu WHERE id=1;

UPDATE stu SET age=18 WHERE id=3;

UPDATE stu SET age=20,score=99 WHERE id=2;


CREATE TABLE student(
id INT,
NAME VARCHAR(20),
age INT,
sex VARBINARY(5),
address VARBINARY(100),
math INT,
english INT
);
INSERT INTO student(id,NAME,age,sex,address,math,english) VALUES 
(1,'马云',55,'男','杭州',66,78),
(2,'马化腾',45,'女','深圳',98,87),
(3,'马景涛',55,'男','香港',66,77),
(4,'柳岩',20,'女','湖南',99,99),
(5,'刘德华',35,'男','香港',95,95),
(6,'柳青',25,'男','湖南',65,NULL),
(7,'马丹丹',34,'女','香港',60,72),
(8,'德玛西亚',55,'男','南京',59,67);
SELECT * FROM student;
TRUNCATE TABLE student;

-- 查询姓名和年龄
SELECT 
	NAME,-- 姓名
	age -- 年龄
FROM 	
	student;

SELECT address FROM student;
-- 去除重复的结果集
SELECT DISTINCT address FROM student;

SELECT DISTINCT NAME,address FROM student;

-- 计算math和English 分数之和
SELECT NAME,math,english,math+english FROM student;
-- 如果有null参与的计算,计算结果都为null
SELECT NAME,math,english,math+IFNULL(english,0) FROM student;

-- 起别名
SELECT NAME,math,english,math+IFNULL(english,0) AS 总分 FROM student;
SELECT NAME,math 数学,english 英语,math+IFNULL(english,0)  总分 FROM student;

-- 查询年龄大于20岁
SELECT * FROM student WHERE age > 20;
SELECT * FROM student WHERE age >= 20;

-- 查询年龄等于20岁
SELECT * FROM student WHERE age = 20;

-- 查询年龄bu 等于20岁
SELECT * FROM student WHERE age != 20;
SELECT * FROM student WHERE age <> 20;

-- 查询年龄大于等于20岁,小于等于30岁
SELECT * FROM student WHERE age>=20 AND age<=30;
SELECT * FROM student WHERE age BETWEEN 20 AND 30;

-- 查询年龄22岁,19岁,25岁的信息
SELECT * FROM student WHERE age=22 OR age=19 OR age=25;
SELECT * FROM student WHERE age IN(22,19,25);

-- 查询英语成绩为null
SELECT * FROM student WHERE english = NULL;-- 不对。null值不能使用
SELECT * FROM student WHERE english IS NULL;

-- 查询英语成绩为null
SELECT * FROM student WHERE english IS NOT NULL;

-- 查询姓马的有哪些?
SELECT * FROM student WHERE NAME LIKE '马%';
-- 查询第二个字是化的人
SELECT * FROM student WHERE NAME LIKE '_化%';
-- 查询姓名是三个字的人
SELECT * FROM student WHERE NAME LIKE '___';
-- 查询姓名中包含德的人
SELECT * FROM student WHERE NAME LIKE '%德%';

/*
排序查询
ASC:升序。默认
DESC:降序
如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件
*/
SELECT * FROM student ORDER BY math;
SELECT * FROM student ORDER BY math ASC;
SELECT * FROM student ORDER BY math DESC;

-- 按照数学成绩排名,如果数学成绩一样,则按照英语成绩排名
SELECT * FROM student ORDER BY math ASC , english ASC;

/*
聚合函数:将一列数据作为一个整体,进行纵向的计算。
	count:计算个数
		一般选择非空的列,主键
		count(*)
	max:计算最大值
	min:计算最小值
	sum:计算和
	avg:计算平均值
注意:聚合函数的计算,会排除null
解决方案:
	1.选择不包含非空的列进行计算
	2.ifnull函数
*/
SELECT COUNT(NAME) FROM student;
SELECT COUNT(english) FROM student;
SELECT COUNT(IFNULL(english,0)) FROM student;
SELECT COUNT(*) FROM student;

SELECT MAX(math) FROM student;
SELECT MIN(math) FROM student;
SELECT SUM(math) FROM student;
SELECT AVG(math) FROM student;

/*
分组查询
注意:
	1.分组之后查询的字段:分组字段,聚合函数
	2.where 和 having 区别?
		1.where在分组之前进行限定,如果不满足条件,则不参与分组。
		having在分组之后进行限定,如果不满足结果,则不会被查询出来
		2.where后不可以跟聚合函数的判断,having可以跟聚合函数的判断
*/
-- 按照性别分组,分别查询男、女同学的平均分
SELECT sex,AVG(math) FROM student GROUP BY sex;

-- 按照性别分组,分别查询男、女同学的平均分,人数
SELECT sex,AVG(math),COUNT(id) FROM student GROUP BY sex;

-- 按照性别分组,分别查询男、女同学的平均分,人数,要求分数低于70分不参与分组
SELECT sex,AVG(math),COUNT(id) FROM student WHERE math>70 GROUP BY sex;

-- 按照性别分组,分别查询男、女同学的平均分,人数,要求分数低于70分不参与分组,分组之后人数大于2人
SELECT sex,AVG(math),COUNT(id) FROM student WHERE math>70 GROUP BY sex HAVING COUNT(id)>1;
SELECT sex,AVG(math),COUNT(id) 人数 FROM student WHERE math>70 GROUP BY sex HAVING 人数>1;

/*
分页查询
公式:开始的索引 = (当前页码 - 1) * 每页显示的条数
*/
-- 每页显示3条记录
SELECT * FROM student LIMIT 0,3;-- 第1页
SELECT * FROM student LIMIT 3,3;-- 第2页
SELECT * FROM student LIMIT 6,3;-- 第3页

-- 非空约束
CREATE TABLE stu1(
	id INT,
	NAME VARCHAR(20) NOT NULL -- name为非空
);
SELECT * FROM stu1;
-- 删除name的非空约束
ALTER TABLE stu1 MODIFY NAME VARCHAR(20);
-- 创建表完之后,添加name的非空约束
ALTER TABLE stu1 MODIFY NAME VARCHAR(20) NOT NULL;

-- 唯一约束
CREATE TABLE stu2(
	id INT,
	phone_number VARCHAR(20) UNIQUE  -- 手机号
);
SELECT * FROM stu2;
-- 删除唯一约束
ALTER TABLE stu2 DROP INDEX phone_number;
-- 添加唯一约束
ALTER TABLE stu2 MODIFY phone_number VARCHAR(20) UNIQUE;

-- 主键约束,唯一,不为空
CREATE TABLE stu3(
	id INT PRIMARY KEY,
	NAME VARCHAR(20) 
);
SELECT * FROM stu3;
-- 删除主键
ALTER TABLE stu3 DROP PRIMARY KEY;
-- 添加主键
ALTER TABLE stu3 MODIFY id INT PRIMARY KEY;

-- 自动增长:如果某一列是数值类型的,使用auto_increment 可以来完成自动增长
CREATE TABLE stu4(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20) 
);
SELECT * FROM stu4;
INSERT INTO stu4 VALUES(NULL,'ccc');
INSERT INTO stu4 VALUES(10,'hh');
INSERT INTO stu4 VALUES(NULL,'tt');
-- 删除自动增长
ALTER TABLE stu4 MODIFY id INT;
-- 增加自动增长
ALTER TABLE stu4 MODIFY id INT AUTO_INCREMENT;

DROP TABLE stu1,stu2,stu3,stu4;

/*
外键约束
CREATE TABLE 表名(
	...
	外键列
	constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)
);
*/
CREATE TABLE emp(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(30),
	age INT,
	dep_name VARCHAR(30),-- 部门名称
	dep_location VARCHAR(30) -- 部门地址
);
INSERT INTO emp(NAME,age,dep_name,dep_location) VALUES ('张三',20,'研发部','广州');
INSERT INTO emp(NAME,age,dep_name,dep_location) VALUES ('李四',21,'研发部','广州');
INSERT INTO emp(NAME,age,dep_name,dep_location) VALUES ('王五',20,'研发部','广州');
INSERT INTO emp(NAME,age,dep_name,dep_location) VALUES ('老王',20,'销售部','深圳');
INSERT INTO emp(NAME,age,dep_name,dep_location) VALUES ('大王',22,'销售部','深圳');
INSERT INTO emp(NAME,age,dep_name,dep_location) VALUES ('小王',18,'销售部','深圳');
SELECT * FROM emp;
DROP TABLE emp;
-- 数据有冗余
-- 表的拆分

-- 创建部门表(id,dep_name,dep_location)
-- 一方,主表
CREATE TABLE department(
id INT PRIMARY KEY AUTO_INCREMENT,
dep_name VARCHAR(30),-- 部门名称
dep_location VARCHAR(30) -- 部门地址
);
-- 创建员工表
-- 多方,从表
CREATE TABLE employee(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(30),
age INT,
dep_id INT, -- 外键对应主表的主键
CONSTRAINT emp_dept_id FOREIGN KEY (dep_id) REFERENCES department(id)
);
-- 添加2个部门
INSERT INTO department VALUES(NULL,'研发部','广州'),(NULL,'销售部','深圳');
-- 添加员工,dep_id表示员工所在部门
INSERT INTO employee (NAME,age,dep_id) VALUES ('张三',20,1);
INSERT INTO employee (NAME,age,dep_id) VALUES ('李四',21,1);
INSERT INTO employee (NAME,age,dep_id) VALUES ('王五',20,1);
INSERT INTO employee (NAME,age,dep_id) VALUES ('老王',20,2);
INSERT INTO employee (NAME,age,dep_id) VALUES ('大王',22,2);
INSERT INTO employee (NAME,age,dep_id) VALUES ('小王',18,2);
SELECT * FROM employee;
SELECT * FROM department;

DROP TABLE department,employee;
-- 删除外键
ALTER TABLE employee DROP FOREIGN KEY emp_dept_id;
-- 级联操作
-- 添加外键,设置级联更新,设置级联删除
ALTER TABLE employee ADD CONSTRAINT emp_dept_id FOREIGN KEY (dep_id) REFERENCES department(id) ON UPDATE CASCADE ON DELETE CASCADE;

UPDATE employee SET dep_id  = NULL WHERE dep_id = 1;
UPDATE employee SET dep_id  = 5 WHERE dep_id IS NULL;



你可能感兴趣的:(MySQL学习(一)SQLYOG之db1)