登陆
mysql -uroot -p
权限问题
分配权限
分配只读权限:
GRANT SELECT ON . TO 'username'@'%' IDENTIFIED BY "password" WITH GRANT OPTION;
flush privileges;//刷新权限
分配所有权限:
GRANT ALL PRIVILEGES ON . TO 'username'@'%' IDENTIFIED BY "password" WITH GRANT OPTION;
flush privileges;//刷新权限
这里的.的意思,第一个是指数据库名,第二个是指数据表名,.指的是所有数据库下的所有数据表。
查看用户权限
show grants for 授权用户名@;
这里如果不是%那么需要把指定IP加上。
默认情况下,show grants for 授权用户名 <=>show grants for 授权用户名@%
会话变量&全局变量
创建表,所有内容都写在括号里,每个字段的信息用逗号分隔
create table database_name
.table_name
(
id
varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT UUID() COMMENT "",
)charset utf8 comment "xxxx";
desc table;
描述表,显示表的详情
order by
select field1,field2 from table1 order by field1 acs/desc;
acs 升序,默认升序,
desc降序
select field1,field2 from table1 order by field1 acs/desc ,field2 acs/desc;
acs 升序,默认升序,
desc降序
by后面是两个字段,前面一个优先级高,后面的优先级低,只有当前面的这个字段相等的时候才会按照后面的进行排序
select field1,field2 from table1 order by 1/2 acs/desc;
1是指这里的select后面第一个出现的字段,这个没有上面的健壮
数据处理函数,单行处理函数
select upper(filed) from table as alias; //大写
select lower(filed) from table as alias; //小写
select substr(filed,start_index,length) from table as alias; //分片
select length(filed) from table as alias;//长度
select trim(filed) from table as alias;//去空格
select round(filed,num) from table as alias;//四舍五入,num表示保留几位小数
select rand() //生成随机数
数据库中,有null参与运算的,结果一定是null
ifnull(filed,num)如果filed字段为空,那么默认值为num
group by 分组查询语句
就是分组,类似于excel里的筛选功能,一般使用起来是这样的:
select count(*),filed_name from table_name gruop by filed_name
就是把所有的记录记个数,然后这里的filed_name字段的每个值有多少条记录就能够看到。
这里也可以进行重复值的筛选,需要用having子句,用法如下:
select count(),filed_name from table_name gruop by filed_name having count() >1
这里有一点需要注意,就是在进行where查询的时候,需要把where放在group by之前。
TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)
这里有三个参数,第一个是单位(YEAR、MONTH、DAY、HOUR、MINUTE、SECOND)
DATEDIFF(expr1,expr2)
两个参数,返回的值是两个日期的天数。
IF(expr1,expr2,expr3)
其中expr1是判断条件,expr2 是正确的值,expr3是错误的值。
mysql中默认的join是inner join
join之后的where和on的区别,on是先筛选后连表,where是先连表后筛选
因此,on会带出null值而where不会
if子句中如果需要select,需要添加括号
select if(expr1,(selct filed_name1 from tablr_name where ...),(selct filed_name1 from tablr_name where ..))
使用select子句查询
这里的select子句需要对与子句进行一个名字的设置
select filed_name from ( sele * from table 1) as name【这里的as可有可无】
FIND_IN_SET(str,strlist)
找到str在strlist中的第几个
例如 FIND_IN_SET('a','a,b,c,a')
结果是1
一个if只能对应到一个 end if;
limit用法
limit offset,count
offset指的是偏移量,即从第几个开始取limit,默认情况下offset是0,即从头开始取。
根据列名【即字段名】查找表名
information.schema库里的columns表,通过column_name筛选字段名称,table_name即为表的名称
decimal用法
decimal(m,d)
m是数字的最大位数,他的范围是从1-65;
d是小数点后的位数,他的范围是0-30,并且不能大于m。
如果m被省略了,那么m的值默认为10,
如果d被省略了,那么d的值默认为0.
举例表示:
1、decimal(5,2) 所指代的范围是-999.99~999.99 数字的最大位数是5位,小数点右侧是2位,即有两位小数。
2、decimal(7,6)所指代的范围是-9.999999~9.999999 数字的最大位数是7位,小数点右侧是6位,即有六位小数。
字的位数和所占字节数,有以下对应表:
小数点左侧位数 | 数据结构所占的字节数 |
---|---|
1–2 | 1 |
3–4 | 2 |
5–6 | 3 |
7–9 | 4 |
举例表示:
decimal(18,9)小数位左右各为9位数,此数据所占以上表格即为4字节整数位,4字节小数位;
decimal(20,6)整数位为14位,小数位位6位,此数据需要4个字节给整数位的9位和3字节给另外的5位整数,另外小数位需要3个字节,总共是4+3+3 = 11个字节。
decimal不能够存储以“+”、“-”和“0”开头的数据,如果是“+”开头momo默认存为正数,而“-”开头则不存储
union 集合查询
集合查询主要包括union并操作、intersect交操作和except差操作
这里的前提是,参与集合查询的,必须要列数相同,并且每列对应的数据类型也相同。
convert和cast
对于转换格式:
CAST(expr AS type)
CONVERT(expr,type)
convert还有一个用法,就是不同编码:
CONVERT(expr USING transcoding_name)
这里的transcoding_name可以是utf8等
查询特定字符在一个字符串字段内的位置
position("特定字符串" IN "目标字段/字符串")
case的使用,case有两种使用方法:
1、case field_name when 'xx' then 'xxx' when 'xx1' then 'xxx1' else 'yyy' end
2、case when filed_name = 'xx' then 'xxx' when filed_name = 'xx1' then 'xxx1' else 'yyy' end
两种用法都是对filed_name进行重新赋值
如何查询数据中某个字段是空值或者是null的记录
使用ifnull函数
ifnull( filed_name,'') = ''
这里filed_name这个字段只有是null或者''空值的时候,才能满足条件。
ROW_COUNT()
指的是update语句或者delete语句影响了多少条数据,不包括select和insert;
如果返回值是0,说明执行了语句,但是并没有影响数据,说明变动前后数据一致;
如果返回值大于0,则说明影响了几条数据;
如果返回值为-1,说明并没有执行update /delete语句。
FOUND_ROWS()
这个函数仅表示select了多少语句;并且不包括limit的里面的。但是我实验好像不是这样的,一直都是345,不知道为什么。
官网说明
replace into与insert into的区别
最简单的理解,是replace into会对primary key进行检查,如果已经存在相同的primary key的话将把原数据删除,新增这条重复的primary key的数据。
网友评论