mysql是一款很牛逼的关系型数据库。
上大学时,导论老师教的是用SQL Server,开发老师教的是用MySQL,Oracle也在课程体系之内,自学用的是Redis和Mongodb,以上构成了前段时间我对数据库我接触过的并且使用过然而也只是个crud boy的全部认知。在没听过丁奇老师的《MySQL实战45讲》之前,我觉得MySQL CURD写的6,然后事务啥的搞搞懂就还行吧。看了他的课后,受益良多,遂决定重新梳理下MySQL的知识点,这也坚定了我离开学校后,每个月花点钱投资在学习上的决心,付出就会有回报。
兄弟关系,是这样子的,收购sun公司的Oracle公司,财大气粗,收购了MySQL。MySQL开源社区担心有闭源的风险,就另起炉灶,开了一个MySQL的分支,叫MariaDB(这个Maria起的好啊,MySQL的创始人女儿的名字)
参考我的GitHub开源笔记:https://github.com/ataola/ataolaSkillsStack/blob/master/ToolsUseage/Mysql/README.md
好啦,看到这里,你大致应该是电脑上有个MySQL,别急先别跑起来,我们先坐下约定啊。
关于MySQL的一些基本操作,规范一点,统一这里数据库名小写(都小写的,你大写也没用),数据库表名前面加个“t_”后面小写,字段名首字母大写,跟一个表名的首字母,然后数据库语句基本组成大写, 这样子看上去整齐就比较美观了。
写法一:
# This is jiangtao Zheng Speaking!
写法二:
--- This is Jiangtao Speaking!
# 方法一:删库重建
DROP DATABASE IF EXISTS helloworld;
CREATE DATABASE helloworld;
# 方法二:有库不重建,没库重建
CREATE DATABASE IF NOT EXISTS helloworld;
这里的话,我们通常写方法二这句话就够了,为什么要加楼上这句话呢?就说,我们可能会遇到这样一种情况,我创建了一个数据库,但是有冲突,我数据库里面已经有了一个这样的数据库了。所以你是不是要判断一下, 如果有,删它。这里有两种写法, 一种是 "DROP DATABASE IF EXISTS helloworld", 另一种是"CREATE DATABASE IF NOT EXISTS helloworld", 这里我更倾向于前者,因为你不能保证后者的表就跟我要创建的一致吧。
同样的按照楼上2.1的思路,你应该猜也能猜到了。
# 方法一: 删表重建
USE helloworld;
DROP TABLE IF EXISTS t_user;
CREATE TABLE t_user (
`Uid` INT PRIMARY KEY, --id
`Uname` VARCHAR(20) NOT NULL --姓名
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
DESCRIBE `user`;
#方法二:有表不删表, 没表重建
USE helloworld;
CREATE TABLE IF NOT EXISTS t_user (
`Uid` INT PRIMARY KEY, --id
`Uname` VARCHAR(20) NOT NULL --姓名
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO t_user (`Uname`, `Uage`, `Uaddress`) VALUES('郑江涛', '23', '浙江杭州');
"增 "需要注意的是主键是否需要自增,如果自增的话,那么就不需要写上去了,这里我们可以考虑这样两种情况一种是部分插入、一种是完全插入。部分插入就是在符合表的约束前提下,我只插入表的一部分,剩下我不管,置空还是初始值你自己定义。完全插入看楼上例子。
DELETE FROM t_user WHERE `Uname` = "郑江涛";
UPDATE t_user SET Uage = 23 WHERE Uname = "郑江涛";
查是比较头疼的,查询这里也分,条件查询、连接查询、嵌套查询、关联查询、部分查询和全部查询等等。
# 全部查询
SELECT * FROM t_user;
#条件查询
--- 查询年龄为22的选手
SELECT * FROM t_user WHERE `UAge` = 22;
#嵌套查询
--- 查询开发部工资小于10000的选手的姓名和地址 (IN)
SELECT DISTINCT `EName`, `EAddress` FROM t_employee WHERE `ESalary` < 10000 AND `Dno` IN (SELECT `Dno` FROM t_department WHERE `DName` = '开发部');
#连接查询
--- 查询开发部工资小于10000的选手的姓名和地址 (NATURAL JOIN)
SELECT DISTINCT `EName`, `EAddress` FROM t_employee NATURAL JOIN t_department WHERE `DName` = '开发部' AND `ESalary` < 10000;
# 部分查询
SELECT `UName`, `UAge` FROM t_user;
这里只是列举一些最基本的,深入地学习还需要大家靠平时去CRUD。
字符串好,也没听说过电话号码能够拿来加减啊,所以还是字符串好,从这个方面考虑。
-- 部门表(主表)
CREATE TABLE t_dept(
Did INT PRIMARY KEY,
Dname VARCHAR(20)
)
-- 修改员工表(副表/从表)
CREATE TABLE t_employee(
Eid INT PRIMARY KEY,
Ename VARCHAR(20),
Deptid INT,-- 把部门名称改为部门ID
-- 声明一个外键约束
CONSTRAINT employee_dept_fk FOREIGN KEY(Deptid) REFERENCES t_dept(Did)
-- 外键名称 外键 参考表(参考字段)
)
交叉连接查询:不管三七二十一,查什么字段,需要什么表都给我写上,效率不高,会有笛卡尔积的产生,运气好会碰到数据重复。
SELECT Ename, Dname FROM t_employee, t_dept;
内连接查询:写清楚那些表的字段存在关系,然后用等号 连起来,使用很平凡啊
SELECT Ename, Dname FROM t_employee, t_dept WHERE t_employee.Deptid = t_dept.Did;
内连接还可以这样写
SELECT Ename, Dname FROM t_employee INNER JOIN t_dept ON t_employee.Deptid = t_dept.Did
有内连接我们也很容易想到有外连接,所以接下来看下外连接
左[外]连接查询:使用左边表的数据去匹配右边表的数据,如果符合连接条件的结果则显示,如果不符合连接条件则显示null
SELECT d.DeptName, e.EName FROM t_dept d LEFT OUTER JOIN t_employee e ON d.Did = e.DeptId
右[外]连接查询: 使用右边表的数据去匹配左边表的数据,如果符合连接条件的结果则显示,如果不符合连接条件则显示null
SELECT d.DeptName, e.EName FROM t_dept d RIGHT OUTER JOIN t_employee e ON d.Did = e.DeptId