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 的是系统自带的库
–用于注释 ,同时结尾带分号
- 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" --即使没有外键约束,这条查询仍然可以正常运行 不过外键会保持一致性
- 接着在多的地方建立关联字段 pubish_id进行关联
一对一
一对一的关系表其实用的并不多,一对一关联案例:
--上面创建过
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)