1.客户端和数据库操作
1.登录客户端界面:mysql -uroot -p
2.查看当前的数据库版本:select version();
3.显示所有数据库:show databases;,
4.创建数据库:create [IF NOT EXISTS] database 库名 character set 字符集编码 collate 排序规则;
5.选择数据库:use 库名;
6.查看当前选择了哪个数据库:select database();
7.删除数据库:drop [IF EXISTS] database 库名; #非常危险
8.查看警告:show warnings;
9.退出:quite/exit
2.表操作
1.查看当前数据库有哪些数据表:show tables;
2.创建表:create table 表名(列名/字段名 数据类型,....);
3.查看表结构:desc 表名;
4.删除表:drop 表名;#非常危险
3.CRUD增删查改
3.1新增
语法:insert into 表名 (列名,...)values (值,...);
注释:指定了多少列名,后面的values的值就得一一对应
不指定列名,值的顺序就必须与表中列的数据相同!
3.2查询操作
a.全列查询:select * from 表名;//不加限制条件就会把所有的数据查询出来,磁盘开销会很大!
b.指定列查询:select 指定列,... from 表名;//推荐使用
c.表达式查询:select 表达式 from 表名;
d.别名查询:select 列名/表达式 as '别名' from 表名;
e.去重查询:select distinct 列名,... from 表名;#如果列名指定多个,则指定列的对应行数据必须完全相同才会去重!
f.排序**:select 列名,... from 表名 order by 列名 asc|desc; #asc是升序,desc是降序**
g.条件查询:select 列名,... from 表名 where 列名/表达式 比较运算符/逻辑运算符 order by 列名 asc|desc;
h.区间查询:select 列名,... from 表名 where 列名 between 开始条件 and 结束条件;
i.模糊查询:select 列名,... from 表名 where 列名 like '%值_'; #(%)匹配字符长度,(_)匹配单个字符
j. 分页查询:
①select * from 表名 where 条件 order by 列名 asc|desc limit num; #查询num条数据
②select * from 表名 where 条件 order by 列名 asc|desc limit start,num; #从第start条开始到num条结束
③select * from 表名 where 条件 order by 列名 asc|desc limit num offset start; #从第start条开始到num条结束
注释:start=(当前页数-1)* ( 当前页查询的条数)
3.3更新
update 表名 set 列名 =值 where 条件 order by ... limit num;****#如果不指定列名和limit数量,就会更新表中的所有数据!
3.4删除
delete from 表名 where 条件 order by ... limit num; #如果不指定列名和limit数量,就会把表中的数据全部删除!
4.数据库约束
1.非空约束:NOT NULL 标记一个字段是否可以为空,指定了这个约束,该字段就不能为空(NULL)
2.唯一约束:UNIQUE 标记一个字段的内容在当前列中不唯一,不能重复,但是也不能为null
3.主键约束:PRIMARY KEY 非空且唯一 ,约束方式相当于:NOT NULL+UNIQUE
主键一般与auto_increment(自增)使用!
4.默认方式:DEFAULT 当一个字段没有指定值时(为NULL),不指定列的值时,就用默认值去填充该字段。
注释:若指定了默认值,但是我们手动输入null值,还显示的是null,并非指定默认值!是因为手动输入值的优先级大于默认值!
5.外键约束:FOREIGN KEY 一个表中的字段与另一个表中的主键建立关系,对当前表的数据增删查改是数据库会自动给我们检验!
5.表的设计
1.第一范式:要求表中的每一个列不可再分
2.第二范式:在第一范式基础上,消除部分函数依赖,只存在在有复合主键的表中!
不满足第二范式的影响:数据冗余,更新异常,删除异常,新增异常!
3.第三范式:在第一,二范式基础上,消除传递依赖
6.关系模型
1.一对一
2.一对多
3.多对多
7.聚合函数
1.COUNT(列|*); 统计结果的条数
2.SUM(列); 求和
3.AVG(列); 求平均值
4.MAX(列);求最大值
5.MIN(列);求最小值
8.GROUP BY分组查询
语法:select 分组列,聚合函数 from 表名 group by 分组列 order by 列名;
HAVING 子句
对group by的结果进行条件过过滤
9.联合查询
9.1内连接
select * from 表名1,表名2 where 表名1.xxx=表名2.xxx(连接条件);
select * from 表名1 join 表名2 on 表名1.xxx=表名2.xxx(连接条件);
select * from 表名1 inner join 表名2 on 表名1.xxx=表名2.xxx(连接条件);
表连接的执行过程:
1.先计算参与表连接的笛卡尔积
2.通过连接条件进行过滤错误信息
3.加入查询条件
4.精减列名
9.2外连接,左外连接,右外连接
select * from 表名1 left join 表名2 on 表名1.xxx=表名2.xxx(连接条件);
select * from 表名1 right join 表名2 on 表名1.xxx=表名2.xxx(连接条件);
左外连接以左表为基准,左边的表中所有的数据全部显示,右表中没有对应的数据用NULL值填充
右外连接以右表为基准,右边的表中所有的数据全部显示,左表中没有对应的数据用NULL值填充
9.3自连接
select * from 表名 别名1,表名 别名2 where 别名1.xxx=别名2.xxx(连接条件);
把行转换成列,在查询的时候可以使用where语句条件进行过滤,实现行与行之间比较
9.4子查询
单行子查询:select * from 表名1 where 指定列=(select 指定列 from 表名2 where 条件);
多行子查询:select * from 表名1 where 指定列 IN (select 指定列 from 表名2 where 条件);
内层查询的结果作为外层的过滤条件,把多条语句合并为一句
子查询可以无限嵌套,层数过多会影响效率
9.5合并查询
select * form 表名1 union(union all )select * from 表名2;
union去重,union all不去重
作用是把两个结果集中合并成一个返回
注意:合并查询时多个查询的查询列表必须匹配!
SQL语句的执行顺序
FROM --> JOIN ON --> WHERE --> GROUP BY --> HAVING --> SELECT --> DISTINCT --> ORDER BY --> ORDER BY --> LIMIT