数据库学习
数据库操作:
创建
Create database 数据库名;查看所有数据库
Show databases;查看指定数据库建表语句及字符集
Show create database 数据库名;删除数据库
Drop database 数据库名修改数据库字符集-了解
Alter database 数据库名 character set 字符集;切换数据库
Use 数据库名;查看当前数据库名称
Select database();Modify – 字段的类型以及约束
Change – 修改的列名称
Rename – 表名数据表创建
Create table 表名(
字段名称 字段类型(长度),
字段名称 字段类型(长度),
……
字段名称 字段类型(长度)
);//创建有约束的表
Create table 表名(
字段名称 字段类型(长度) 约束,
字段名称 字段类型(长度) 约束,
….
字段名称 字段类型(长度) 约束
);约束
主键约束 primary key(一般配合 auto_increment 自增长一起使用)
唯一约束 unique
非空约束 not null查看表
Show tables 查看所有的表
Desc 表名 查看表结构
Show create table 表名 查看表的创建修改表的语句
Alter table 表名 增/删/改 字段 类型 约束;
增 – add
删 drop
改 modify – 修改字段类型
Change – 修改字段名称
Rename table 表名 to 新表名;
删除表
Drop table 表名;
在mysql中,使用单引号表示字符串。总结:
1)如果主键:是自增长。不需要人工赋值(可以给值null)。数据库会按照自己的算法,为主键填充值。
2)通常遇到主键自增长,人工赋值的时候,赋值null。mysql会自己把null替换成新的值。数据的插入:
两种方式 – 根据列名插入对应的值
直接插入所有的列 - 将列名省略掉;如果要删除一张表中的所有数据,也可以使用 truncate table 表名;
执行时会把表的所有内容都删除掉,然后在创建一个新的表。
truncate 缺点:不能有条件的删除。不能恢复数据
delete 是逐行删除,并没有恢复初始化值。 可以恢复数据DDL (数据定义语言)
数据定义语言 - Data Definition Language
用来定义数据库的对象,如数据表
create drop alter truncate(清空数据记录)等
DML (数据操纵语言)★★★ – 增删改
数据处理语言 - Data Manipulation Language
在数据库表中更新,增加和删除记录
如 update(更新), insert(插入), delete(删除) 不包含查询
DCL (数据控制语言)
数据控制语言 – Data Control Language
指用于设置用户权限和控制事务语句
如grant(设置权限),revoke(撤销权限),
TCL(数据操纵语言)(事务) begin transaction等
开发自然形成
DQL (数据查询语言)(★★★★★) - 查询
数据查询语言 – Data Query Language
数据表记录的查询。
select。。。S(select)… 查询
F(from)… 从哪个表中
W(where)… 关联一些条件
G(group by)… 分组查询
H(having)… 关联一些条件(还可以关联聚合函数)
O(order by); 排序 asc升序 desc 降序
S(select) 查询的字段 F(from) tablename W(where) 关联条件 G(group by) 分组的字段 H(having) 关联条件(聚合函数)O(order by) (asc desc);因为having是从筛选出来的字段再筛选,而where是从数据表中的字段直接进行的筛选的。
where 后面的条件可以写在having 中,但是 having中的条件不一定能写在where中。
having 可以书写聚合函数 (聚合函数出现的位置: having 之后)
例如having中的 聚合函数(count,sum,avg,max,min),是不可以出现where条件中。
where 是在分组之前进行过滤的。having 是在分组之后进行过滤的。Count(字段) 作用 统计个数
Sum(字段) 作用 求和运算
Avg(字段) 作用 求平均值
Max(字段) 作用 求最大值
Min(字段) 作用 求最小值
Group by 作用 分组查询
Having 作用 关联条件 与where一样 只是支持聚合函数的使用!!!
查询关键字的出现的顺序是固定的select …要显示的内容.. from …表名.. where 条件…. group by …分组的列 …having …分组后的条件… order by …排序
select …5… from …1.. where …2.. group by ..3…having ..4… order by .6.
查询的执行顺序:
1)from : 表名
2)where:条件过滤
3)group by : 分组
4)having : 分组之后进行过滤。
5)select :执行完毕之后,显示内容。
6)order by : 根据查询的内容进行排序输出.from 表名
where 条件:
逻辑运算符:and or not 比较运算符:> < >= <= <=""> = != 在....之间:between...and in(): 只要在in(值1,值2...)满足任意一个值就可以 类似java switch 模糊匹配:like %任意个 _一个字符
is null/is not null
group by 列:对列进行分组。
having 条件:逻辑运算符:and or not 比较运算符:< > <=>= <> = 在....之间:between...and... in(set) is null/is not null 模糊匹配:like % _
Having 后 可以跟聚合函数 不使用聚合函数用where
聚合函数(sum,avg,max,min,count)
Where跟的条件 having都可以 而且 having还可以跟 聚合函数 where不可以 having单独使用的时候的条件在查询中的字段必须包含!!!order by desc(降序)/asc(升序,默认)
外键约束的作用 – 保证数据的完整性 合理性!!!
ALTER TABLE coder_project DROP FOREIGN KEY coder_project_ibfk_1;
ALTER TABLE coder_project DROP FOREIGN KEY coder_project_ibfk_2;
alter table coder_project add foreign key(coder_id) references coder(id);- 字符类型 sql 中没有 字符与字符串的区别;varchar(列的长度):列的长度可变;name * varchar(10):设置name字段的长度为10,name的储存长度在10以内都可以,并且会自动适应长短。补充:保存字符个数:0-255;
- char(列的长度):列的长度固定,不能改变;
name char(10):设置name字段的长度为10,name的存储长度在10以内,如果不满10,用空格补足。
举例:假设我们要存储 abcd 这个字符串。
如果定义成varchar(10) 这时储存的数据不足10个,这时会把多余取消,只占4个。
如果使用char(10),它会把存储的数据添加到10个长度。剩下的用空格补足。
如果存储的长度超出了表中列的长度,存储报错。
总结:char 的性能好。 varchar可以节省空间。
通常的情况,如果长度不固定,我们使用varchar。
使用char的情况。当某个字段的长度固定的时候,可以采用char。例如身份证号或者手机号。大数据类型–了解
BLOB-字节:存放二进制内容,即字节数据。一般可以存放视频、音频、图片等。
TEXT:保存字符数据,存放大文本。存放可以超过255个字符。
通常我们不会把文件存储到数据库。(占用资源,操作速度慢)
我们会把文件的路径(通常存放在本地磁盘)存到数据库中。数值型
整形:TINYINT 、SMALLINT、INT、BIGINT
小数:FLOAT(单精度)、DOUBLE(双精度)
位数据类型 (逻辑性)–了解 就是java中的boolean
BIT: 1 或者0组成的数据。1 表示true;0表示false
日期型
■ DATE:日期----只有日期, 2013年08月19日 ■ Time:时间-----时分秒,12时24分30秒 ■ DateTime:日期和时间都包含,年月日时分秒 ■ TIMESTAMP :日期和时间都包含 ------->当表中其他数据被修改的时候,那么此时时间就会自动更改为更改数据时的时间。
举例:
id name updatetime
1 lisi 12时24分30秒如果修改name的值为zhangsan,此时时间是: 12时25分00秒.
修改完成之后,updatetime的值就会变为12时25分00秒.
字符串 – varchar char
整数 int
浮点 float double
日期 date time DateTime timestampsubstring(str,num1,num2):
mysql数据库中操作字符串的自带函数,下标从1开始。第一个数字2表示从要截取的字符串中的第二个字符开始截取。第二个数字1表示要截取的个数是1个字符。
事务:指的是逻辑上的一组操作(sql语句),组成这组操作的各个逻辑单元(sql),要么全都成功,要么全都失败。
不可重复读 – 一个事务读到了另一个事务已经提交的update的数据,导致两次查询的结果不一致虚读/幻读 – 一个事务读到了另一个事务已经提交的insert/delete的数据,导致两次查询的结果不一致
虚读和不可重复读的区别:
虚读 强调的是数据表 记录数 的变化,主要是 insert 和 delete 语句。
不可重复读 强调的是数据表 内容 的变化,主要是 update 语句。PreparedStatement
执行SQL.对SQL进行预处理。解决SQL注入漏洞。
rollback()和commit()都会释放持有的数据库锁;sql注入:
SELECT from user WHERE username=’bbb’ OR 1=’1’ AND PASSWORD=’345’;
SELECT FROM user WHERE username=’ccc’ – AND PASSWORD=’345’;
要解决SQL注入就不能让用户输入的密码和我们的SQL语句进行简单的字符串拼接。
PreparedStatement尽最大可能提高性能;使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系.就解决了这个问题.