停止命令:net stop mysql
启动命令:net start mysql
mysql登录命令mysql -h ip -P 端口 -u 用户名 -p
mysql --version 或者mysql -V用于在未登录情况下,查看本机mysql版本
select version();:登录情况下,查看链接的库版本
显示所有数据库:show databases;
进入指定的库:use 库名;
显示当前库中所有的表:show tables;
查看其他库中所有的表:show tables from 库名;
查看表的创建语句:show create table 表名;
查看表结构:desc 表名;
查看当前所在库:select database();
mysql语法规范
SQL的语言分类
主要包括以下五大类
整数类型:bit、bool、tinyint、smallint、mediumint、int、bigint
浮点数类型:float、double、decimal
字符串类型:char、varchar、tinyblob、blob、mediumblob、longblob、tinytext、text、mediumtext、longtext
日期类型:Date、DateTime、TimeStamp、Time、Year
其他数据类型:暂不介绍,用的比较少。
类型(n)说明在开发中,我们会碰到有些定义整型的写法是int(11),这种写法个人感觉在开发过程中没有什么用途,不过还是来说一下,int(N)我们只需要记住两点:
decimal采用的是四舍五入
float和double采用的是四舍六入五成双
什么是四舍六入五成双?
char类型占用固定长度,如果存放的数据为固定长度的建议使用char类型,如:手机号码、身份证等固定长度的信息
数据类型选择的一些建议
权限生效时间用户及权限信息放在库名为mysql的库中,mysql启动时,这些内容被读进内存并且从此时生效,所以如果通过直接操作这些表来修改用户及权限信息的,需要重启mysql或者执行flush privileges;才可以生效。
用户登录之后,mysql会和当前用户之间创建一个连接,此时用户相关的权限信息都保存在这个连接中,存放在内存中,此时如果有其他地方修改了当前用户的权限,这些变更的权限会在下一次登录时才会生效。
创建用户语法:
create user 用户名[@主机名] [identified by '密码'];
通过修改mysql.user表修改密码
use mysql;
update user set authentication_string = password('321') where user = 'test1' and host = '%';
flush privileges;
给用户授权:
grant privileges ON database.table TO 'username'[@'host'] [with grant option]
grant命令说明:
查看用户有哪些权限show grants for '用户名'[@'主机']
show grants -- 查看当前用户的权限
撤销用户的权限:revoke privileges ON database.table FROM '用户名'[@'主机'];
删除用户:
1.drop user '用户名'[@'主机’]
2.delete from user where user='用户名' and host='主机';
授权原则说明
总结
修改列alter table 表名 modify column 列名 新类型 [约束];
或者
alter table 表名 change column 列名 新列名 新类型 [约束];
2种方式区别:modify不能修改列名,change可以修改列名
delete单表删除delete [别名] from 表名 [[as] 别名] [where条件];
示例-- 删除test1表所有记录delete from test1;
-- 删除test1表所有记录delete test1 from test1;
-- 有别名的方式,删除test1表所有记录delete t1 from test1 t1;
-- 有别名的方式删除满足条件的记录delete t1 from test1 t1 where t1.a>100;
多表删除
delete [别名1,别名2] from 表1 [[as] 别名1],表2 [[as] 别名2] [where条件];
示例1delete t1 from test1 t1,test2 t2 where t1.a=t2.c2;
drop,truncate,delete区别
别名中有特殊符号的,比如空格,此时别名必须用引号引起来。
不等于符号的使用:
<> 这个是最早的用法。
!=是后来才加上的。
两者意义相同,在可移植性上前者优于后者
故而sql语句中尽量使用<>来做不等判断
like(模糊查询)select 列名 from 表名 where 列 like pattern;
查询运算符、like、between and、in、not in对NULL值查询不起效
<=>(安全等于)<=>:既可以判断NULL值,又可以判断普通的数值,可读性较低,用得较少
总结
语法:
select 列 from 表 limit [offset,] count;
limit中不能使用表达式,limit后面的2个数字不能为负数字段存在相同的值,当排序过程中存在相同的值时,没有其他排序规则时,mysql懵逼了,不知道怎么排序了;
建议:分页排序时,排序不要有二义性,二义性情况下可能会导致分页结果乱序,可以在后面追加一个主键排序
where 多字段同时限制:
SELECT
user_id 用户id,
price 最大金额,
the_year 年份
FROM
t_order t1
WHERE
(t1.user_id , t1.price)
IN
(SELECT
t.user_id, MAX(t.price)
FROM
t_order t
GROUP BY t.user_id);
现在我们来讨论java输出的顺序为何和sql不一致?
那mysql是如何优化的呢?
delimiter关键字 sql语句结束符delimiter用来设置结束符,当mysql执行脚本的时候,遇到结束符的时候,会把结束符前面的所有语句作为一个整体运行,存储过程中的脚本有多个sql,但是需要作为一个整体运行,所以此处用到了delimiter
/*在执行过程中出任何异常设置hasSqlError为TRUE*/
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET hasSqlError=TRUE;
根据hasSqlError判断是否有异常,做回滚和提交操作
mysql使用binlog和relaylog记录数据库的变化
binlog有三种格式:ROW STATEMENT MIXED ,ROW记录national数据被修改了,修改成了什么样子;STATEMENT 记录修改的sql到binlog;MIXED就是以上两种模式的混合。
binlog是一个二进制文件,解析binlog有两种方式:
1.在命令行使用,show binlog events in 'binlog-filename';方式查看
2.下载分析binlog,然后通过mysqlbinlog工具进行解析
扇区:磁盘存储的最小单位,扇区一般大小为512Byte
磁盘块:文件系统与磁盘交互的最小单位(计算机系统读写磁盘的最小单位),一个磁盘块由连续几个扇区组成,块一般大小为4KB
二分法查找数据的优点:定位数据非常快,前提是:目标数组是有序的。
总结一下使用索引的一些建议
|
|