mysql
mysql (开发)
报错
因为之前安装过mysql,没卸干净,因为不知道什么原因一直报错,现在说一下解决方法
首先删除mysql服务 sc delect mysql (可以先查询一下sc query mysql)
然后在安装时的mysqld -install 执行之后查看任务管理器的服务,找到mysql
右键查看详细信息,找到mysqld查看属性,看看是不是你新安装的mysql路径
不是的话先设置环境变量,然后重启即可
安装
zip包, 创建my.ini
[mysqld]
basedir=路径
datadir=路径\data\
port = 3306
skip-grant-tables
管理员启动cmd,mysqld -install
mysqld --initialize-insecure --user=mysql
初始化
net start mysql
启动服务
mysql -u 用户名 -p
默认密码为空
update mysql.user set authentication_string=password('123456') where user='root' and Host='localhost';
flush privileges
刷新权限
修改my.ini 删除 skip-grant-tables
net stop mysql
net start mysql
基本操作
--
注释后面的语句 /**/多行注释
create database if not exists asd
drop database if exists asd
列类型
tinyint 1字节
smallint 2
mediumint 3
int 4
bigint 8
float 4
double 8
decimal
char 0-255
varchar 0-65535
tinytext
text
data YYY-MM-DD
TIME HH: MM:SS
datatime
timestamp 时间戳
year
字段属性
unsigned
无符号整数
zerofill
使用0填充
自增
auto increment
语法
create table if not exists `student`(
`id` int(4) not null auto_increment comment '学号',
`name` varchar(30) not null default '匿名' comment '姓名',
`pwd` varchar(30) not null default '123' comment '密码',
`name` varchar(30) not null default '匿名' comment '姓名',
primary key(`id`)
)engine=innodb default charset=utf8
show create database 名称
show create table 名称
desc table
在物理空间中的存储位置
InnoDB 在数据库表中只有一个*.frm文件,以及上级目录下的ibdata1文件
MYISAM对应文件
*.frm 表结构的定义文件
*.MYD 数据文件
*.MYI 索引文件
字符集编码
charset=utf-8 默认为latin1
修改
alter table 旧表名 rename as 新表名
alter table add age int(11)
alter table modify age varchar(11) //修改约束
alter table change age age1 int(1) //重命名
alter table drop age1
数据管理
外键 (最好不用)
create table if not exists `student`(
`id` int(4) not null auto_increment comment '学号',
`name` varchar(30) not null default '匿名' comment '姓名',
`pwd` varchar(30) not null default '123' comment '密码',
`name` varchar(30) not null default '匿名' comment '姓名',
`gradeid` int(10) not null comment '年级'
primary key(`id`)
key `FK_gradeid` (`gradeid`),
constraint `FK_gradeid` foreign key (`gradeid`) references `grade` (`gradeid`)
)engine=innodb default charset=utf8
constraint FK_gradeid
foreign key (gradeid
) references grade
(gradeid
)
约束名 外键 引用表
先删除有外键的表,再删除被引用的表
添加
insert into 表名(字段,字段) values (‘值’,’值2’),(),()
修改
update 表名 set 字段=’值’ where id=1;
set 字段=‘值’,字段=”值” where name=’’ and id=’’
<>或!= | ||
---|---|---|
between … and .. | ///where id between 2 and 5 | |
and | ||
or |
删除
delect from student –不影响自增
truncate table test – 自增归零
InnoDB 自增列会重1开始(内存当中的,断电即失)
MyISAM 继续从上一个自增量开始(存在在文件中)
查询
select * from student
select id as a,name as b from student as c (别名)
select concat(‘姓名:’,name) as d from student
select distinct id from result; 去除重复的id
where的条件字句
% 匹配0或多个 _匹配一个
select id,name from student where name like ‘刘%’
select id,name from student where id in (100,101,102)
联表查询
join on 条件
select b.id,b.name from teacher as a left join feifei as b on a.id=b.id;
有重复字段名要设置别名
left join | 返回左边表那么多行的数据,没有也要返回NULL,有则被截断 | |
---|---|---|
right join | 返回右边表那么多行的数据,没有也要返回NULL,有则被截断 | |
inner join | ||
分页查询
select id from student where name = ‘123’ order by id desc (降序)
select id from student where name = ‘123’ order by id asc (升序)
order by 字段 按什么排序
limit 0,5 (下标0开始,5个数)
子查询
select id from student where id=(select id from result where name='asd')
函数
感觉sql注入用不上,就算了
事务 ACID原则
要么都成功,要么都失败
数据不会丢失,数据完整性保持一致
事务一旦提交则不可逆,被持久化到数据库中
不被其他人的操作所影响,所以事务之间要相互隔离
脏读
一个事务读取了另外一个事务未提交的数据
不可重复读
多次读取,结果不同(不一定是错误,知识某些场合不对)
幻读
一个事务内读到了别的事务插入的数据,导致前后读取不一致
索引
primary key 主键索引
unique key 唯一索引
key /index 常规索引
FullText 全文索引
用户
create user zero identified by '123456'
set password = password('123456')
set password for zero = password('123456')
rename user zero to zeropeach
grant all on *.* to zero
show grants for zero
revoke all on *.* from zero
备份
拷贝物理文件
mysqldump
mysqldump -h 主机 -u 用户名 -p 数据库 表名 > 位置
然后输入密码
mysqldump -h localhost -u root -p test teacher > 1.sql
也可以连远程
导入
source 1.sql
三大范式
每一列不可再分
每张表只描述一件事情
每一列数据都与主键直接相关,而不能间接相关
jdbc
jdbc:mysql://localhost:3306/数据库名
package basic.mysql;
import java.sql.*;
public class jdbcfirst {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/con?useSSL=true";
String user = "root";
String password = "root";
Connection connection = DriverManager.getConnection(url, user, password);
Statement statement = connection.createStatement();
String sql = "select id from student";
ResultSet resultSet = statement.executeQuery(sql);
while(resultSet.next()){
System.out.println("id"+resultSet.getObject("id"));
}
resultSet.close();
statement.close();
connection.close();
}
}
对象
statement 执行sql对象
statement.executeQuery()
//获取指定数据类型
ResultSet.getObject()
ResultSet.getString()
ResultSet.getInt()
ResultSet.getFloat()
ResultSet.getDate()
resultSet.beforeFirst() 最前面
afterLast() 最后面
next() //下一个数据
previous() //前一行
absolute(row) //指定行
resultSet.close()
statement.close()
connection.close()
statement对象
statement.executeQuery (查询)
statement.executeUpdate (增删改)
preparestatement对象
String sql = "insert test values(?,?,?,?,?)"
st = conn.prepareStatement(sql); //预编译,不执行
st.setInt(1,4);
st.setString(2,"asd");
st.setString(第几个,值)
使用preparestatement会把传入的数据当成字符,能够防止sql注入
连接池
dbcp
c3p0
都是Datasource 数据源