sQL语句有很多,最好进行分门别类,这样更容易记忆-
分为:
DQL:
数据查询语言(凡是带有select关键字的都是查询语句)
select. …
DML:
数据操作语言(凡是对表当中的数据进行增删改的都是DML)
insert delete update
insert 增
delete 删
update 改
这个主要是操作表中的数据data.
DDL:
数据定义语言
凡是带有Create drop alter的都是DDL.
DDL主要操作的是表的结构。不是表中的数据
create: 新建,等同于增
drop:删除
alter:修改
这个增删改和DL不同,这个主要是对表结构进行操作。
TCL:
不是王牌电视-是事务控制语言包括:
事务提交:commit;
事务回滚: rollback ;
DCL:
是数据控制语言-
例如:授权 grant 撒销权限 revoke . . …
select version; 查看数据库版本号
采用 * 方式 这种方式的缺点:
1、效率低
2、可读性差。
在实际开发中不建议,可以自己玩没问题-
你可以在Dos命令窗口中想快速的看一看全表数据可以采用这种方式。
注意:在所有的数据库当中,字符串统一使用单引号括起来,单引号是标准,双引号在oracle数据库中用不了。但是在mysql中可以便用。
再次强调:数据库中的字符串都是采用单引号括起来。这是标准的。双引号不标准-

select
*
from
emp where
sal > 2500 and deptno - 10 or deptno - 20 ;
分析以上语句的问题?
and优先级比or高
以上语句会先执行and,然后执行or
以上这个语句表示什么含义?
not可以取非,主要用在is或in中
is null
is not null
in
not in
单行处理函数的特点:一个输入对应一个输出。
和单行处理函数相对的是:多行处理函数。(多行处理函数特点:多个输入,对应1个输出!)
lower转换小写
upper转换大写
substr取子串
substr(被截取的字符串,起始下标,截取的长度)
length取长度
trim去空格
str _to date将字符串转换成日期
date _format格式化日期
format设置千分位
round四舍五入
rand()生成随机数
ifnull可以将null转换成一个具体值
concat 的数进行字符串的拼接

分组函数(多行处理函数>
多行处理函数的特点:输入多行,最终输出一行-
5个:
count计数sum求和avg平均值max最大值min最小值
注意:
分组函数在使用的时候必须先进行分组,然后才能用。
如果你没有对薮据进行分组,整张表默认为一组。

count(具体字段):表示统计该字段下所有不为NULL的元素的总数。
count(*):统计表当中的总行数。(只要有一行数据count则++)




为什么分组函数不能直接使用在where后面?
select ename ,sal from emp where sal > min(sal);l//报错。
因为分组函数在使用的时候必须先分组之后才能使用
where执行的时候,还没有分组。所以where后面不能出现分组函数。
select sum (sal)from emp ;
这个没有分组,为啥sun() 函数可以用呢?
因为select在group by之后执行


优化策略: where和having,优先选择where,where实在完成不了了,再选择having



根据语法的年代分类:
sQL.92:1992年的时候出现的语法
sQL.99:1999年的时候出现的语法
我们这里重点学习
sQL99.(这个过程中简单演示一个sQL92的例子)
根据老年接的方式分类:
内连接:
等值连接非等值连接自连接
外连接:
左外连接(左连接)
右外连接(右连接)
全连接

思考:最终查询的结果条数是14条,但是匹配的过程中,匹配的次数减少了吗?
还是56次,只不过进行了四选一。次数没有减少。
注意:通过笛卡尔积现象得出,表的连接次数越多效率越低,尽量避免表的连接次数

sql92的缺点:结构不清晰,表的连接条件,和后期进一步筛选的条件,都放到了where后面.
sql99优点:表连接的条件是独立的,连接之后,如果还需要进一步筛选,再往后继续添加where.



自连接技巧:一张表看作两张表

外连接中产生了主次关系


一条sQL中内连接和外连接可以混合。都可以出现!

3.4、from子句中的子查询
注意:from后面的子查询,可以将子查询的查询结果当做一张临时表。(技巧)





数据类型一致
varchar(最长255)
可变长度的字符串
比较智能,节省空间。
会根据实际的数据长度动态分配空间。
优点:节省空间
缺点:需要动态分配空间,速度慢。
char(最长255)
定长字符串
不管实际的数据长度是多少-
分配固定长度的空间去存储数据。
使用不恰当的时候,可能会导致空间的浪费。
优点:不需要动态分配空间,速度快-
缺点:使用不当可能会导致空间的浪费
varchar和char我们应该怎么选择?
性别字段你选什么?因为性别是固定长度的字符串,所以选择char-姓名字段你选什么?每一个人的名字长度不同,所以选择varchar-
int(最长11)
数字中的整数型。等同于java的int-
bigint
数字中的|长整型。等同于java中的1ong-
float
单精度浮点型教据
double
双精度浮点型数据
date
短日期类型
datetime
长日期类型
clob
字符大对象
最多可以存储4G的字符串-
比如:存储一篇文章,存储一个说明-
超过255个字符的都要采用cLoB字符大对象来存储-charaater Large OBjeat:CLOB
blob
二进制大对象
inary Large OBject
专门用来存储图片、声音、视频等流媒体薮据。
往BLOB类型的字段上插入数据的时候,例如插入一个图片、视频等,你需要使用Io流才行
语法格式:
insert into 表名(字段名1,字段名2,字段名3…) values (值1,值2,值3);
注意:字段名和值要一一对应。什么是一一对应?
数量要对应-数据类型要对应-


date是短旦期:只包括年月日信息
datetime是长日期:包括年月日时分秒信息。

在mysq1当中怎么获取系统当前时间?
now()函数,并且获取的时间带有:时分秒信息!!!是datetime类型的。




大表非常大,上亿条记录?? ? r
删除的时候,使用delete,也许需要执行1个小时才能删除完!效率较低。
可以选择使用truncate删除表中的数据。只需要不到1秒钟的时间就删除结束。效率较高.但是使用truncate之前,必须仔细询问客户是否真的要删除,并警告删除之后不可恢复!




什么时候使用表级约束呢?
需要给多个字段联合起来添加某一个约束的时候,需要使用表级约束。
在mysql当中,如果一个字段同时被not null和unique约束的话,该字段自动变成主键字段-(注意:oracle中不一样!)
主键约束的相关术语?
主健纳束:就是一种约束-
主键字段:该字段上添加了主键约束,这样的字段叫做:主键字段主键值:主键字段中的每一个值都叫做:主键值-
什么是主键?有啥用?
主健值是每一行记录的唯一标识-主键值是每一行记录的身份证号!! !
记住:任何一张表都应该有主键,没有主键,表无效!!
主键的特征: not null + unique(主键值不能是NUI,同时也不能重复!)

在实际开发中不建议使用:复合主键。建议使用单一主键!

主键除了:单一主键和复合主键之外,还可以这样进行分类?
自然主键:主键值是一个自然数,和业务没关系-
业务主键:主健值和业务紧密关联,例如拿银行卡账号做主键值。这就是业务主键!在实际开发中使用业务主键多,还是使用自然主键多一些?
自然主键使用比较多,因为主键只要做到不重复就行,不需要有意义。业务主键不好,因为主键一旦和业务挂钩,那么当业务发生变动的时候,可能会影响到主键值,所以业务主健不建议使用。尽量使用自然主键。


在建表的时候可以在最后小括号的")"的右边使用:
ENGINE来指定存储引擎-
CHARSET来指定这张表的字符编码方式。
结论:
mysql默认的存储引擎是:InnoDB
mysq1默认的字符编码方式是:utf8

mysql支持九大存储引擎,当前5.5.36支持8个。版本不同支持情况不同。
MyISAM存储引擎?
它管理的老具有以下特征:
使用三个文件表示每个表:
格式文件―存储表结构的定义(mytable.frm)
数据文件一存储表行的内容(mytable.MYD )
索引文件–存储表上索引(mytable.MYI):索引是一本书的目录,缩小扫描范围,提高查询效率
可被转换为压缩、只读表来节省空间
提示一下:
对于一张表来说,只要是主键,
或者加有unique约束的字段上会自动创建索引-
MyISAM存储引擎特点:
可被转换为压缩、只读表来节省空间
这是这种存储引擎的优势!i !!
MyISAM不支持事务,安全性低

表空间存储 + 索引

一个事务其实就是一个完整的业务逻辑。是一个最小的工作单元。不可再分。

假设所有的业务,只要一条DML语句就能完成,还有必要存在事务机制吗?
正是因为做某件事的时候,需要多条DM,语句共同联合起来才能完成,所以需要事务的存在。如果任何一件复杂的事儿都能一条DM语句搞定,那么事务则没有存在的价值了-
到底什么是事务呢?
说到底,说到本质上,一个事务其实就是多条DML语句同时成功,或者同时失败!
事务:就是批量的DML语句同时成功,或者同时失败!






什么是索引?
索引是在数据库表的字段上添加的,是为了提高查询效率存在的一种机制。
一张表的一个字段可以添加一个索引,当然,多个字段联合起来也可以添加索引。索引相当于一本书的目录,是为了缩小扫描范围而存在的一种机制。

MysQL在查询方面主要就是两种方式:
第一种方式:全表扫播
第二种方式:根据索引检索-
注意:
在实际中,汉语字典前面的目录是排序的,按照a b a d e f…排序,为什么排序呢?因为只有排序了才会有区间查找这一说!(缩小扫描范围其实就是扫播某个区间罢了!
在mysql数据库当中索引也是需要排序的,并且这个所以的排序和Treeset数据结构相同。Treeset (TreeMap)底层是一个自平衡的二叉树!在mysql当中索引是一个B一Tree数据结构-
遵循左小又大原则存放。采用中序遍历方式遍历取数据-
提醒1:在任何数据库当中主键上都会自动添加索引对象,id字段上自动有索引,因为id是PK。另外在mysqi当中,一个字段上如果有unique约束的话,也会自动创建索引对象
提醒2:在任何数据库当中,任何一张表的任何一条记录在硬盘存储上都有一个硬盘的物理存储编号
提醒3:在mysql当中,索引是一个单独的对象,不同的存储引擎以不同的形式存在,在MyISAM存储引擎中,索引存储在一个.MYI文件中。在InnoDB存储引擎中索引存储在一个逻辑名称叫做tablespace的当中。在MEMORY存储引擎当中索引被存储在内存当中。不管索引存储在哪里,索引在mysql当中都是一个树的形式存在-自平衡二叉树:-Tree)

在mysql当中,主键上,以及unique字段上都会自动添加索引的!!! !什么条件下,我们会考虑给字段添加索引呢?
条件1:数据量庞大(到底有多么庞大算庞大,这个需要测试,因为每一个硬件环境不同)
条件2:该字段经常出现在where的后面,以条件的形式存在,也就是说这个字段总是被扫描。
条件3:该字段很少的DML(insert delete update)操作。(因为DM之后,索引需要重新排序。
建议不要随意添加索引,因为索引也是需要维护的,太多的话反而会降低系统的性能。建议通过主键查询,建议通过unique约束的字段进行查询,效率是比较高的。










我们以后面向视图开发的时候,使用视图的时候可以像使用table一样。可以对视图进行增删改查等操作。视图不是在内存当中,视图对象也是存储在硬盘上的,不会消失。
再提醒一下:
视图对应的语句只能是DQL语句。
但是视图对象创建完成之后,可以对视图进行增删改查等操作。
小插曲:
增删改查,又叫做: CRUD.
CRUD是在公司中程序员之间沟通的术语。一般我们很少说增删改查。一般都说cRUD -
c:create (增)
R : Retrive(查:检索)U : Update (改)
D : Delete (删)

4.2、数据库设计范式共有?
3个
第一范式:要求任何一张表必须有主键,没一个字段原子性不可再分。
第二范式:建立在第一范式的基础之上,要求所有非主键字段完全依赖主键;不要产生部分依赖。
第三范式:建立在第二范式的基础之上,要求所有非主键字段直接依赖主键;不要产生传递依赖。
设计数据库表的时候,按照以上的范式进行,可以避免表中数据的冗余,空间的浪费。



背口诀:
多对多怎么设计?
多对多,三张表]关系表两个外键!!! ! ! ! ! !!! ! ! !


背口诀:
一对多,两张表,多的表加外铀!! i 1!! ! ! !! ! !


数据库设计三范式是理论上的。实践和理论有的时候有偏差。
最终的目的都是为了满足客户的需求,有的时候会拿冗余换执行速度。
因为在sql当中,表和表之间连接次数越多,效率越低。(笛卡尔积)
有的时候可能会存在冗余,但是为了减少表的连接次数,这样做也是合理的,并且对于开发人员来说,sql语句的编写难度也会降低。