—首先,我们需要安装mysql,参考下面博客,转载: https://blog.csdn.net/clouderpig/article/details/79556149
显示所有已经存在的数据库:show databases;
创建一个新的数据库:create database{数据库名称};
注意:命名规范:大小写不区分,以_作为单词分割。指定数据库编码集:create database{数据库名称} character set = {编码};如果不知道应该选择哪个编码集,可以使用show character set;命令查看
切换到某一数据库操作:use 数据库名称;
删除数据库:dorp database {数据库名称};
修改数据库(编码集):alter database {数据库名} character set={新的编码集}
注意:修改数据库的编码集不代表数据库会自动帮你把内容的编码全部转码。
创建一个表:create table{表名}{列定义…};
> 例:create table people(id int auto_increment(自增) primary key,name varchar(128),sex varchar(2));
primary key:主键——每一个表必须包含一个带有“主键”索引的字段————primary key,其作用是用于唯一标识某一行,配合列名就可以精准指定表中的某一格。注意:被设定为“主键”列的元素不能为空,且不能存在重复的值。
not null:非空约束——如果不希望字段为空值,可以在创建表定义字段的时候加上 not null,如:name varchar(128) not null,那么在插入时该字段必须赋值。如果你希望该字段在不插入的时候有个初始值,那么可以加上:default {默认值}。
AUTO_INCREMENTAL:自增索引——将数值类型的列自动增长,无需人工赋值。如果使用INT类型的主键并自增,那么久是遵循了mysql推荐的用法,并且效率最好。
UNIQUE:唯一索引——当某一字段被该索引限制时,那么该字段不允许存在重复的值。
新增字段:alter table {表名} add column {字段名} {类型};
> 例:alter table people add column age int;
修改字段:alter table {表名} change column {字段名} {字段新名} {类型};
> 例:alter table people change column age p_age varchar(128);
删除字段:alter table {表名} drop column {字段名};
> 例:alter table people drop column p_age;
增:inert into {表名} values ({数据类容…}),({数据类容});
> 例:insert into people values(1,'高原','男');
insert into{表名} select.....
查:select {要查询的列名} from {表名};
> 例:select * from people;
如果没有指定数据库,可以使用数据库.表名来指定表名
改:update {要更改的表名} set {字段名}={新的值} {条件};
> 例:update people set name = '小明' where id = 1;
删: delete from {表名} {条件};
> 例:delete from people where id = 2;
int整数:思考,int(3)代表什么含义?
char(最大长度):定长字符串
varchar(最大长度):变长字符串
float:小数类型
datetime:用于专指日期的字符串,内部结构遵循{年-月-日 时:分:秒}
{原始名}as{新名称}——取完别名后,语句中需使用别名进行操作。
Where
按照字段精准检索:{字段}={值}
按照字段范围检索:{字段}{判断符}{值}
关联条件
OR 或,多个或多个条件只要有一个满足即可检索
And 且,必须满足所有条件才能检索
对于部分需要整体判断的条件可以使用"()"进行包括
分页查询:
> limit {开始},{结束};从第0条开始计数;
交集 in (集合…)
补集 not in (集合…)
一个集合进行任何操作得到的结果还是个集合,所以均可进行上诉操作,表也是个集合
group by{字段},{字段} (按照字段内容进行分组,将内容相同的行全部归结为一行)。分组查询可以和条件查询并存,但是where语句必须在group by前面。如果需要直接进行按条件分组,可以在group by语句加上having进项分组,它和where不同,不是先得到一个结果再分组而是在分组的同时进行条件判断。注意:having专门针对被分组的字段准备的判断句。
查询出的结果只能包含一个小组内存在“共性”的字段。对于不是共性的字段无法直接显示,但是可以进行统计操作…。
统计操作包括以下5种(除了在分组中使用,还能在其他情况使用):
count({字段}):统计行
sum({字段}):求和
avg({字段}):求平均
max({字段}):求最大
min({字段}):求最小
当from后声明了多个表时,则将所有表的字段整合在一起,并将每张表的全部数据进行一一对应的拼接得到结果。对于该结果,可以根据需要进行条件检索。
oreder by{字段名} DESC或ASC 从大到小/从小到大排
From{表名} inner|left|right join{表名} on{对应关系}…
左连接:以关键字左侧表为参照——保留左边所有的数据(left join on)
右连接:以关键字右侧表为参照——保留右边所有的数据(right join on)
内连接:仅对两张表能存在对应关系的数据进行查询。
Distinct 该关键字必须放在select之后字段列表之前,将对查询结果的全部内容进行去重判断,仅当所有字段都一样时才认为是重复。
索引的优势在于对于常用的查询字段加快其查询速度,仅当该字段查询的足够频繁数据量足够大时,优势才明显。
不是任何字段都适合建立索引,因为索引本身也占用空间,当字段内容巨大时,索引占用的空间也很大。同时,加入索引后会降低修改和删除的速度。
推荐:仅对非常常用的字段(且该字段尽量不会被进程修改)建立索引。
创建索引:create index {索引名} on {表名}({要添加索引的字段})…
删除索引:drop index {索引名} on {表名}
查看索引:show index from {表名}
存储过程:相当于SQL中的方法,可以执行某个已经封装好的操作,并且可以动态传参。存储过程持久存在,存在于指定数据库中,同一个数据库中所有存储过程不能同名。
创建一个存储过程:先将语句结束符换为一个与“;”不冲突的符号
> 例如:delimiter{替换符}
接下来就可以声明存储过程了:
create procedure {存储过程名称}({参数列表})
begin
{操作过程,以“;”作为一个操作结束}
end{替换符}
参数列表:IN|OUT|INOUT{参数名}{参数类型},分别代表:输入参数|输出参数|输入/输出参数
操作过程:基本的SQL语句,赋值语句SET{参数}={值},以及基本参数之间的运算
> delimiter //
create procedure select_by_name(in a varchar(128))
begin
select * from students where students.stu_name = a;
select * from scores;
set a = '魏无羡';
end//
delimiter ;
call myadd('江澄');
执行一个存储过程:call {存储过程名}({参数列表})
删除一个存储过程:drop procedure {存储过程名}
查看有哪些存储过程:
> 参看所有存储过程:show procedure status;
> 参看指定名字的存储过程:show procedure status like {过程名};
> 参看存储过程的SQL语句结构:show create procedure {过程名};
在SQL语句中声明一个自定义变量:@{变量名}={变量值},使用该变量时,仅需声明“@{变量名}”即可。
存储过程中声明变量(局部变量):
> declare {变量名} {类型} default {初始值};
声明异常处理:
> declare continue|exit handler for sqlexception|sqlwarring{处理操作};
代表抓住SQL异常或SQL警告,继续或终止后面的操作
输出结果拼接(使用concat(结果1,结果2)):
> SELECT concat("m加到n的和为:",r);
存储过程流程控制(判断)
> BEGIN
if m>0
THEN
SELECT "m大于0";
ELSEif m = 0
THEN
SELECT "m等于0";
ELSE
SELECT "m小于0";
END if;
END //
(循环)
> BEGIN
declare r int default 1;
declare i int default 0;
if m>0 and n>0
THEN
while i
为了确保数据的完整性,能够将若干操作以“事务”的形式执行,令其具备共同的操作结果,常用于关联性较强的操作中,例如需要同时成功的插入、关联表修改、一些关键性的数据更改。
事务的特征:原子性,一致性,隔离性,持久性
在存储过程中执行若干个操作,可以使用事务管理。
> start transaction;
{操作};
{操作};
......
commit|rollback;使上诉操作生效|无效
示例:多个插入要么全成功,要么全失败
delimiter //
create procedure update_version()
begin
declare i int default 1;
declare continue handler for sqlexception set i=0;
start transaction;
insert into prop values(104,'新屠龙宝刀',199,'纯阳');
insert into prop values(102,'麻痹戒指',199,'唐门');
insert into prop values(106,'新大翅膀子',199,'天策');
select concat("插入结果为:",i);
if i=1
then
commit;
else
rollback;
end if;
end//
delimiter ;
call update_version();
示例:上诉功能的另一种实现
delimiter //
create procedure update_version()
begin
declare exit handler for sqlexception rollback;
start transaction;
insert into prop values(104,'新屠龙宝刀',199,'纯阳');
insert into prop values(102,'麻痹戒指',199,'唐门');
insert into prop values(106,'新大翅膀子',199,'天策');
commit;
end//
delimiter ;
call update_version();
创建新账户:
> create user{账户名}@{账户地址限制} IDENTIFIED BY {密码}
账户地址限制:只能在指定地址登录,如果需要约束,则写明准确的IP地址例如‘192.168.4.1’,如果不想进行约束,写上‘%’。
一个账户名下不同的地址被认为是不同的账户。
为账户赋予权限:
> GRANT {权限关键字},{权限关键字} ON {数据库}.{表名} TO {账户名}@{约束地址}
权限关键字:select,delete,update,insert......
查看所有账户:
> select * from mysql.user;
查看账户仅能查看其名称以及地址约束,不能查看更过的信息了。
账户密码一旦设定将无法查看。
删除账户:
> DROP USER {账户名}@{约束地址};
修改账户密码:
> alter user{账户名}@{地址约束} IDENTIFIED BY{新密码};
Java与数据库进行连接有一套专门的API,名为JDBC。Java操作MySQL也要使用JDBC进行操作,其核心为MySQL驱动包:mysql-connector-java-x.xxx.jar。
连接到数据库并执行SQL语句并获得结果
> 1、初始化链接器
Class.forName("com.mysql.jdbc.Driver").newInstance();
2、建立连接
Connection conn = null;
conn = DriverManager.getConnection("jdbc:mysql://{数据库IP地址}:{端口号}/{要连接的数据库}?"+"user={账户名}&password={密码}");
3、使用链接获得会话并执行SQL语句,获得执行结果
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SQL语句");
stmt.execute({通用查询语句});
对于增删改操作,如果想得到该操作的影响行数,可以在执行完execute()方法后调用stmt.getUpdateCount();方法来获取该操作的影响行数。
在执行完stmt.execute()后可以使用stmt.getResultSet()方法得到返回的结果集。
调用本地存储过程:
CallableStatement cs = conn.prepareCall("{存储过程名}({参数列表,以?进行占位})");
cs.setXXX({占位符索引号,从1开始},{替换值});
执行存储过程:cs.execute();
获得输出参数:在执行之后,调用cs.getXXX({输出参数占位符索引,从1开始});
如果一个存储过程中存在多个查询结果,可以使用cs.getMoreResults()切换至下一个结果集,返回一个boolean类型。
如果cs.getMoreResults()返回为true,则可以继续使用cs.getResultSet()方法获得下一个结果集。
解析执行结果:
rs.next():向下移动一行,从第0行开始。
rs.getXXX(列名|列序号,从1开始):获得指定列或指定类型的数据。
注意:默认的编码是ios-8859-1;如果要使用中文的编码集,请指定链接的编码集:{链接URL}?useUnicode = true&characterEncoding = utf8