DQL 数据查询语言 select
DML 数据操作语言 insert delete update
DDL 数据定义语言 create drop alter
DCL 数据控制语言 grant revoke
net start mysql80
win开启mysql进程
net stop mysql80
win关闭mysql进程
MySQL -uroot -p<password>
登录MySQL
create database <dbname>
创建名字为dbname的数据库
show databases;
查看MySQL里面有几个数据库,默认自带四个
use <dbname>
使用dbname数据库
show tables
查看当前库所有表名
desc <tableName>
查看表结构
- DQL
select * form <tableName>
对tableName进行全表查询
select <field1>, <field2>... from <tableName>
从tableName表查询field1,filed2...
使用as取别名,但是不改变表filed名。(as可以省略,别名不能有空格,有空格可以用单引号)
select <field> as <myfield> for <tableName>
讲查询结果field->myfield
查询计算
select <field>*<n> as <myfiled> form <tableName>
将filed查询结果乘n并且改为myfiled
条件查询 where
**= 等于
<> 或者 !+ 不等于
<= 大于等于 >= 小于等于 > 大于 < 小于
between ... and ... 等价于 >= and <= (左小右大)
and 并且逻辑(优先级高于or, 可以()来提高or优先级)
or 或者逻辑
in (<v1>, <v2>,<v3>...)
在里面就为true
not in (<v1>,<v2>...)
模糊查询%(任意多个) _(任意一个)可以用\转义
排序 order by (默认升序) order by <field1>,<field2> desc
按field1降序,如果相等再比field2
order by <n>
按查询结果的第n列排序
语句执行顺序:select ... from ... where ... order by ... : from->where->select->order by
分组查询(group by可以多个字段联合分组):select <field> from <table> where <condition> group by <field> order by <field>
:执行顺序from-where-group by-select-order by
having:可以对分组之后的数据进一步过滤,效率比较低,尽量使用where过滤
注意:在分组查询里面select<field>里面的field只能是分组字段和分组函数,不然没有意义。
注意:null的判断要用is 或者is not
连接查询
- 内连接
select <>,<> from <> inner join <> on <> where <>
- 等值连接 on条件为等值
- 非等值连接 on条件为非等值
- 自联接 一张表取多次别名(看成多张表)
- 外连接
select <>,<> from
- 左外连接 左边的数据全部查询出来
- 右外连接 右边的数据全部查询出来
- 全连接
子查询:就是select或where或from语句里面嵌套select语句嵌套
- DDL
建表:create table <tableName> (<field1> <type> <opt>,<field2> <type> <opt>, ...);
删表:drop table <tableName>
(删除的表不存在会报错), drop table if exists <tableName>
(避免报错)
增加数据insert into:insert into <tableName> (<field1>,<field2> ...) values <v1>,<v2> ...
更新数据:update <tableName> set <field1>=<v1>,<field2>=<v2> ... where <condition>
注意:没有条件会全部更新
删除数据(DML)
delete delete from<tableName> where <condition>
注意:没有条件会删除所有的数据,可以回滚,效率低
truncate(DDL) truncate table <tableName>
删除不可以回滚, 效率高
- 对表结构的修改(alter)(DDL)(几乎不用,成本高):
-
约束:建表时可以对字段进行约束
- 非空约束 not null
- 主键约束 primary key,auto_incremen自增
- 唯一约束 unique
- 外键约束 foreign key
foreign key <fkName> references <tbName>(<field>)
外键fkName引用表tbName的field字段
-
存储引擎(engine):不同的存储引擎,MySQL的存储数据的方式不一样
- InnoDB(默认):数据有两个文件(*.frm;*.DB)支持事务,行锁,MVCC
- MyISAM:数据有三个文件(.frm;.MYD;*.MYI);可压缩,
- memory:数据存储在内存,反应速度快,但易丢失
- 事务:MySQL的最小执行单元,要么全部成功,要么全部失败。(默认提交,即没执行一条就提交事务)
开启事务:start transaction
提交事务:commit
回滚事务:rollback
事务的特性(ACID):
- 原子性(A):最小执行单元不可再分.
- 一致性(C):一个事务里面的操作同时成功或失败。
- 隔离性(I):事务之间互不影响。
- 持久性(D):事务提交之后会落盘。
-
事务隔离级别:
- 读未提交(read uncommitted):隔离级别最低,存在脏读。
- 读已提交(read committed):解决了脏读现象,但是不满足重复读取要求的业务。
- 可重复读(repeat able):MySQL默认级别,只要事务不提交,读取的数据都不变,但是存在幻读(其他事务insert导致)。
- 串行化(serializable):事务顺序执行,隔离级别最高,效率太低了。
设置MySQL隔离级别:set global transaction isolation level <isolationLevel>
查看当前的隔离级别:select @@tx_isolation
- 索引(index):为了提高效率,避免全表扫描的一种机制,有哈希索引,B树,B+tree等
创建索引: create index <indexName> on <tableName>(<field>)
给表tableName的field字段加索引。
删除索引: drop index <indexName> on <tableName>(<field>)
删除表tableName的field字段的索引。
索引失效几种情况:
- 模糊查询以%开头。
- where语句中使用or,并且or两端有一端字段没有索引。
- 复合索引不满足最左前缀原则。
- 索引字段在where子句里面参与了运算或者函数运算等。
- 视图(view):对创建的视图进行操作(增删改)会影响原数据(简化开发)。
创建视图:create view <viewName> as <opt>
用opt(DQL)操作的查询结果创建视图
删除视图:drop view <viewName>
- DCL
创建用户:create user <userName> indentified by <password>
-
数据库三范式:表的设计规则,可以减少数据冗余。
- 第一范式:有主键,字段原子不可再分。
- 第二范式:满足第一范式,并且不存在部分依赖。
- 第三范式:满足第二范式,并且不存在传递依赖。
-
MySQL常见数据类型:
varchar 会根据实际的长度动态分配内存 省空间但是速度慢
char 定长 不灵活可能浪费空间但是分配速度快
int 最长11位
bigint 长整型long
float
double
date 短日期 包括 年 月 日 默认格式 %Y-%m-%d
datetime 长日期 包括 年 月 日 时 分 秒 默认格式 %Y-%m%d %h:%i:%s
clob 字符大对象,可以存储最大4G的字符串,超过255字符的都用clob存储
blob 二进制大对象,存储图片,声音,视频等
-
数据处理函数(单行:一个输入一个输出; 多行:多个输入一个输出):
单行处理函数:
lower 转小写
upper 转大写
substr 取子串 substr(<strName>,<start>,<len>)
截取strName从start(1开始)开始长度为len
concat 字符串拼接 concat(<str1>,<str2>)
结果为str1+str2
length 取长度
trim 去除前后的空白
str_to_date 将varchar字符串转换成日期date
date_format 将日期date转化为varchar字符串
format 数字格式化
round 四舍五入 round(<num>,<n>)
将num四舍五入保留小数点后n(可以为负数)位
rand() 生成随机数
ifnull 可以将null转换为具体值 ifnull(<field>,<value>)
如果field为null则当作值value
now() 可以获取当前时间
多行处理函数(group by 分组)(默认所有为一组):
count 计数(忽略null) count(<field>) 统计field不为null的行数 count(*) 统计总行数
sum 求和
avg 求平均
max 求最大值
min 求最小值
注意:分组函数不能放在where子句里面
-
orther
select version();
查看当前MySQL的版本
\c 可以终止sql的输入
source path
导入path路径的数据
mysqldump <databaseName> <path>
把库databaseName导出为sql脚本文件到path目录下
执行顺序 from-where-group by-having-select-order by-limit
case when then 语句 case <field> when <v1> then <opt1> when <v2> then <opt2> else <opt3> end
distinct 查询结果去重 select distinct <field1>,<field2> from <tableName>
联合去重
distinct 只能在所有查询字段最前面
union:结果集合并。注意:结果集合并时两个语句的列要相等
limit:将查询结果一部分取出来,分页查询 limit<n> 取查询结果的前n个 limit <start>,<len> 取start(0开始)开始的n个
笛卡儿积:表连接查询是没加条件查询的结果条数是所有表的积。避免:加条件查询。
create table <tableName> as <opt>
将opt的查询结果新建应该tableName表
unique约束字段自动添加索引