mysql数据操作

了解:Mysql 账号相关

创建账号:

权限:user(所有库的权限)-->db(某个库的权限)-->table_priv(某张表的权限)

                  -->columns_oriv(某个字段的权限)

创建账号:create user ‘tom’(账号)@’客户端ip(%代表所有ip都可)’ identified by ‘123’(密码)

登录:mysql -utom -p’123’ -h 服务端ip -P3306

创建账号并授权:只有root账号能为其它账号授权

grant all(不包括grant权限) on *.* to ‘tom’@’%’ identified by ‘123’

其中:

*.*代表user权限

db.*代表db权限

db.t1代表table_priv权限

grant select(id) on db.t1 代表columns_oriv权限

# 修改完权限一定要

flush privileges;

单表查询

完整语法

select distinct 字段1,字段2,字段3,... from 库名.表名

                    where 约束条件

                    group by 分组依据

                    having 过滤条件

                    order by 排序的字段

                    limit 限制显示的条数

关键字执行优先级:

from    where    group by    having    distinct    order by    limit

字符拼接:

select concat('名字: ',name) as new_name,concat("年龄: ",age) as new_age from emp;

select concat(name,":",age,":",sex) from emp;

select concat_ws(":",name,age,sex) as info from emp;

了解:流程控制

SELECT (

           CASE

           WHEN NAME = 'egon' THEN

               NAME

           WHEN NAME = 'alex' THEN

               CONCAT(name,'_BIGSB')

           ELSE

               concat(NAME, 'SB')

           END

       ) as new_name

   FROM

       emp;

where关键字

         _代表任意单个字符

         %代表任意无穷个字符

         select * from emp where name like "__";

         select * from emp where name like "jin%";

         select * from emp where id not in (6,9,12);

group by分组

         什么是分组:按照所有记录相同的部分进行归类,一定区分度低的字段

         为何要分组:当我们要以组为单位进行统计时就必须分组,分组的目的是为了以组为单位进行统计的,再去考虑单条记录毫无意义

         set global sql_mode="strict_trans_tables,only_full_group_by"; 设置严格模式

         注意:分组之后,只能查到分组的字段以及组内多条记录聚合的成果

         select * from emp group by post;

聚合函数

         max

         min

         avg

         sum

         count

having 过滤条件

         where是在分组之前的过滤,即在分组之前做了一次整体性的筛选

         having是在分组之后的过滤,即在分组之后专门针对聚合的结果进行进一步的筛选

order by排序

         select * from emp order by age asc; # 默认asc升序-》从小到大

         select * from emp order by age desc;# desc降序-》从大到小

         select * from emp order by age asc,salary desc; # 先按照age升序排列,如果age相同则按照salary降序排

limit 限制显示的条件

         select * from emp limit 3;

         分页显示

         select * from emp limit 0,5; # 从0开始往后取5条

         select * from emp limit 5,5; #从5开始往后取5条

正则表达式

         select * from emp where name regexp "^jin.*(g|n)$";

多表查询

1、笛卡儿积

select * from emp,dep;

select * from emp,dep where emp.dep_id = dep.id;

select * from emp,dep where emp.dep_id = dep.id and dep.name = "技术";

2、内连接:只取两张表有对应关系的记录

select * from emp inner join dep on emp.dep_id = dep.id;

select * from emp inner join dep on emp.dep_id = dep.id

                            where dep.name = "技术";

3、左连接: 在内连接的基础上保留左表没有对应关系的记录

select * from emp left join dep on emp.dep_id = dep.id;

4、右连接: 在内连接的基础上保留右表没有对应关系的记录

select * from emp right join dep on emp.dep_id = dep.id;

5、全连接:在内连接的基础上保留左、右面表没有对应关系的的记录

select * from emp left join dep on emp.dep_id = dep.id

union

select * from emp right join dep on emp.dep_id = dep.id;

子查询:就是将一个查询语句的结果用括号括起来当作另外一个查询语句的条件去用

         select * from emp where dep_id in (select id from dep where name = "技术" or name = "人力资源");

原文地址:https://www.cnblogs.com/luck-L/p/9357228.html