MySQL 必知必会的操作

参考文章:
1.mysql数据库的基本操作
2.10分钟学会MySQL基础教程

1.增加一条记录insert

  -- insert [into] tab_name (field1,filed2,.......) values (value1,value2,.......);
   insert into employee_new (id,name,birthday,salary) values (1,'yuan','1990-09-09',9000);

  -- 插入多条数据
   insert into employee_new values (4,'alvin1','1993-04-20',3000),(5,'alvin2','1995-05-12',5000);

  -- set插入: insert [into] tab_name set 字段名=值
  insert into employee_new set id=12,name="alvin3";

2.修改表记录

/* 注意:WHERE子句指定应更新哪些行。如没有WHERE子句,则更新所有的行。*/
-- update tab_name set field1=value1,field2=value2,......[where 语句]
update employee_new set birthday="1989-10-24" WHERE id=1;

-- 将yuan的薪水在原有基础上增加1000元。
update employee_new set salary=salary+4000 where name='yuan';

3.删除表纪录

  /*注意:
        1.如果不跟where语句则删除整张表中的数据
        2.delete语句只能删除表中的内容,想要删除表,用drop
        3.truncate table(截断)也可以删除表中的所有数据,词语句首先摧毁表,再新建表。此种方式删除的数据不能在
        事务中恢复。
  */
 delete from tab_name [where ....]

 -- 删除表中名称为’alex’的记录。
 delete from employee where name='alex';

 -- 删除表中所有记录。
 delete from employee;//注意此时表自增id没有被重置
 -- 重置表自增id     
 alter table employee auto_increment=1;

 -- 使用truncate删除表中记录。
 truncate table emp_new;

4.查询表记录

-- (1)select [distinct] *|field1,field2,......   from tab_name
        select distinct JS ,name from ExamResult;

-- (2)select 也可以使用表达式,并且可以使用 as 给字段起别名
        -- 在所有学生分数上加10分特长分显示。
        select name,JS+10,Django+10,Database+10 from ExamResult;

        -- 统计每个学生的总分。
        select name,JS+Django+Database from ExamResult;

        -- 使用别名表示学生总分。
        select name as 姓名,JS+Django+Database as 总成绩 from ExamResult;

-- (3)使用where子句,添加查询条件进行查询过滤,where字句中可以使用:
         -- 比较运算符:
            > < >= <= <> !=                        
            between 80 and 100 //值在80到1000之间
            in(80,90,100) //值是80或90或100
            like 'yuan%' //模糊匹配
                          //模糊匹配的运算符是%或者_, 
                          //如果是%则表示任意多字符,此例如唐僧,唐国强
                          //如果是_则表示一个字符唐_,只有唐僧符合。
        -- 逻辑运算符
            在多个条件直接可以使用逻辑运算符 and or not

-- (4)Order by 指定排序的列,排序的列即可是表中的列名,也可以是select 语句后指定的别名。
        -- select *|field1,field2... from tab_name order by field [Asc|Desc]

        -- Asc 升序、Desc 降序,其中asc为默认值 ORDER BY 子句应位于SELECT语句的结尾。

-- (5)group by 分组查询:
        -- 注意,按分组条件分组后每一组只会显示第一条记录,
            如果想显示每个组的全部数据,可以使用 order by 或 group_concat()函数

        -- group by字句,其后可以接多个列名,也可以跟having子句,对结果进行筛选
         /*having 和 where两者都可以对查询结果进行进一步的过滤,差别有:
         <1>where语句只能用在分组之前的筛选,having可以用在分组之后的筛选;
         <2>使用where语句的地方都可以用having进行替换
         <3>having中可以用聚合函数,where中就不行。
         */
          select name,sum(Django) from ExamResult
                    where name!="yuan"
                    group by name
                    having sum(Django)>130;

        -- GROUP_CONCAT() 函数
        1、功能:将group by产生的同一个分组中的值连接起来,返回一个字符串结果。
        2、语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc  ] [separator '分隔符'] )
        说明:通过使用distinct可以排除重复值;如果希望对结果中的值进行排序,可以使用order by子句;
              separator是一个字符串值,缺省为一个逗号。
          SELECT id,GROUP_CONCAT(name),GROUP_CONCAT(JS) from ExamResult GROUP BY id;

-- (6)聚合函数: 一般和分组查询配合使用
        --<1> 统计表中所有记录
            -- COUNT(列名):统计行的个数
            -- 注意:count(*)统计所有行; count(字段)不统计null值.

            -- SUM(列名):统计满足条件的行的内容和
             -- 注意:sum仅对数值起作用,否则会报错。

            -- AVG(列名):求平均值
            -- Max、Min:求最高分和最低分(数值范围在统计中特别有用)
            -- 注意:null 和所有的数计算都是null,所以需要用ifnull将null转换为0!ifnull(JS,0)

--  (7) limit
                SELECT * from ExamResult limit 1,5;

5.多表查询

-- (1) 笛卡尔积查询
     -- select * from table_name1, table_name2;

-- (2) 内连接,查询两张表中都有的关联数据,相当于利用条件从笛卡尔积结果中筛选出了正确的结果
    --select * from table_name1 inner join table_name2 on table_name1.dept_id = table_name2.dept_id;

-- (3) 外连接(左联接、右连接、全连接)
    -- 左连接:在内连接的基础上增加左边有右边没有的结果
       select * from table_name1 left join table_name2 on table_name1.dept_id = table_name2.dept_id;

    -- 右外连接:在内连接的基础上增加右边有左边没有的结果
       select * from table_name1 right join table_name2 on table_name1.dept_id = table_name2.dept_id;

    -- 全外连接:在内连接的基础上增加左边有右边没有的和右边有左边没有的结果
       -- 注意:mysql不支持全外连接 full join,但是可以使用此种方式间接实现全外连接:
       select * from table_name1 right join department on table_name1.dept_id = table_name2.dept_id
       union
       select * from table_name1 left join table_name1 on table_name1.dept_id = table_name2.dept_id;
       -- 注意 union与union all的区别:union会去掉相同的纪录

-- (4) 子查询
    -- 子查询是将一个查询语句嵌套在另一个查询语句中。
    -- 内层查询语句的查询结果,可以为外层查询语句提供查询条件。
    -- 子查询中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等关键字
    -- 还可以包含比较运算符:= 、 !=、> 、<等

2018年5月4日更新:
我被人问到:“如何创建用户名和密码?”,然后就蒙了。。。
参考文章:MySQL创建用户的三种方法
特此记录:

一.创建用户:

命令: CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 
例子: CREATE USER 'root'@'localhost' IDENTIFIED BY '123456';

说明:
username : 你将创建的用户名;
host : 指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost, 如果想让该用户可以从任意远程主机登陆,可以使用通配符%;
password : 该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器;

二.授权:

命令: GRANT privileges ON databasename.tablename TO 'username'@'host' 
例子: GRANT SELECT, INSERT ON test.user TO 'pig'@'%'; 

注意:用以上命令授权的用户不能给其它用户授权,如果想让该用户可以授权,用以下命令: 
GRANT privileges ON databasename.tablename TO 'username'@'host' WITH GRANT OPTION; 

说明:
privileges : 用户的操作权限,如SELECT , INSERT , UPDATE 等,如果要授予所的权限则使用ALL;
databasename : 数据库名;
tablename : 表名,如果要授予该用户对所有数据库和表的相应操作权限则可用*表示, 如*.*;

三.设置与更改用户密码:

命令:SET PASSWORD FOR 'username'@'host' = PASSWORD('newpassword');
例子: SET PASSWORD FOR 'pig'@'%' = PASSWORD("123456"); 
如果是当前登陆用户用:SET PASSWORD = PASSWORD("newpassword"); 

四.撤销用户权限:

命令: REVOKE privilege ON databasename.tablename FROM 'username'@'host'; 
例子: REVOKE SELECT ON *.* FROM 'pig'@'%'; 

说明: privilege, databasename, tablename - 同授权部分.
注意: 假如你在给用户'pig'@'%'授权的时候是这样的(或类似的):GRANT SELECT ON test.user TO 'pig'@'%', 则在使用REVOKE SELECT ON . FROM 'pig'@'%';命令并不能撤销该用户对test数据库中user表的SELECT 操作.相反,如果授权使用的是GRANT SELECT ON . TO 'pig'@'%';则REVOKE SELECT ON test.user FROM 'pig'@'%';命令也不能撤销该用户对test数据库中user表的Select 权限.
具体信息可以用命令SHOW GRANTS FOR 'pig'@'%'; 查看.

五.删除用户:

命令:DROP USER 'username'@'host';
例子:DROP USER 'root'@'host'; 

你可能感兴趣的:(MySQL 必知必会的操作)