一,DDL语句
DDL -- 数据库定义语句
1,建库
语句: Create DataBase 数据库名字;
数据库名字由字母、数字、_、#符号组成。
注意:把字符编码集设置为“utf8”;这很重要,否则会存在中文乱码的问题。
2,使用数据库
语句:USE 数据库名字;
3,删库
语句:DROP DATABASE 数据库名字;
4,创建表
4.1数据类型
整型 Java tinyint byte boolean smallint short int int bigint long
浮点类型 float float double double decimal BigDecimal
字符串 char 0-255 String varchar 更大 String
二进制大对象 BLOB(Big Large Object) 二进制文件 在没有特别指定需要的安全条件下,一般都把文件存在硬盘指定目录下,然后在数据库当中存放文件路径和名字即可。
日期类型 Date LocalDate TIMESAMP LocalDateTime
4.2建表
语法: create table 表名 ( 列名1 数据类型 [约束], 列名2 数据类型 [约束], ...... );
通常我们仍然是通过数据库的可视化客户端创建表。
表名规范: t_xxxx
列名规范: 主键列 pk_xxxid 普通列 f_xxx 外键列 fk_xxxid
4.3删除表
语法: Drop table 表名;
注意: 在有表关联的情况下,如果这张表的数据在别的表里面充当外键,那么必须先把别的表干掉(或者是把它的外键行删掉),那么才能删掉本张表。
4.4修改表
语法:Alter Table 表名 后面接 增加列: ADD 列名 数据类型 [约束] 修改列: Change 原列名 新列名 数据类型 [约束]; 删除列: Drop Column 列名;同样,通常我们是在可视化客户端完成这些修改。
5,DDL语句的要求
总体来说,DDL语句不是程序员常用的,因为大部分公司都有专门的人或岗位来做,程序员的任务更多的是操作数据库中的数据,完成业务。
6,约束
约束主要分4类: 实体完整性; 域完整性; 引用完整性; 自定义完整性;
7,实体完整性
用于保证一行数据是有效的,也就是行与行是可以相互区分的。
主要手段:
1、主键约束:
Primary Key 效果:被设计为主键的字段(行),自带唯一和非null约束;所以,我们通常都会单独设计一个完全独立的字段用来充当主键。这个主键的值通常会交给数据库,用它自身的算法自动生成。MySQL的自动递增算法是:查询出当前表中的最大ID值,然后+1。 不同的数据库有不同的主键自动增长算法。
2、唯一约束:Unique
8,域完整性
其实就是对列数据的有效性进行约束。
1、Not Null 非空约束
2、Default 默认值
9,引用完整性
其实就是外键约束。
外键本身就是表与表之间的关联关系。外键约束是指:如果设立该约束,数据库会自动检查你插入(修改)的外键是否存在,如果不存在会报插入(修改)失败。同样,删除的时候也会做检查,这个被删除行的主键是否在别的表当中充当外键,如果是,那么不允许删除会报错。
通常在实际开发中,我们不会设计外键约束,而是用自己的代码去控制约束。
注意:如果要用数据库的外键约束,那么数据的引擎必须是“Innodb”。
二,DML 语句
DML -- 数据库操作语句,有三种:增、删、改。
1,增加语句
语法: INSERT INTO 表名 (<列名列表>) VALUES (<值列表>);
这里的列名不是说必须写全,有两种列名可以不写:
1、设计为自动增长的,比如主键列;
2、有默认值的列也可以不写。
值列表必须和列名列表进行一一对应,无论是数目、类型还是顺序。
还有一种情况是可以省略列名的,那就是按数据库表的设计顺序把所有列的所有值都一一对应写在值列表当中。
要求:
必须掌握单条语句的新增;多条语句的新增在不同的数据库中语法不一致。比如:mysql专用:
INSERT INTO t_student VALUES (1,'张三',20,'男'), (2,'李四',25,'男'), (3,'王五',19,'女')
这种在数据库语句中叫做“方言” --- dialect;这种语法并不通用,如果存在把数据库数据迁移到别的数据库中,那么程序中的这种SQL语句是可能会发生错误的。
2,修改语句
语法: update 表名 set 列名1=值1,列名2=值2 where 过滤条件
其中where子句是可选的,如果不写,那么整张表的列1和列2都会被修改为值1和值2。
3,删除语句
语法: delete from 表名 where 过滤条件,同样,如果没有过滤条件,那么整张表的数据都会被删除掉。
另一种:TRUNCATE Table 表名
两者区别: delete 可以带过滤条件; Truncate 不能带过滤条件; delete 在删除的时候书写了数据库内部日志,所以可以被恢复; Truncate 在删除时没有书写日志,不能恢复。
三,DQL 语句
DQL -- 数据库查询语言;
1,简单的查询语句
基本结构: select 列列表 from 表名 where 过滤条件 order by 排序;
在这个简单的语句中一共分为3个操作: 投影操作/选择操作/排序操作
2,投影操作
投影指的就是select出来的列列表
投影操作是select语句中不可选的基本语句,它将选择对物理表中哪些列进行展示,这些列将以我们在select中书写的顺序和名称,出现在结果集当中。
这里要注意:结果集当中的列的顺序和名称是和select当中的投影语句有关系的。
投影的特殊语法:
2.1、表前缀
select 表名.列名 from 表名;
在后期的复杂应用中,from后面可能接多个表名(因为我们可能要求结果集的内容来自于多个表),而这多个表有可能有同名列,那么可以用这种方式指定显示来自于哪个表的这个列。
2.2、别名 select 列名 AS 列别名 from 表名 AS 表别名;
2.3、在投影时能进行一些简单的计算或拼接操作
select 列名 + 10 from 表名;
这条语句的前提是该列能进行数学运算,那么在结果集的显示上该列的数据很比物理表中的数据多显示10。
select CONCAT(f_name,' is ',f_place) as 描述 from t_player;
这条语句把多个列利用MySQL提供的CONCAT函数拼接在一起形成一个列显示在结果集当中;然后我们给它起了一个别名叫做“描述”。
2.4、distinct 显示去重复列
select DISTINCT f_place from t_player;
2.5、limit 分页
limit是mysql当中专用的分页语句,其他数据库不支持。 limit关键字后面接两个数字,中间用“逗号”分隔,第一个数字表示显示的起始行是物理表中的第几行(行号是从0开始的);第二个数字表示一共显示多少行。
在分页应用当中,我们通常会从前端传递两个数据过来:1个是显示第几页(int page);2、每页多少行(int rows); limit (page - 1)*rows, rows;
2.6、select * 代表在结果集当中显示所有列 注意:select * 在实际开发中只能用于测试,在实际代码中必须挨个儿写上列名!!因为select * 会降低SQL语句的执行效率,在所有的开发团队中都是被禁止使用的。
3,选择操作
选择操作就是where子句,用来过滤行的。选择操作虽然写在select投影操作的后面,但是它是先于select执行的。
常见的选择操作符号: 等于 = 不等于 != <> 大于 > 小于 < 大于等于 >= 小于等于 <=
与 and 或 or
在某个范围内 列名 between 下限 and 上限 类似 列名 >= 下限 and 列名 <= 上限
值在罗列中可选 列名 in (可选值1,可选值2, ......)
值不在罗列中可选 列名 not in (值1,值2,.....)
字符串模糊匹配,关键字是 like 。通配符只有两个:1、‘’表示一个任意字符;2、'%'表示任意个字符。 比如: f_name like '%斯基' 只要用斯基结尾 '斯基' 用斯基结尾,但总共只有3个字符 '__斯基' 用斯基结尾,总共有4个字符 '别%' 用‘别’开头的,长度任意 '%连%' 任意位置包含'连'的
判断空 is null 非空 is not null
4,排序操作
排序关键字: order by 后面接上按哪些列进行排序,写在前面的就是第一排序规则,写在后面的就是第二,第三排序规则,依次类推。
排序的方向只有两个: 升序 -- 从小到大 --- asc --- 默认
降序 -- 从大到小 --- desc
5,聚合函数
作用就是用来对表当中的数据进行统计,主要有5个:
COUNT() --- 统计行的数量
SUM() --- 统计某一列的数据之和
AVG() --- 统计某一列的平均值
MAX() --- 某一列的最大值
MIN() --- 某一列的最小值
6,分组
分组使用GROUP BY 子句 基本用法: 它的作用是把表当中的记录,或者是经过where过滤后的记录,用group by后面跟的列的不同数据值分为多个组。 然后再通过投影(select语句),把每个组的信息作为一行进行展示。所以投影的列应该是能够描述整个组的信息的数据。--- 如果有group by 那么 select 后面应该是聚合函数 或 分组相关列。
进阶用法: 1、group by 后面可以接多个列,那么这多个列的值一样的行才会被划分到一组;
2、对分组后的投影还可以进一步进行选择,这个时候使用Having子句。
3、所有这一切做完以后,才能进行order by
四,DCL
Data Control Language 数据控制,用于完成事务等控制性操作