数据库操作:
1。创建数据库,并修改默认字符编码
create database 数据库名 [charset=字符编码];
ee:
create database dog charset=utf8;
ps:
1.1。如果数据库已经存在,那么会报错。可以通过下面的语句来创建数据库:
create database if not exists 数据库名;
其实就是在创建数据库的时候判断一下是否之前已经存在该数据库了。
1.2。如果想要创建一个用关键字命名的数据库,可以用反引号来创建。反引号的位置在数字1的左边,
一定要在英语半角格式下使用才生效。
ee:
create database `database`;
2。查询数据库
show databases;
ps:
database是复数的,不然会报错。
3。显示数据的创建语句,可以看到编码格式的
show create database 数据库名;
ee:
4。更改数据库
字符编码和数据库引擎
alter database 数据库名 [目标参数]
ee:
alter database dog charset=gbk;
5。删除数据库
drop database 数据库名;
ee:
drop database dog;
ps:
如果删除不存在的数据库会报错,最好是在操作之前先判断一把。
drop database if exists 数据库名;
6。选择数据库
use 数据库名;
ee:
use dog;
数据库表的操作
关系: 行---记录 列---字段
1。创建表
create table 表名(
主键字段 数据类型1 [null/not null] [default] [auto_increment] [primary key],
非主键字段 数据类型2,
...........
);
ps:
主键:非空唯一
数据库中只有字符,没有字符串的概念
用关键字做表名需要加反引号,用关键字做字段名需要加反引号,跟上面用关键字做数据库名做法一致.
数据类型: int /char(定长) /varchar(可变长)/text(大文本)/decimal(总位数,小数点后位数)
ee:
1.1 电话号码---varchar //性别---char //年龄---int/tinyint(max:255) //照片---不用binary,数据中只存储照片的路径
薪水---decimal //QQ---varchar //手机号---char
1.2 姓名---not null // 地址---not null //邮件---null //成绩---null
2。查看表
show tables;
ps:
tables是复数的。
3。查看已创建表(可显示表的详细信息)
show create table 表名 \G
ee:
show create table dog \G
ps:
\G: 表示table字段和create table字段的排列方式变成竖立的形式
未使用\G 时的表的明细截图:(ps:不加";")
从创建数据库到创建表过程截图:
漏了一点,还有就是能知道创建表的名字
4。显示表结构
describe 表名;
或者使用缩写形式的指令查询,效果是一样的:
desc 表名;
ee:
desc dog;
5。删除表
drop table 表名;
可以删除多个表,当有外键关系约束时,要注意删除顺序,先删除包含外键的从表,再删除主表。
drop table 表名1,表名2,...;
ee:
drop table dog;
drop table t1,t2,t3;
ps:
latin 2个字符一个中文
utf8 1个字符一个中文
latin编码环境下输入中文会导致无效值
6。查询字符编码:
show variables like 'character_set_%';
数据操作
1。插入数据(增)
insert into 表名(字段名1,字段名2,......,字段名n) values(值1,值2,......,值n)
或者:(必须插入的值和数据表的字段顺序和个数都一致):
insert into 表名 values(值1,值2,......,值n)
自动增长主键id插入数据:(主键必须设置为null):
insert into 表名(id,字段名2,......,字段名n) values(null,值2,......,值n)
ps:
细节:
1.1。插入的字段可以和数据库中的字段顺序不一致,但是值必须和插入的字段的顺序保持高度一致,否则会报错。
ee:
insert into dog(id,name) values(1,'tom');
1.2。插入字段是可以省略的,插入的值和数据表的字段顺序和个数都一致
ee:
insert into dog values(1,'tom');
1.3。自动增长的主键id,在插入数据时可以id字段用null表示
ee:
insert into dog values(null,'tom');
1.4。插入默认值(字段有指明使用默认值的时候)
ee:
insert into dog values(2,default);
2。删除数据(删)
delete from 表名 where 条件
delete和drop的区别
delete表示将表中的数据全部删除,但是表的字段仍存在。
drop表示表的所有信息全部被删除。
ps:
auto_increment 这个机制,当表中的记录被删除时,自动增长的记录不将再是被删除的记录的id号,
被删除得那条记录可以通过数据库的日志恢复
3。查询数据(查)
select 列名 from 表名 [where 条件] [order by 排序 asc|desc] [limit 分页参数(起始位置,查询的记录数)];
模糊查询:
select 列名 from 表名 where 字段名1 like '%参数%';
ps:
* 表示所有字段
asc 表示升序
desc 表示降序
(默认是按照升序排列)
模糊查询时,模糊部分必须加单引号!!!
limit 的使用细节
ee:
select * from dog limit 3; #限制取前3条记录
select * from dog limit 0,3; #和上面的语句等价
数据库中第一条记录的位置是标记为0.
补充: mysql运算符
比较运算符:>, >=, <, <=, =, <>(不等于)
逻辑运算符:and,or,not
4。修改数据(改)
update 表名 set 字段名1=值1,字段名2=值2,字段名3=值3 where 条件
一些问题:
主键列输入的数值,不允许为空;
一个表不可以有多个主键,但是主键可以由多个列组成;
标识列(自动增长列)不能为字符数据类型(数字自动增长);
聚合函数
sum(),avg(),max(),min(),count()
括号内带参数,参数是数据库表的字段名
查看本机上数据库的位置:
show global variables like "%datadir%";
2019-02-25 13:01:36
数据定义语言(DDL,data definition language) ,操作对象是数据库和表。
修改表的语句,修改的粒度:表名,字段,字符集。
1 修改表的名称(rename to)
alter table 原表名 rename to 新表名;
rename table 原表名 to 新表名;
例: alter table user rename to users;
2 修改表的编码字符集。(character set )
alter table 表名 character set 字符集;
例:alter table users character set gbk;
3 向表中添加新的列。(add)
alter table 表名 add <column> 列名 列的数据类型 [<列的完整性约束>];//column可省略
例: alter table user add `like` varchar(256); //注意字段处的引号
4 修改表中的某一列。
a)修改表中某一列的列名(同时可修改列的数据类型)(change)
mysql>alter table 表名 change 原列名 新列名 原列数据类型; // 必须指定原列的数据类型
例, alter table user change `like` `likes` varchar(256);
b)修改表中某一列的数据类型(modify)
alter table 表名 modify 列名 列新的数据类型;
例,alter table user modify `likes` varchar(128);
5 删除表中的某一列。(drop)
alter table 表名 drop <column> 列名; //column可省略
例: alter table user drop `likes`;
修改表的字符集时,将表的字符集设置为gbk,但是出现一个问题,字段的字符集仍然使用的是utf-8
使用下面的语句可以将所有字段和表的字符集设置成utf-8:
alter table user convert to character set utf8;
如果想设置成字符集是gbk,只要将上面的语句utf8换成gbk即可。
参考博客:
https://blog.csdn.net/luo4105/article/details/50804148
https://blog.csdn.net/ylyang12/article/details/53241629
2018-10-19 14:49:59
MySQL函数
FIND_IN_SET(str,strlist):字符串str在字符串列表strlist中,则返回该字符串在字符串列表中的位置(1到N之间,N为字符串列表长度)。
str 是某字段名,类型是字符串,strlist是某变量名,类型是字符串,由英文逗号连接的字符串
例如,SELECT FIND_IN_SET('1','1,2,3,4'); //返回值为1,即第1个值
SELECT FIND_IN_SET('b','a,d,c,b,e'); //返回值为4,即第4个值
场景:根据一堆id值查询激活的key,使用MyBatis查询MySQL
@Select("select `key` from " + TABLE_ACTIVE + " where FIND_IN_SET(id, #{ids}) <> 0") List<String> getActiveKeys(@Param("ids")List<Integer> ids);
2018-10-06 22:35:37
mysql查询系统时间
select current_date; # 显示系统的日期 select now(); #显示系统的日期和时间
mysql注释
单行注释使用符号"#",单行注释的另一种写法:两个横杠加一个空格,"-- "
多行注释使用符号 "/*这是多行注释的写法!!!*/"
mysql几个关于筛选的条件的关键字的使用
from,where,group by,having,order by
最基本的组合:from+where
组合使用:group by和having???
where==having???
2018-08-29 23:45:56
创建简单表:
create table user ( id int primary key auto_increment not null, name ) not null, sex ) not null )engine=InnoDB charset=utf8;
创建关联表:
create table employee ( id ) primary key not null auto_increment, dep_id ), --定义外键dep_id name ) default null, pwd ) default null, phone ) default null, email ) default null, foreign key(dep_id) references department(id) --外键dep_id关联另一个表的主键 ) engine=InnoDB default charset=utf8; create table department ( id ) primary key not null auto_increment, name ) default null, ) defaul null ) engine=InnoDB default charset=utf8;
mysql5.7.22-64免安装版配置:
使用mysqld命令时要初始化:
mysqld --user=mysqli --basedir=D:\softwareInstall\softwareDev\mysqli --datadir=D:\softwareInstall\softwareDev\mysqli\data --initialize-insecure
使用my.ini不起作用,直接在控制台用指令指定其作用。
安装mysql服务:
mysqld install MYSQLi --defaults-file="D:\softwareInstall\softwareDev\mysqli\my.ini"
修改注册表,regedit.exe调出,找到MYSQLi服务的名称,修改它的ImagePath值
原先它是这样的:
D:\softwareInstall\softwareDev\mysql\bin\mysqld --defaults-file=D:\softwareInstall\softwareDev\mysqli\my.ini MYSQLi
标志红色的部分跟默认端口的mysql的安装路径是一样的,需要把它改成端口是3307的mysql的安装路径。
修改后是这样的:
D:\softwareInstall\softwareDev\mysqli\bin\mysqld --defaults-file=D:\softwareInstall\softwareDev\mysqli\my.ini MYSQLi
和原来的只差一个字母。
修改密码:
D:\softwareInstall\softwareDev\mysqli\bin>mysql -uroot; mysql> use mysql; mysql") WHERE user='root'; # 报错4 mysql> UPDATE user SET authentication_string=PASSWORD("123456") WHERE user='root';#生效
如何在cmd启动另一mysql呢?只要指定它的端口就可以了。默认端口3306是不用指定的。
C:\Users\rui # -P(P是大写的,表示端口号) 通过"-P"指定windows中的另一个mysql的端口号
2018-09-05 19:10:37
windows访问linux mysql:(环境:centos6.8)
# 启动mysql service mysqld start mysql -uroot -p use mysql update user set host = '%' where user = 'root'; flush privileges; #开放防火墙端口 vim /etc/sysconfig/iptables14 -A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT1516 service iptables restart
疑惑:
1、pojo 定义id为String类型,user表定义id为int类型,系统没有报错,是如何转化的?
2、user表必须定义id为auto_increment,否则需要指定id值,还会报错!?
数据类型:数字,日期和时间,字符串
整型:tinyint,smallint,mediumint,int,bigint
可以有符号或者无符号
tinyint | smallint | mediumint | int | bigint | |
有符号 | -128到127 | -32768到32767 | -8388608至8388607 | -2147483648到2147483647 | -9223372036854775808到9223372036854775807 |
无符号 | 0到255 | 0到65535 | 0到16777215 | 0到4294967295 | 0到18446744073709551615 |
字节长度 | 1个字节 | 2个字节 | 3个字节 | 4个字节 | 8个字节 |
浮点数:float(m,d)[默认为float(10,2),占4个字节],double(m,d)[默认为float(16,4),占8个字节],decimal(m,d)
m表示数字的总位数(包括小数的位数),d表示小数位数
时间和日期类型
date | datetime | timestamp | time | year(m) | |
格式 | YYYY-MM-DD | YYYY-MM-DD HH:MM:SS | YYYYMMDDHHMMSS | HH:MM:SS | |
范围 | 1000-01-01和9999-12-31之间 | 1000-01-01 00:00:00 到9999-12-31 23:59:59 | 1970年1月1日到2037的时间戳 |
m=2:1970至2069(70〜69) m=4:1901-2155(默认) |
|
示例 | 2018年1月1日将被存储为2018-01-01 | 2018年01月01日下午1:10,会被存储为2018-01-01 13:10:00 |
字符串类型
char(m) | varchar(m) |
blog/ text |
tinyblog/ tinytext |
mediumblog/ mediumtext |
longblog/ longtext |
enum | |
范围 | 固定长度,1到255个字符长度,默认为1 | 可变长度,1到255个字符长度,需要定义长度 |
最大为65536个字符长度,text不分大小写,不用指定长度 |
255个字符长度,不用指定长度 | 最大为16777215个字符长度,不用指定长度 | 最大为4294967295个字符长度,不用指定长度 | 列表 |
note:
v1.1(2018-05-15 21:33:16)
增加了查看数据库物理位置的指令
v1.2(2018-06-10 23:40:20)
增加了如何安装另一个mysql的方法,以及启动另一个mysql server的方法