mysql基本操作笔记

以下是本人在学习过程中接触过的mysql基本命令,仅做参考

-- 删除表,然后再创建一个一模一样的表。比delete命令效率更高
TRUNCATE TABLE stu; -- 创建联系的数据库
CREATE TABLE student1 (
 id INT, -- 编号
 NAME VARCHAR(20), -- 姓名
 age INT, -- 年龄
 sex VARCHAR(5), -- 性别
 address VARCHAR(100), -- 地址
 math INT, -- 数学
 english INT -- 英语
);
INSERT INTO 
    student1(id,NAME,age,sex,address,math,english) 
VALUES 
    (1,'马云',55,'','杭州',66,78),
    (2,'马化腾',45,'','深圳',98,87),
    (3,'马景涛',55,'','香港',56,77),
    (4,'柳岩',20,'','湖南',76,65),
    (5,'柳青',20,'','湖南',86,NULL),
    (6,'刘德华',57,'','香港',99,99),
    (7,'马德',22,'','香港',99,99),
    (8,'德玛西亚',18,'','南京',56,65);
DROP TABLE student1;
SELECT * FROM student1;

-- 查询姓名和年龄
SELECT 
    `name`, -- 姓名
    age     -- 年龄
FROM 
    student1;-- 学生表

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

-- 去重要求查询的结果集完全一致
SELECT DISTINCT `name`,address FROM student1;

-- 计算math和english的分数之和
-- 有null参与计算,结果都为null
SELECT `name`,math,english,math+english FROM student1;

-- 解决方案IFNULL(表达式1,表达式2) 如果表达式1为null则显示表达式2,反之显示表达式1
SELECT `name`,math,english,math+IFNULL(english,0) FROM student1;

-- 起别名,可省略AS关键字
SELECT `name`,math,english,math+IFNULL(english,0) AS 总分 FROM student1;
SELECT `name` 姓名,math 数学,english 英语,math+IFNULL(english,0) 总分 FROM student1;

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

-- 查询年龄不等于20
SELECT * FROM student1 WHERE age !=20;
SELECT * FROM student1 WHERE age <>20;

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

-- 查询年龄为22,18,25岁的信息
SELECT * FROM student1 WHERE age = 22 || age=18 || age=25;
SELECT * FROM student1 WHERE age = 22 OR age=18 OR age=25;
SELECT * FROM student1 WHERE age IN (22,18,25);

-- 查询没有英语成绩的信息
SELECT * FROM student1 WHERE english = NULL; -- 不正确的语句,不能使用等号判断null
SELECT * FROM student1 WHERE english IS NULL;

-- 查询有英语成绩的信息
SELECT * FROM student1 WHERE english IS NOT NULL;

-- 查询姓马的
SELECT * FROM student1 WHERE `name` LIKE "马%";

-- 查询第二字是化的人
SELECT * FROM student1 WHERE `name` LIKE "_化%";

-- 查询姓名是三个字的人
SELECT * FROM student1 WHERE `name` LIKE "___"; -- 三个_

-- 查询姓名中包含德的人
SELECT * FROM student1 WHERE `name` LIKE "%%";

-- 排序
SELECT * FROM student1 ORDER BY math; -- 默认升序
SELECT * FROM student1 ORDER BY math DESC; -- 降序
SELECT * FROM student1 ORDER BY math ASC; -- 升序

SELECT * FROM student1 ORDER BY math ASC , english ASC;  -- 第二排序条件,只有当第一条件相同是第二条件才生效

-- 所有聚合函数的计算都排除了null值
SELECT COUNT(`name`) 人数 FROM student1;        -- 结果为8
SELECT COUNT(english) 人数 FROM student1;        -- 结果为7
SELECT COUNT(IFNULL(english,0)) 人数 FROM student1;    -- 结果为8

SELECT MAX(math) FROM student1;
SELECT MIN(math) FROM student1;

SELECT SUM(math) FROM student1;
SELECT SUM(english) FROM student1;

SELECT AVG(math) FROM student1;
SELECT AVG(english) FROM student1;

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

-- 按照性别分别查询男、女同学的平均分但不计算分数低于70的
SELECT sex 性别,AVG(math) 平均分,COUNT(id) 人数 FROM student1 WHERE math> 70 GROUP BY sex;

-- 按照性别分别查询男、女同学的平均分但不计算分数低于70的并且不显示人数小于等于2人的
SELECT sex 性别,AVG(math) 平均分,COUNT(id) 人数 FROM student1 WHERE math> 70 GROUP BY sex HAVING COUNT(id) > 2;

-- 分页公式:开始的索引=(当前的页码-1)*每页显示的条数
SELECT * FROM student1 LIMIT 0,3;
SELECT * FROM student1 LIMIT 3,6;
SELECT * FROM student1 LIMIT 6,9; -- 不满一页按一页计
-- limit是mysql的方言,其他数据库不一定通用

-- 约束
-- 非空约束
-- 创建表示添加约束
CREATE TABLE stu(
    id INT,
    `name` VARCHAR(20) NOT NULL -- name非空
);
ALTER TABLE stu MODIFY `name` VARCHAR(20);

-- 创建完成后,添加非空约束
ALTER TABLE stu MODIFY `name` VARCHAR(20) NOT NULL;
SELECT * FROM stu;

DROP TABLE stu;

-- 唯一约束
CREATE TABLE stu(
    id INT ,
    phone_number VARCHAR(20) UNIQUE -- 添加了唯一约束
);
-- 注意:mysql中唯一约束限定的列的值可以有多个null
SELECT * FROM stu;

-- 删除唯一约束
-- alter table stu modify phone_number varchar(20);此命令不能删除唯一约束
ALTER TABLE stu DROP INDEX phone_number;
-- 创建表后添加唯一约束
ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;

DROP TABLE stu;
-- 主键约束
CREATE TABLE stu(
    id INT PRIMARY KEY, -- 给id添加主键约束
    `name` VARCHAR(20)
);

SELECT * FROM stu;

-- 删除主键
-- alter table stu modify id int; 此命令不能清除主键约束
ALTER TABLE stu DROP PRIMARY KEY;

-- 创建完成后,添加非空约束
ALTER TABLE stu MODIFY id INT PRIMARY KEY;

DROP TABLE stu;

-- 主键自增
CREATE TABLE stu(
    id INT PRIMARY KEY AUTO_INCREMENT, -- 给id添加主键约束并令其自增
    `name` VARCHAR(20)
);

SELECT * FROM stu;

INSERT INTO stu VALUES(NULL,'ccc');

-- 删除自动增长
ALTER TABLE stu MODIFY id INT;

-- 添加自动增长
ALTER TABLE stu  MODIFY id INT AUTO_INCREMENT;
-- 注意:自动增长可以不和主键一起使用

-- 外键约束
-- 创建表
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;
-- 数据有冗余
-- 进行表的拆分
-- 解决方案:分成 2 张表
-- 创建部门表(id,dep_name,dep_location)
-- 一方,主表
CREATE TABLE department(
    id INT PRIMARY KEY AUTO_INCREMENT,
    dep_name VARCHAR(20),
    dep_location VARCHAR(20)
);
-- 创建员工表(id,name,age,dep_id)
-- 多方,从表
CREATE TABLE employee(
    id INT PRIMARY KEY AUTO_INCREMENT,
    NAME VARCHAR(20),
    age INT,
    dep_id INT ,-- 外键对应主表的主键
    CONSTRAINT emp_dept_fk FOREIGN KEY(dep_id) REFERENCES department(id)
);
-- 添加 2 个部门
INSERT INTO department VALUES(NULL, '研发部','广州'),(NULL, '销售部', '深圳');
SELECT * FROM department;
-- 添加员工,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;

DROP TABLE emp;
DROP TABLE department;
DROP TABLE employee;

-- 删除外键
ALTER TABLE employee DROP FOREIGN KEY emp_dept_fk;

-- 在表创建之后添加外键
ALTER TABLE employee ADD CONSTRAINT emp_dept_fk FOREIGN KEY(dep_id) REFERENCES department(id);

-- 级联操作
-- 级联更新
ALTER TABLE employee ADD CONSTRAINT emp_dept_fk FOREIGN KEY(dep_id) REFERENCES department(id) ON UPDATE CASCADE;
-- 级联删除
ALTER TABLE employee ADD CONSTRAINT emp_dept_fk FOREIGN KEY(dep_id) REFERENCES department(id) ON DELETE CASCADE;

 

posted @ 2022-01-14 17:20  咸鱼划水  阅读(26)  评论(0编辑  收藏  举报