当前位置: 首页 > news >正文

Mysql 通过案例快速学习常见操作

更多个人笔记见:
github个人笔记仓库
gitee 个人笔记仓库
个人学习,学习过程中还会不断补充~ (后续会更新在github上)

文章目录

    • Mysql
        • 数据库操作
        • Insert 添加
        • 修改 Update
            • alter
            • update
        • 删除 delete
        • 查询 Read
            • select使用
        • 关联查询
            • 多对多
            • 一对一
        • 约束
            • 主键
            • unique约束等
            • 外键约束

Mysql

  • 本地终端连接:mysql -u 用户名 -p 密码 -h host -P 端口 (自己的root密码是1234
    • mysql,sys 以及 xx_scheme 的是系统自带的库
      –用于注释 ,同时结尾带分号
数据库操作
  • 查看数据库 show databases;
  • 创建数据库 create database xxx;
  • 使用数据库 USE xxx;
  • 查询当前正在使用的数据库 `SELECT DATABASE();
  • 删除数据库 `drop database xxx;``
  • 查看表的创建方式 show create database db_name;
    创建表demo:
 CREATE TABLE employee(id int primary key auto_increment ,name varchar(20),gender bit default 1,birthday date,department varchar(20),salary double(8,2) unsigned,resume text)character set=utf8;  

包括设置default 数据类型还有decimal Enun 等

  • 查看数据库中所有表 show tables;
  • 查看xxx表的创建信息 show create table xxx ;
  • 查看某张表结构(具体详细的) desc xxx ;
  • 删除存在外键的表: 先 drop table 删除引用的 表再删除当前表
  • 表的恢复 :比较麻烦,通过日志等
Insert 添加

添加表记录

INSERT employee (name,gender,birthday,salary,department) VALUES  ("yuan",1,"1985-12-12",8000,"教学部"), ("alvin",1,"1987-08-08",5000,"保安部")

另外添加方法:

INSERT INTO employee  SET name = '张三',  age = 25,  gender = '男';
修改 Update
alter
  • alter 主要用于修改结构
    操作:
  • 增加列 :alter table xxx add gender varchar(32) not null after age; (可以增加多个字段)
  • 修改字段类型 ALTER TABLE employee MODIFY age VARCHAR(10) NOT NULL;
  • 修改表名字以及字段类型 ALTER TABLE employee CHANGE age employee_age INT NOT NULL;
  • 删除字段 ALTER TABLE employee DROP employee_age;
  • 修改表名 ALTER TABLE employee RENAME TO staff;

一般输入都是ORM或图形化界面了,或者.sql文件然后执行

update
  • Update 用于修改数据
UPDATE employee SET salary = salary + 1000 , dep = 'Management';where xx = xx)
update emp set salary=20000  where age > 30;
删除 delete
  • Delete 用于删除数据
  • 删除 employee 表中工资最低的 1 名员工:DELETE FROM employee ORDER BY salary ASC LIMIT 1; (where , ooerder by , limit 使用混合)
  • 一般注意先查询看数据然后再删除 SELECT * FROM author WHERE name = 'bob';
  • 字符串需要用引号包裹:delete from author where name = ‘bob’;
  • 清空数据:DELETE FROM employee;
查询 Read

用于测试数据:

CREATE TABLE emp(id       INT PRIMARY KEY AUTO_INCREMENT,name     VARCHAR(20),gender   ENUM("male","female","other"),age      TINYINT,dep      VARCHAR(20),city     VARCHAR(20),salary    DOUBLE(7,2)
)character set=utf8;INSERT INTO emp (name,gender,age,dep,city,salary) VALUES("yuan","male",24,"教学部","河北省",8000),("eric","male",34,"销售部","山东省",8000),("rain","male",28,"销售部","山东省",10000),("alvin","female",22,"教学部","北京",9000),("George", "male",24,"教学部","河北省",6000),("danae", "male",32,"运营部","北京",12000),("Sera", "male",38,"运营部","河北省",7000),("Echo", "male",19,"运营部","河北省",9000),("Abel", "female",24,"销售部","北京",9000);
select使用
  • select 用法
SELECT *|field1, field2 ...
FROM tab_name
WHERE 条件
GROUP BY field
HAVING 筛选
ORDER BY field
LIMIT 限制条数;
  • 查询所有 SELECT * FROM employee;

  • 查询特定字段 SELECT name, salary FROM employee;

  • 查询 > < 的部分:SELECT * FROM employee WHERE salary > 9000;
    SELECT * FROM emp WHERE dep="教学部" AND gender="male";

  • 查询平均工资大于 9000 的部门: having是通过分组后的进行筛选:

    SELECT dep, AVG(salary) AS avg_salary
    FROM emp
    GROUP BY dep
    HAVING avg_salary > 9000;
    
  • 降序查询:SELECT * FROM employee ORDER BY salary DESC; 降序排列(从高到低)
    SELECT * FROM emp ORDER BY salary;

  • 限制查询: SELECT * FROM employee LIMIT 3;

  • 查看表信息:SELECT * FROM employee LIMIT 100;

  • limit 2,2 从索引为2的开始取2条 所以取出3,4 这方面可以操作

where可用查询限制:

  • between 80 and 100 / in (70,80,90) / …

group by 分组语句

  • 常用统计函数 max() avg() sum() min() count()
  • 按照部门划分然后查看平均工资:select dep,avg(salary) from emp group by dep;
  • 搜索分组后将name 聚合展示SELECT dep, GROUP_CONCAT(name) FROM emp GROUP BY dep;

补充:

  • 查总人数SELECT COUNT(*) 员工总人数 FROM emp;
  • distinct 去重: SELECT distinct salary from emp order by salary;
关联查询
多对多

用于测试数据: (含有一对多)

--作者表
CREATE TABLE book(id     INT PRIMARY KEY AUTO_INCREMENT,title  VARCHAR(32),price  DOUBLE(5, 2),pub_id INT NOT NULL--这里没有设置外键不过其实就是“外键”) ENGINE = INNODBCHARSET = utf8;--发布
CREATE TABLE publisher
(id    INT PRIMARY KEY AUTO_INCREMENT,name  VARCHAR(32),email VARCHAR(32),addr  VARCHAR(32)
) ENGINE = INNODB CHARSET = utf8;INSERT INTO book(title, price, pub_id)
VALUES ('西游记', 15, 1),('三国演义', 45, 2),('红楼梦', 66, 3),('水浒传', 21, 2),('红与黑', 67, 3),('乱世佳人', 44, 6),('飘', 56, 1),('放风筝的人', 78, 3);INSERT INTO publisher(id, name, email, addr)
VALUES (1, '清华出版社', "123", "bj"),(2, '北大出版社', "234", "bj"),(3, '机械工业出版社', "345", "nj"),(4, '邮电出版社', "456", "nj"),(5, '电子工业出版社', "567", "bj"),(6, '人民大学出版社', "678", "bj");CREATE TABLE author
(id   INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(32) NOT NULL
) ENGINE = INNODBCHARSET = utf8;-- 关系表 用于建立多对多  建立书本到作者的多对多
CREATE TABLE book2author
(id        INT NOT NULL UNIQUE AUTO_INCREMENT,author_id INT NOT NULL,book_id   INT NOT NULL
) ENGINE = INNODBCHARSET = utf8;INSERT INTO author(NAME)
VALUES ('yuan'),('rain'),('alvin'),('eric');-- 插入关系数据  用于建立多对多
INSERT INTO book2author(author_id, book_id)
VALUES (1, 1),(1, 2),(2, 1),(3, 3),(3, 4),(1, 3);-- 作者详细数据
CREATE TABLE authorDetail
(id        INT PRIMARY KEY AUTO_INCREMENT, --id 自动增长tel       VARCHAR(32),addr      VARCHAR(32),author_id INT NOT NULL unique -- 也可以给author添加一个关联字段: alter table author add authorDetail_id INT NOT NULL) ENGINE = INNODB CHARSET = utf8;INSERT INTO authorDetail(tel, addr, author_id)
VALUES ("110", "北京", 1),("911", "成都", 2),("119", "上海", 3),("111", "广州", 4);-- 一对多的关联查询  一个发行商可以对应多本书,在多的一侧:书的表的简历外键select *from book,publisherwhere book.pub_id = publisher.id;-- 关联然后设置条件查询select *from book   inner join publisher on book.pub_id = publisher.idwhere publisher.name = "清华出版社";  -- 多对多的关联查询   利用中间表简历关联select *from bookinner join book2author on book.id = book2author.book_idinner join author on book2author.author_id = author.id-- 选出yuan出版的书籍的名字(book.title)select book.titlefrom bookinner join book2author on book.id = book2author.book_idinner join author on book2author.author_id = author.idwhere author.NAME = "yuan";-- 每一本书的作者的个数   优先book.title分组后  查看统计结果(每本书的作者数)select book.title,count(*) as author_countfrom bookinner join book2author on book.id = book2author.book_idinner join author on book2author.author_id = author.idgroup by book.title;-- left join 以left join后面的表名为基础在左侧添加select book.title, publisher.namefrom bookleft join publisher on book.pub_id = publisher.id-- yuan出版的每一本书的名字和对应出版社的名字select book.title,publisher.namefrom bookinner join publisher on book.pub_id=publisher.id --先拼接这个表inner join book2author on book.id = book2author.book_idinner join author on book2author.author_id = author.idwhere author.NAME="yuan";--delete from publisher where id=6; 一般不会一起删除,没有设置级联-- 添加外键约束   一对多     -- show create table 可以看到外键情况ALTER TABLE book add CONSTRAINT dep_fkFOREIGN KEY(pub_id) REFERENCES publisher(id) ON DELETE CASCADE;-- 会删除delete from publisher where id=3-- 添加外键约束ALTER TABLE <数据表名>ADD CONSTRAINT <外键名>FOREIGN KEY(<列名>) REFERENCES <主表名> (<列名>);-- 删除外键约束ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>; -- 注意有约束名字的ALTER TABLE book DROP FOREIGN KEY dep_fk;--查看约束show index from book;drop index 外键约束名 on<表名>; -- 同时将索引删除drop index dep_fk on book;show create table book;
  • 一对多:一个出版社可以对应多本书,这样理解也很顺
    • 接着在多的地方建立关联字段 pubish_id进行关联
      select book.title,publisher.email from book inner join publisher on book.pub_id = publisher.id where book.title = "xxx"
      --即使没有外键约束,这条查询仍然可以正常运行 不过外键会保持一致性
      
一对一

一对一的关系表其实用的并不多,一对一关联案例:

--上面创建过
CREATE TABLE author(id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(32) NOT NULL
) ENGINE=INNODB CHARSET=utf8;CREATE TABLE authorDetail(id INT PRIMARY KEY AUTO_INCREMENT,tel VARCHAR(32),addr VARCHAR(32),author_id INT NOT NULL UNIQUE,FOREIGN KEY (author_id) REFERENCES author(id)
) ENGINE=INNODB CHARSET=utf8;-- 插入 author 数据,上面插入过-- 插入 authorDetail 数据
INSERT INTO authorDetail (tel, addr, author_id) VALUES ('123456', 'Beijing', 1);
INSERT INTO authorDetail (tel, addr, author_id) VALUES ('654321', 'Shanghai', 2);-- 查询 author 及其 authorDetail (利用别名)
SELECT a.id, a.name, ad.tel, ad.addr
FROM author a
JOIN authorDetail ad ON a.id = ad.author_id;

笛卡尔积查询:​
select * from author,authordetail; -> 全部都会两两组合然后呈现

  • join (应该不需要利用foreign key 也可以实现
    • 利用条件从笛卡尔积结果中筛选出正确结果
      select * from author,authordetail where author_id = author.id;       
      
    • left join 左边的表的为主都保存 ,(也会显示 NULL
      select * from authordetail left join author on author_id = author.id;
      
    • right join 右边的表为主都保存,(也会显示 NULL
    • inner join 拼接能拼上的
约束
主键
  • 增加和删除主键

     alter table t2 add primary key(id);alter table t2 drop primary key;alter table t2 add primary key(name);
    
  • 联合主键 比如学生1选课1 只能出现一次,联合主键

    • 如果用学生编号做主键,那么一个学生就只能选择一门课程。如果用课程编号做主键,那么一门课程只能有一个学生来选
    -- ①创建时:
    create table sc (studentid int,courseid int,score int,
    primary key (studentid,courseid)
    );        
    -- ②修改时:
    alter table sc add primary key (字段1,字段2,字段3); --修改为三个字段作为主键```
    
  • 主键自增长约束

    CREATE TABLE t1(id INT(4) PRIMARY KEY AUTO_INCREMENT,name VARCHAR(25) );
    
unique约束等
  • unique 约束关系 唯一约束 (确保表中某一列或一组列中的数据具有唯一性)
    CREATE TABLE user(id INT(11) PRIMARY KEY,name VARCHAR(22) UNIQUE);  
    INSERT user (id,name) values (1,"yuan"),(2,"rain");   
    INSERT user (id,name) values (3,"alvin"),(4,"alvin");
    -- ERROR 1062 (23000): Duplicate entry 'alvin' for key 'name'
    
    对应修改唯一约束
    ALTER TABLE <表名> DROP INDEX <唯一约束名>;  -- 删除唯一约束
    ALTER TABLE <数据表名> ADD CONSTRAINT <唯一约束名> UNIQUE(<列名>);  -- 添加唯一约束
    ALTER TABLE user  DROP INDEX name;
    ALTER TABLE user ADD CONSTRAINT NAME_INDEX UNIQUE(name);```
    
  • 非空约束 not null 也可以修改和设置
  • 默认值default 约束
外键约束
  • 外键约束foreign key 建立约束关系!!! (见上面demo)

相关文章:

  • 最大似然估计(Maximum Likelihood Estimation, MLE)详解
  • Docker安装MySQL集群(主从复制)
  • 知识宇宙:技术文档该如何写?
  • 【MPC控制 - 从ACC到自动驾驶】ACC系统原理与MPC初步认知
  • SIAM-2007《k-means++: The Advantages of Careful Seeding》
  • 【漫话机器学习系列】275.GrabCut 算法——用于去除图片背景(Grabcut For Removing Image Backgrounds)
  • Oracle 19c DG备库报错ORA-00313、ORA-00312、ORA-27037
  • Kafka + Flink + Spark 构建实时数仓全链路实战
  • Linux系统管理与编程23:巧用git资源一键部署LAMP
  • wordpress主题开发中常用的12个模板文件
  • 算法中的数学:费马小定理
  • python下通过wmic设置程序的优先级~~~
  • 如何理解线性判别分析(LDA)算法?
  • Java语言快速排序和堆排序(优先队列)介绍,附demo代码
  • 安卓11 多任务视图270 度的情况报错
  • 12软件测试需求分析案例-删除学生信息
  • 免费PDF工具-PDF24V9.16.0【win7专用版】
  • 2025年八大员【标准员】考试题库及答案
  • 基于netty实现视频流式传输和多线程传输
  • 25年软考架构师真题(回忆更新中)
  • wap网站开发视频教程/河南网站建设定制
  • 未央免费做网站/网络推广推广外包服务
  • 如何在360网站网页上做笔记/私域运营软件
  • 做网站付费流程/网站建设的技术支持
  • 网站建设沙漠风/深圳网络推广公司有哪些
  • 哪个网站做视频有钱挣/建网站专业