Mysql 总结
一、理解几个概念
sql、DB、DBMS分别是什么?
DB:DataBase:(数据库,数据库实际上在硬盘上以文件的形式存在)
DBMS: DataBase Management System(数据库管理系统,常见的有:MySQL Oracle DB2 Sybase SqlServer...)
SQL: 结构化查询语言,是一门标准通用的语言。标准的sql适合于所有的数据库产品。SQL语句在执行的时候,实际上内部也会先进行编译,然后再执行sql。(sql语句的编译由DBMS完成。)
DBMS负责执行sql语句,通过执行sql语句来操作DB当中的数据。
二、sql语句的分类
主要分为五大类:
DQL(数据查询语言,Data Query Language): 查询语句,凡是select语句都是DQL。
DML(数据操作语言,Data Manipulation Language):insert delete update,对表当中的数据进行增删改。
DDL(数据定义语言,Data Definition Language):create drop alter,对表结构的增删改。
TCL(事务控制语言,Transaction Control Language):commit提交事务,rollback回滚事务。
DCL(数据控制语言,Data Control Language): grant授权、revoke撤销权限等。
三、常用命令
注意:此处的命令属于mysql(数据库管理系统)的语法范畴
删除数据库:drop database 数据库名;
查看表结构:desc 表名;
查看当前使用的是哪个数据库:select database();
查看mysql的版本号:select version();
结束一条命令语句:\c 命令 或者 “;” 分号
查看创建表的语句:show create table 表名;
退出mysql:exit 命令
四、常用的sql语句
注意 :1、任何一条sql语句以“;”结尾。
2、sql语句不区分大小写。
查询语句(DQL)
1.select 字段名1,字段名2,字段名3,.... from 表名;
2.查询所有字段:select * from 表名;(实际开发中不建议使用*,效率较低)
3. 给查询结果的列重命名(as是关键字,也可省略):select 字段1,字段2 as 自定义名字 from 表名;
注:(别名中有中文的话,用单引号括起来,双引号mysql可以用,但是其他DBMS不可以,为了可移植性)
4. 条件查询:select 字段,字段... from 表名 where 条件; (执行顺序:先from,然后where,最后select)
5.排序:select (字段) from 表名order by 表中的列名 (+asc升序 desc降序);(数字和英文都可排序,默认是升序)
分组函数(多行处理函数):
注意:所有的分组函数都是对“某一组”数据进行操作的
多行处理函数的特点:输入多行,最终输出的结果是1行,自动忽略NULL
count 计数
sum 求和
avg 平均值
max 最大值
min 最小值
count(*)和count(具体的某个字段),他们有什么区别?
count(*):不是统计某个字段中数据的个数,而是统计总记录条数。(和某个字段无关)
count(字段1): 表示统计(字段1)字段中不为NULL的数据总数量。
重点:所有数据库都是这样规定的,只要有NULL参与的运算结果一定是NULL。
ifnull() 空处理函数:
ifnull(可能为NULL的数据,被当做什么处理) : 属于单行处理函数。
例:select name,ifnull(id,0) from user;
此条select语句中的ifnull中的0代表,如果某行数据的id为null,就赋值0
group by 和 having:
group by : 按照某个字段或者某些字段进行分组。
having : having是对分组之后的数据进行再次过滤
注意:·分组函数一般都会和group by联合使用,这也是为什么它被称为分组函数的原因。
·并且任何一个分组函数(count sum avg max min)都是在group by语句执行结束之后才会执行的。
·当一条sql语句没有group by的话,整张表的数据会自成一组。
·记住一个规则:当一条语句中有group by的话,select后面只能跟分组函数和参与分组的字段。
一个完整的DQL语句怎么写?
关键字 执行顺序
select 5
..
from 1
..
where 2
..
group by 3
..
having 4
..
order by 6
去重distinct :
distinct只能出现在所有字段的最前面例如:
mysql> select distinct job from emp; // distinct关键字去除重复记录。
五、
增删改查有一个术语:CRUD操作
Create(增) Retrieve(检索) Update(修改) Delete(删除)
连接查询的分类(需要用到关键字join…on…):
注意:
....
A
join
B
join
C
on
...
表示:A表和B表先进行表连接,连接之后A表继续和C表进行连接。
根据表的连接方式来划分,包括:
内连接:(两张表是平等的)
·等值连接
·非等值连接
·自连接
外连接:(表之间有主副之分,当副表中的数据没有和主表中的数据匹配上,副表自动模拟出NULL与之匹配。外连接最重要的特点是:主表的数据无条件的全部查询出来)
·左外连接(左连接):表示左边的这张表是主表
·右外连接(右连接):表示右边的这张表是主表。
全连接(很少用!)
注意:左连接有右连接的写法,右连接也会有对应的左连接的写法
笛卡尔积现象:
·当两张表进行连接查询的时候,没有任何条件进行限制,最终的查询结果条数是两张表记录条数的乘积。
·怎么避免笛卡尔积现象?当然是加条件进行过滤。
表的别名有什么好处?
·第一:执行效率高。
·第二:可读性好。
子查询:
·select语句当中嵌套select语句,被嵌套的select语句是子查询。
·from后面也可跟select语句,将此select语句查出的结果当做临时表
·例如:select * from 表名1 where 字段1 > (select avg(字段1) from 表名1);
union :
可以将查询结果集相加
同行相加或同列相加,看select语句的结果
加在同列需要字段数量相同
limit(分页查询关键字):
分页查询全靠它了
·limit是mysql特有的,其他数据库中没有,不通用。(Oracle中有一个相同的机制,叫做rownum)
·limit的作用是取结果集中的部分数据
·limit startIndex, length :
startIndex表示起始位置,从0开始,0表示第一条数据。
length表示取几个
·limit是sql语句最后执行的一个环节:
select 5
...
from 1
...
where 2
...
group by 3
...
having 4
...
order by 6
...
limit 7
...;
表的复制:
语法:
create table 表名 as select语句;
将查询结果当做表创建出来。
创建表:
建表语句的语法格式:
create table 表名(
字段名1 数据类型 (约束),
字段名2 数据类型(约束),
字段名3 数据类型(约束),
....
);
insert语句插入数据
语法格式:
·insert into 表名(字段名1,字段名2,字段名3,....) values(值1,值2,值3,....)
·要求:字段的数量和值的数量相同,并且数据类型要对应相同。
·字段可以省略不写(只写一个表名),但是后面的value对数量和顺序都有要求。
·一次插入多条语句的时候,只要将插入的数据用括号括起来然后用逗号间隔即可
·查询语句的查询结果也可以当做数据直接插入到表中
·需要注意的地方:
··当一条insert语句执行成功之后,表格当中必然会多一行记录。
··即使多的这一行记录当中某些字段是NULL,后期也没有办法再执行此条插入语句
i··nsert语句插入数据了,只能使用update进行更新。
删除数据?
·语法格式:delete from 表名 where 条件;
·注意:没有条件全部删除。
·删除大表中的数据(重点):truncate table 表名; // 表被截断,不可回滚。永久丢失。
·删除表:drop table 表名; // 这个通用。
drop table if exists 表名; // oracle不支持这种写法。
修改数据:update
语法格式:
update 表名 set 字段名1=值1,字段名2=值2... where 条件;
注意:没有条件整张表数据全部更新
什么是约束?常见的约束有哪些呢?
在创建表的时候,可以给表的字段添加相应的约束,添加约束的目的是为了保证表中数据的合法性、有效性、完整性。
常见的约束有哪些:
·非空约束(not null):约束的字段不能为NULL
·唯一约束(unique):约束的字段不能重复
·主键约束(primary key):约束的字段既不能为NULL,也不能重复(简称PK)
·外键约束(foreign key):...(简称FK)
·检查约束(check):注意Oracle数据库有check约束,但是mysql没有,目前mysql不支持该约束。