mysql教程简介
- 开放源代码的关系型数据库管理系统。由瑞典MySql AB公司1995开发。
数据库的概述
- 持久化persistence
数据库的概念
- DB:数据库(database)
- DBMS:数据库管理系统(database management system)通过DBMS操作数据库
- SQL:结构化查询语言(structured query language)专门用来数据库通信的语言。
数据库和数据库系统的关系
- 通过TCP/IP协议,服务器端口号 访问对应的Mysql服务器
常见的数据库管理系统排名
- 三四百家
-
- Oracle、 2. MySql 主流的两家。
- MySql被Oracle收购
为什么选择MySql
- 开源代码,成本低
- 性能卓越,服务稳定
- 软件体积小,使用简单,易于维护
- 历史悠久,社区用户活跃
- 许多互联网公司使用
Oracle vs MySql
- Orcale适合大型跨国企业,对收费不敏感,对性能有高要求
- MySql体积小、速度快、成本低
RDBMS(关系型) 和 非RDBMS(非关系型)
- 非RDBMS: 文档型数据库 搜索引擎数据库 Solr、Elasticsearch、Splunk 列式数据库 关系型数据库属于行存储,列式数据库属于列存储。 列式数据库的好处:降低IO,适合分布式文件系统 图形数据库
ORM思想(Object Relational Mapping)对象关系映射
数据库中的一个表 == Java/Python的一个类 表中的一条数据 == 类中的一个对象/实体 表中的一个列 == 类中的一个字段(field)、属性(attribute)
表、记录、字段
E-R(entity-relationship,实体-联系)模型中有三个主要概念是:实体集、属性、联系集 一个实体集(class)对应于数据库中的一个表(table),一个实体(instance)则对应于数据库表中的一行(row),也称为一条记录(record),一个属性(attribute)对应于数据库表中的一列(column),也称为一个字段(field)
SQL分类
- DDL(data definition languages、 数据定义语言):create、drop、alter、rename、truncate
- DML(data manipulation languages、 数据操作语言):insert、delete、update、select(重中之重)
- DCL(data control language、 数据控制语言):grant、revoke、commit、rollback、savepoint
学习技巧:大处着眼、小处着手。
SQL语言规则和规范
基本规则
- 各子句分行写,要注意锁进
- 每行命令要用/g 或者 /G 用在终端操作
- 关键字不能被缩写也不能被分开
- 关于标点符号
如何导入数据
- 方式一: source 文件的全路径名
- 方式二:基于具体的图形化界面工具导入数据。
select * from xxx
- select 列名1,列名2,列名3… from xxx
列的别名 (as: 全称: alias(别名))/ 可以使用双引号定义别名
- select 列名1
别名,列名2,列名3… from xxx - select 列名1
as 别名,列名2,列名3… from xxx - select 列名1
“别名“,列名2,列名3… from xxx
去重复行
- 查询有有哪几类id
- select
distinct列名 from xxx;
空值参与运算
- 空值: null
- null不等同于0,’’, ‘null’
- 空值参与运算:
IFNULL(num, 0): select employee_id, salary “月工资”, salary * (1 + IFNULL(commission_pct, 0)) * 12 “年工资” From employees;
着重号``
- 一些单词和数据库名称重复,需要用着重号
- 例如: SELECT * FROM
ORDER;
查询常数
- SELECT 常数名称 employee_id, last_name FROM XXX;
- 出现在表头位置,用常数表示表的代表意义
显示表结构
- DESCRIBE employees; #显示了表中字段的详细信息
- DESC employees; 缩写写法
过滤数据
- 查询90号员工的信息
SELECT * FROM XXX 过滤调节 WHERE last_name = 'joey';
运算符
- 算数运算符: +、 -、 *、/或div、%或MOD
- 取模运算:%或MOD
- 比较运算符:=、 <=>、>、 <、!=、<=、>=、
- 只要有NULL参与判断,结果就为NULL
- 安全等于 <=> 用于判断NULL
- IS NULL、IS NOT NULL、ISNULL()
- LEAST()最小的、GREATEST()最大的
- BETWEEN…AND… 区间
- OR 并且两种条件
- IN (set)和 NOT IN (set) 查找离散值:WHERE XXX = 10 OR XXX = 20 OR XXX = 30 相当于 WHERE XXX IN (10, 20 ,30)
- LIKE 模糊查询;% 代表不确定个数的字符:WHERE XXX LIKE “%a%”;
- LIKE 模糊查询;% 代表不确定个数的字符:WHERE XXX LIKE “a%”; // 查询以字符a开头的信息
- LIKE 模糊查询;% 代表不确定个数的字符:WHERE XXX LIKE “%a%” AND XXX LIKE “%e%”; // 查询又包含a又包含e
- LIKE 模糊查询;% 代表不确定个数的字符:WHERE XXX LIKE “%a%e%”; // 查询又包含a在前e在后的信息
- _ : 代表一个不确定的字符
- 查询第二个字符是a的:WHERE XXX LIKE “_a%”;
- 如果出现搜索字符对应位置是_,干扰查询,需要用转义字符\:WHERE XXX LIKE “__a%”;
- 这则表达式REGEXP / RLIKE
- XOR: “异”, 两个判断一个真一个假的情况下输出信息;
- ()优先级最高
位运算符
- & 、 | 、^ 、 ~ 、 》 、 《
排序与分页
ORDER BY实现排序操作
- 升序:ASC
- 降序:DESC
- SELECT ID FROM XXX ORDER BY salary ASC;
- 声明:WHERE 需要在ORDER BY前面
二级排序
- SELECT empolyee_id,salary,department_id FROM empolyees ORDER BY empolyee_id DESC, salary ASC;
LIMIT 实现分页
SELECT empolyee_id,salary,department_id
FROM empolyees
LIMIT (pageNo - 1) * pageSize, pageSize
- 只想展示32,33条数据
SELECT empolyee_id,salary,department_id FROM empolyees LIMIT 31, 2 - LIMIT…OFFSET…
只想展示32,33条数据
SELECT empolyee_id,salary,department_id FROM empolyees LIMIT 2 OFFSET 31
多表查询
- 笛卡尔积
- 正确的多表查询
SELECT employee_id, department_name FROM employees, departments ## 两个表的连接条件 WHERE employees.`employee_id` = departments.`department_id`; - 如果查询语句中出现了多个表都存在的字段,则必须指明此字段所在的表
SELECT employee_id, department_name, employees.department_id FROM employees, departments WHERE employees.`employee_id` = departments.`department_id`; -
建议:从sql优化的角度来看,建议多表查询时,每个字段名称前都表明所在对应的表。
- 当查询条件过多,sql的可读性变差,需要在
SELECT和WHERE中使用表的别名, 一旦使用的表别名,一定要使用表的别名,不能使用原名SELECT emp.employee_id, dep.department_name, emp.department_id FROM employees emp, departments dep WHERE emp.`employee_id` = dep.`department_id`;
演绎式 VS 归纳式
- 演绎式:提出问题1 —-> 解决问题1; 提出问题2 —-> 解决问题2
- 归纳式:总 — 分
多表查询的分类
- 角度一:等值连接 VS 非等值连接
- 角度二:自连接 VS 非自连接
- 角度三:内连接 VS 外连接
等值连接 VS 非等值连接
- 等值 =
- 非等值 !=、>、 < …
自连接 VS 非自连接
- 自连接:将一张表声明成两张表进行自查询
- 非自连接:两张表进行自查询
内连接 VS 外连接
- 内连接:合并具有同一列的两个以上的表的行,
结果集中不包含一个表与另一个表不匹配的行 - 外连接:合并具有同一列的两个以上的表的行,
结果集中包含一个表与另一个表匹配的行以外,还查询到了左表 或 右表 不匹配的行 - 外连接分类:左外连接、右外连接、满外连接
## 内连接练习: ## 查询`所有信息`的last_name、department_name信息 SQL99语法实现内连接: SELECT last_name、department_name, city FROM employees e JOIN departments d ON e.`department_id` = d.`department_id` JOIN localtion l ON d.location_id = l.location_id
## SQL99语法实现左外连接练习:
SELECT last_name、department_name, city
FROM employees e LEFT OUTER JOIN departments d
ON e.`department_id` = d.`department_id`
JOIN localtion l
ON d.location_id = l.location_id
## SQL99语法实现右外连接练习:
SELECT last_name、department_name, city
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
JOIN localtion l
ON d.location_id = l.location_id
## 满外连接不支持 FULL OUTER JOIN
## SQL99语法实现满外连接练习:
SELECT last_name、department_name, city
FROM employees e FULL JOIN departments d
ON e.`department_id` = d.`department_id`
JOIN localtion l
ON d.location_id = l.location_id
UNION 和 UNION ALL的使用
- UNION:会执行去重的操作
- UNION ALL:不会去重操作
- 结论: 如果明确知道合并数据后不存在重复数据,或者不需要去重复数据,则尽量使用
UNION ALL语句,以提高效率
7种JOIN
- 内连接:JOIN (中间重复2次)
- 左外连接:LEFT JOIN
- 右外连接:RIGHT JOIN
- 左外减内连:先JOIN,再WHERE d.department_id IS NULL;
- 右外减内连:先JOIN,再WHERE e.department_id IS NULL;
- 满连接:左外减内连 UNION ALL 右外连接 / 右外减内连 UNION ALL 左外连接
- 满外连接:左外减内连 UNION ALL 右外减内连
自然连接
- 自然连接: 它会帮你自动的连接2张表中所有相同的字段; NATURAL JOIN
USING 连接
- USING:连接合并两个表中相同的字段 例如:JOIN…ON e.department_id = d.department_id; 可以用USING:JOIN…ON USING(department_id)
函数
- 函数的作用,把我们经常使用的代码封装起来,需要的时候直接调用。Function(),数学中的y=f(x)
- 内置函数 / 自定义函数
- 单行函数(输入1个输出1个) / 多行函数(输入多个输出1个)
数值函数
基本函数
- ABS(x)返回x的绝对值
- SIGN(x)正数返回1,负数返回-1,0返回0
- PI()圆周率的值
- CEIL(x),CEILING(x)返回大于或等于某个值的最小整数
- FLOOR(x)返回小于或等于某个值的最大整数
- LEAST(e1, e2,e3…)返回列表中的最小值
- GREATEST(e1, e2,e3…)返回列表中的最大值
- MOD(x,y)返回x除以y以后的余数
- RAND()返回0-1的随机值
- RAND(x)返回0-1的随机值,其中x的值用作种子值,相同的x值会产生相同的随机数
- ROUND(x)返回一个对x的值进行四舍五入后,最接近x的整数
- ROUND(x,y)返回数字x截断为y位小数的结果。比如:ROUND(1.34,1)保留一位小数=1.3
- TRUNCATE(x,y)截断,比如:ROUND(1.54,0)保留小数前=1
- SQRT(x)返回x的平方根。当x的值为负数时,返回NULL。
三角函数
- SIN(x)返回x的正弦值,其中,参数x为弧度值。
- ASIN(x)返回x的反正弦值,即获取正弦为x的值。如果x的值不在-1到1之间,则返回NULL。
- COS(x)返回x的余弦值,其中,参数x为弧度值。
- ACOS(x)返回x的反余弦值,即获取余弦为x的值。如果x的值不在-1到1之间,则返回NULL。
- TAN(x)返回x的正切值,其中,参数x为弧度值。
- ATAN(x)返回x的正切值,即返回正切值为x的值。
- ATAN2(m,n)返回两个参数的反正切值。
- COT(x)返回x的余切值,其中,x为弧度值。
角度与弧度互换函数
- RADIANS(x)将角度转化为弧度,其中,参数x为角度值。
- DEGREES(x)将弧度转化为角度,其中,参数x为弧度值。
指数与对数
- POW(x,y)表示x的y次方
- POWER(x, y)表示x的y次方
- EXP(x)返回e的x次方,其中e是一个常数,2.718281828459045
- LN(x),LOG(x)返回以e为底的x的对数,当x <= 0时,返回的结果为NULL
- LOG10(x)返回以10为底的x的对数,当x <= 0时,返回的结果为NULL
- LOG2(x)返回以2为底的x的对数,当x <= 0时,返回的结果为NULL
进制间的转换
- BIN(x)返回x的二进制编码
- HEX(x)返回x的十六进制编码
- OCT(x)返回x的八进制编码
- CONV(x,f1,f2)返回f1进制数变成f2进制数
字符串函数
- ASCII(s)返回字符串s中的第一个字符的ASCII码值
- CHAR_LENGTH(s) 返回字符串s的字符数,作用与CHARACTER_LENGTH(s)相同
- LENGTH(s)返回字符串s的字节数,和字符集有关
- CONCAT(s1,s2,s3…,sn)连接s1,s2,…sn为一个字符串
- CONCAT_WS(x, s1, s2, … sn) 通CONCAT,但是每个字符之间要加上x
- INSERT(str,idx,len,replacestr)将字符串str从第idx位置开始,len个字符长的子串替换为字符串replacestr
- REPLACE(str,a,b)用字符串b替换字符串str中所有出现的字符串a
- UPPER(s)或 UCASE(s)将字符串的s的所有字母转换成大写字母
- LOWER(s)或 LCASE(s)将字符串的s的所有字母转换成小写字母
- LEFT(str,n)返回字符串str最左边的n个字符
- RIGHT(str,n)返回字符串str最右边的n个字符
- LPAD(str,len,pad)用字符串pad对str最左边进行填充,知道str的长度为len个字符(实现右对齐效果)
- RPAD(str,len,pad)用字符串pad对str最右边进行填充,知道str的长度为len个字符(实现左对齐效果)
- LTRIM(s)去掉字符串s左侧空格
- RTRIM(s)去掉字符串s右侧空格
- TRIM(s)去掉字符串s开始与结尾的空格
- TRIM(s1 FROM s)去掉字符串s开始与结尾的s1
- TRIM(LEADING s1 FROM s)去掉字符串s开始处的s1
- REPEAT(str,n)返回str重复n次的结果
- SPACE(n)返回n个空格
- STRCMP(s1, s2)比较字符串s1,s2的ASCII码值的大小
- SUBSTR(s,index,len)返回字符串s的index位置其len个字符,作用与SUBSTRING(s,n,len)、MID(s,n,len)相同
- LOCATE(substr,str)返回字符串substr在字符串str中首次出现的位置,作用于POSITION(substr IN str)、INSTR(str,substr)相同。未找到,返回0;
- ELT(m, s1, s2, …, sn)返回指定位置的字符串,如果m=1,则返回s1,如果m=2,则返回s2,如果m=n,则返回sn
- FIELD(s,s1,s2,…, sn)返回字符串s在字符串列表中第一次出现的位置
- FIND_IN_SET(s1,s2)返回字符串s1在字符串s2中出现的位置。其中,字符串s2时一个以逗号分隔符的字符串
- REVERSE(s)返回s反转后的字符串
- NULLIF(value1, value2)比较两个字符串,如果value1与value2相等,则返回NULL,否则返回value1
日期和时间函数
- CURDATE(), CURRENT_DATE() 返回当前日期,只包含年月日
- CURTIME(), CURRENT_TIME() 返回当前时间,只包含时分秒
- NOW() / SYSDATE() / CURRENT_TIMESTAMP() / LOCALTIME() / LOCALTIMESTAMP() 返回当前系统日期和时间
- UTC_DATE() 返回UTC日期
- UTC_TIME() 返回UTC时间
日期与时间戳的转换
- UNIX_TIMESTAMP() 以UNIX时间戳的形式返回当前时间。
- UNIX_TIMESTAMP(date) 将时间date以UNIX时间戳的形式返回
- FROM_UNIXTIME(timestamp) 将UNIX时间戳的时间转换为普通格式的时间
获取月份、星期、星期数、天数等函数
- YEAR(date) / MONTH(date) / DAY(date) 返回具体的日期值
- HOUR(time) / MINUTE(time) / SECOND(time) 返回具体的时间值
- MONTHNAME(date) 返回月份:January…
- DAYNAME(date) 返回星期几: MONDAY, TUESDAY…
- WEEKDAY(date) 返回周几; 注意:周一是0,周二是1…
- QUARTER(date) 返回日期对应的季度,范围为1~4
- WEEK(date), WEEKOFYEAR(date) 返回一年中的第几周
- DAYOFYEAR(date) 返回一年中的第几天
- DAYOFMONTH(date) 返回所在月份的第几天
- DAYOFWEEK(date) 返回周几,注意:周日是1,周一是2
时间和秒钟转换的函数
- TIME_TO_SEC(time) 将time转化秒并返回结果值
- SEC_TO_TIME(seconds) 将seconds描述转化为包含小时、分钟和秒的时间
计算日期和时间的函数
- DATE_ADD(datetime, INTERVAL expr type), ADDDATE(date, INTERVAL expr type) 返回与给定日期时间相差INTERVAL时间段的日期时间。
- DATE_SUB(date, INTERVAL expr type), SUBDATE(date, INTERVAL expr type) 返回与date相差INTERVAL时间间隔的日期。
- ADDTIME(time1, time2)
- SUBTIME(time1, time2)
- DATEDIFF(date1, date2)
- TIMEDIFF(time1, time2)
- FROM_DAYS(N) 从0000年1月1日起,N天以后的日期
- TO_DAYS(date) 返回日期date距离从0000年1月1日的天数
- LAST_DAY(date) 返回date所在月份的最后一天的日期
- MAKEDATE(year, n) 针对指定年份中的天数返回一个日期
- PERIOD_ADD(time, n) 返回time加上n后的时间
日期的格式化与解析:日期转化为字符串 / 字符串转化为日期
- DATE_FORMATE(date, fmt)
- TIME_FIRMATE(time, fmt)
- GET_FORMATE(date_type, format_type)
- STR_TO_DATE(str, fmt)
流程控制函数
- IF(value, value1, value2) 如果value值为true,返回value1, 否则返回value2
- IFNULL(value1, value2) 如果value1不为NULL,返回value1,否则返回value2
- CASE WHEN 条件1 THEN 结果1 WHEN 条件2 THEN 结果2 … (相等于java的if.. else.. )
- CASE expr WHEN 常量1 THEN 结果1 WHEN 常量2 THAN 结果2. … END
加密与解密函数
- PASSWORD(str) 返回字符串str的加密版本,41位长的字符串,加密不可逆
- MD5(str) 返回字符串str的md5加密后,也是一种加密方式。若参数为NULL,则会返回NULL
- SHA(str)
MYSQL信息函数
- SELECT VERSION(), CONNECTION_ID(), DATABASE(), SCHEMA(), USER(), CURRENT_USER(), CHARSET(‘qiaoyu’), COLLATION(‘qiaoyu’) FROM DUAL;
其他函数
- FORMAT(value, n) 四舍五入小数保留n位
- CONV(value, from, to) 将value的值进行不同进制之间的转换
- INET_ATON(ipvalue) 将以点分割的IP地址转化为一个数字
- INET_NTOA(value) 将数字形式的IP地址转化为以点分割的IP地址
- BENCHMARKE(n, expr)
- CONVERT(value USING char_code) 将value所使用的字符编码修改为char_code
聚合函数(多行函数)
- 自变量可以是多个,但是结果只能是一个
- 聚合函数作用于一组数据,并对一组数据返回一个值
- 比如一个表中最大的值是多少
聚合函数
- 常见的几个聚合函数
- AVG / SUM
- MAX / MIN
- COUNT
- 方差
- 标准差
- 中位数
- 如果需要统计表中的记录书,使用COUNT()、COUNT(1)、COUNT(具体字段)哪个效率更高?答:COUNT()、COUNT(1)
GROUP BY的使用(分组)
- 比如查询各个部门的平均工资
SELECT department_id, AVG(salary), SUM(salary) FROM employees GROUP BY department_id - 结论一:SELECT中出现的非组函数的字段必须声明再GROUP BY中。反之,GROUP BY中声明的字段可以不出现在SELECT中。
- 结论二:GROUP BY 声明在FROM
后面、WHERE后面,ORDER BY前面、LIMIT前面 - 结论三:MySQL中GROUP BY中使用
WITH ROLLUP(WITH ROULLUP 把整体数据看成一组)
HAVING 用来过滤数据的
- 比如查询各个部门中最高工资比10000高的部门信息
SELECT department_id, MAX(money) moneys From employees GROUP BY department_id HAVING MAX(moneys) > 10000; - 要求1: 如果过滤条件中使用了聚合函数,则必须使用HAVING来替换WHERE。否则报错。
- 要求2: HAVING必须声明在GROUP BY后面
- 开发中,我们使用HAVING的前提是SQL中使用GROUP BY
HAVING VS WHERE
- 当过滤条件中有聚合函数时,则此过滤条件必须声明在HAVING中
-
当过滤条件中没有聚合函数时,则此过滤条件声明在WHERE或HAVING中都可以。但是大家都声明在WHERE中
- HAVING使用范围更广
- WHERE效率更高,WHERE先筛选后关联;HAVING先关联后筛选;
SQL底层执行的原理
- SELECT语句的完整结构
- SELECT (存在聚合函数)
- FROM…, (LEFT/RIGHT)JOIN …ON …
- WHERE 多表的连接条件 AND 不包含聚合函数的过滤条件
- GROUP BY
- HAVING
- DISTINCT 去重
- ORDER BY 排序(ASC/DESC)
- LIMIT
- SQL语句的执行过程
- SELECT (是否存在聚合函数)
- FROM…, (LEFT/RIGHT)JOIN …ON …
- WHERE 多表的连接条件 AND 不包含聚合函数的过滤条件
- GROUP BY
- HAVING
- DISTINCT
- ORDER BY 排序(ASC/DESC)
- LIMIT
自查询举例与自查询的分类
子查询
- 指一个查询语句潜逃在另一个查询语句内部的查询,这个特性从MySQL4.1开始引入
问题:谁的工资比Abel的高?
答:
自连接SELECT e2.last_name, e2.salary FROM employees e1, employees e2 WHERE e2.`salary` > e1.`salary` # 多表的连接条件 AND e1.last_name = 'Abel'优化自查询SELECT salary FROM employees WHERE salary > ANY( SELECT salary FROM employees WHERE last_name = 'Abel' ); - 自查询的分类
- 角度一:从内查询返回结果的条目数 单行子查询 VS 多行子查询
- 角度二:内查询时否被执行多次
相关子查询 VS 不相关子查询
- 比如:相关子查询的需求:查询工资大于本部门平均工资的员工信息 不相关子查询的需求:查询工资大于本公司平均工资员工的信息
单行子查询
- 单行操作符: = 、 != 、 > 、 < 、 >= 、 <=
多行子查询
- 多行操作符: IN 、 ANY 、 ALL 、 SOME(同ANY)
关联子查询
- 结论:除了
GROUP BY和LIMIT,其他地方都可以声明子查询;
- 数据库名,表名不能超过30个字符,限制为29.
- 必须只能包含A-Z,a-z, 0-9, 共63个字符
- 数据库名,表名,字段名等对象中间不要包含空格
- 同一个mysql软件中,数据库不能同名;同一个库中,表不能重名;同一个表中,字段不能重名
- 必须保证你的字段没有和保留字、数据库系统或常用方法冲突。如果坚持使用,请在SQL语句中使用
- 保持字段名和类型的一致性:在命名字段并为其指定数据类型的时候一定要保证一致性,假如数据类型在一个表里是整数,那在另一个表里可就变成字符型了。
创建数据库
- 方式1: CREATE DATABASE 数据库名;
- 方式2: CREATE DATABASE 数据库名 CHARACTER SET 字符集;
- 方式3: CREATE DATABASE IF NOT EXISTS 数据库名;
管理数据库
- 查看数据库列表
- SHOW DATABASES;
- 切换数据库
- USE 数据库名;
- 查看当前数据库中保存的数据表
- SHOW TABLES;
- 查看当前使用的数据库
- SELECT DATABASE() FROM DUAL;
- 查看指定数据库下保存的数据表
- SHOW TABLES FROM 数据表名;
修改数据库(一般不能改)
- 更改数据库的字符集
- ALTER DATABASE 数据库名 CHARACTER SET ‘utf8’;
- ALTER DATABASE 数据库名 CHARACTER SET ‘gbk’;
数据库改名
- DATABASE不能改名,一些可视化工具提供的改名是新建数据库,把所有表复制到新库,再删除旧库完成。
删除数据库
- DROP DATABASE 数据库名;
- DROP DATABASE IF EXISTS 数据库名;
创建表
- 方式1: CREATE TABLE [IF NOT EXISTS] 表名( id INT, emp_name VARCHAR(15), ## 使用VARCHAR来定义字符串,必须在使用VARCHAR时指明其长度。 hire_date DATE );
查看表结构
- DESC 表名;
- SHOW CREATE TABLE 表名;
查看表数据
- SELECT * FROM 表名;
基于现有的表创建新表
CREATE TABLE 新表名 AS SELECT 字段名, 字段名, 字段名 FROM 旧表名
修改表
- 添加一个字段
- ALTER TABLE 表名 ADD 字段名 DOUBLE(10,2)
- 添加到第一个:ALTER TABLE 表名 ADD 字段名 FIRST
- 放置到某一个后面:ALTER TABLE 表名 ADD 字段名 AFTER 某一个字段
- 修改一个字段
- ALTER TABLE 表名 MODIFY <字段名> <字段新名称> <字段的类型>字段的类型>字段新名称>字段名>
- 重命名一个字段
- ALTER TABLE 表名 CHANGE <字段名> <字段新名称> <字段的类型>字段的类型>字段新名称>字段名>
- 删除一个字段
- ALTER TABLE <表名> DROP <字段名>字段名>表名>
重命名表
- 方式一:RENAME TBALE 表名 TO 新表名
- 方式二:ALTER TABLE 表名 RENAME TO 新表名
删除表:不光将表结构删除掉,同时表中的数据也要删除掉,释放空间
- DROP TABLE IF EXISTS 表名;
清空表:表中数据删除掉,表结构保留
- TRUNCATE TABLE 表名;
DCL 中的COMMIT 和 ROLLBACK
- COMMIT:提交数据,一旦执行,数据永久的保存在数据库中,不能回滚。
- ROLLBACK:一旦执行,可以回滚,回滚到最近的一次COMMIT之后。
对比 TRUNCATE 和 DELETE FROM
- 相同点:都可以实现对表中数据的删除,同时保留表结构。
-
不同点:TRUNCATE:一旦执行此操作,表数据全部清除。同时,数据是不可以回滚的。 DELETE FROM:一旦执行操作,表数据可以全部清除。同时,数据是可以实现回滚的。
- DDL 和 DML的说明
DDL代表数据定义语言。DML代表数据操作语言。DDL语句用于创建数据库、模式、约束、用户、表等。DML语句用于插入、更新或删除记录。
- DDL的操作一旦执行,就不可回滚
- DML默认情况下,一旦执行,也不可回滚。但是,如果在执行DML之前,执行了 SET autocommit = false; 则执行的DML操作就可以实现回滚; SET autocommit = false 对DDL失效;
- 因为DDL在执行指令之后会自动执行一次commit,所以不能回滚;
添加数据
- 一条一条插入
- INSERT INTO 表名 VALUE(1,’Tom’, ‘2023-01-01’);(不推荐)
- INSERT INTO 表名(id, name, data) VALUE (1,’Tom’, ‘2023-01-01’); (推荐)
- INSERT INTO 表名(id, name, data) VALUES (1,’Tom’, ‘2023-01-01’)(2, ‘xxx’, 2023-01-02)…;
- 将查询结果插入到表
INSERT INTO 表名(id, name, salary) SELECT id, name, salary FROM 查询表名; - 添加表中要添加数据的字段长度不能低于查询表中的长度
更新数据
UPDATE... SET ... WHERE ...
UPDATE 更新表名
SET 字段
WHERE id = 5;
- 同时修改多个字段
UPDATE 更新表名 SET 字段1 = '', 字段2 = '' WHERE id = 5;
删除数据
- DELETE FROM … WHERE …
DELETE FROM 表名 WHERE id = 1;
MYSQL8的新特性:计算列
CREATE TABLE 表名(
a INT,
b INT,
c INT GENERATED ALWAYS AS (a + b) VIRTUAL #c即为计算列
);
INSERT INTO 表名(a, b) VALUE(10, 20)
MYSQL中支持的数据类型
- 整数类型:TINYINT(-128~127)、SMALLINT(-32768~32767)、MEDIUMINT、INT(或INTEGER)、BIGINT
- 浮点类型:FLOAT、DOUBLE
- 定点书类型:DECIMAL
- 位类型: BIT
- 日期时间类型: YEAR、TIME、DATE、DATETIME、TIMESTAMP
- 文本字符串类型: VARCHAR、CHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT
- 枚举类型: ENUM..
- 集合类型: SET
- 二进制字符串类型:BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB
- JSON类型:JSON对象、JSON数组
- 空间数据类型:单值类型 / 集合类型
属性
- NULL
- NOT NULL
- DEFAULT
- PRIMARY KEY
- AUTO_INCREMENT 自动递增,适用于整数类型
- UNSIGNED 无符号,不能为负数
- CHARACTER SET name 指定一个字符集