暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mysql 语句基础(一)

自学Oracle 2019-10-22
630

1、使用命令行客户端连接到MySQL

2、创建数据库

3、创建表

4、插入、更新和删除行

5、加载示例数据

6、查询数据

7、对结果排序

8、对结果分组(聚合函数)

9、创建用户

10、授予和撤销用户的访问权限

11、查询数据并保存到文件和表中

12、将数据加载到表中

13、表关联

14、存储过程

15、函数

16、触发器

17、视图

18、事件

19、获取有关数据库和表的信息


1、使用命令行客户端连接到MySQL


    mysql -uroot -p
    mysql -h localhost -P 3306 -u root -p
    mysql --host=localhost --post=3306 --user=root --password=XXXXX
    mysql --host localhost --post 3306 --user root --password
    复制

    -P (大写) 用于指定端口

    -p (小写)用于指定密码

    查看当前用户

      whoami
      复制

      断开连接

        ctrl+D
        复制

        SQL语句结尾 \g 对应的输出水平显示;\G 对应的输出垂直显示。


        2、创建数据库

        --反标记字符(`)用于引用标识符。当数据库名称包含特殊字符时,需要使用反标记字符。


          create database `test.mytable`;
          use `test.mytable`;
          select database();
          复制

          查看数据目录

            show variables like 'datadir';
            复制

            查看数据文件

              ls -lhtr
              复制



              3、创建表


                create table if not exists `test`.`mytable`(
                id int unsigned auto_increment primary key,
                name varchar(20),
                country varchar(20)
                )engine=innodb;
                复制

                列出所有的存储引擎

                  show engines\G
                  复制

                  查看表结构


                    show create table test.mytable\G
                    desc test.mytable
                    复制

                    克隆表结构

                      create table new_mytable like mytable;
                      复制

                      4、插入、更新和删除行


                        insert ignore into test.mytable(name,country)values('Mike','USA'),('Andy','India'),('Ravi','China')
                        复制

                        查看等待事务

                          show warnings;
                          复制

                          replace行存在则替换,不存在则插入。如果你想在行已经存在的情况下处理重复项,则需要使用on duplicate key update。如果指定了 on duplicate update选项,并且insert 语句在primary key中引发了重复值,则mysql 会用新值更新已有的行。


                            replace into test.mytable values(1,'maink','USA'); 
                            insert into payments values('mysql','US') on duplicate key update  name=name+values(name);
                            复制

                            截断表

                              truncate table 
                              复制


                              5、加载示例数据

                              mysql -u root -p <employees.sql 


                              6、查询数据


                                in:
                                between ...and
                                not:
                                复制


                                正则表达式:

                                * 零次或多次重复

                                + 一个或多个重复

                                ? 可选字符

                                . 任何字符

                                \. 区间

                                ^ 以...开始

                                $ 以...结束

                                [abc]只有a、b、c

                                [^abc]非a 非b 非c

                                [a-z]字符a到z

                                [0-9]字符0到9

                                ^....$开始和结束

                                \d 任何数字

                                \D 任何非数字字符

                                \s 任何空格

                                \S 任何非空白字符

                                \w 任何字母数字字符

                                \W 任何非字母数字字符

                                {m} m次重复

                                {m,n} m到n次重复

                                  select count(*) from mytable where name regexp '^m' limit 5;
                                  复制



                                  7、对结果排序

                                    order by 1 desc  limit 5;
                                    复制

                                    8、对结果分组(聚合函数)


                                      group by   having 


                                      distinct
                                      复制

                                      9、创建用户

                                        create user if not exists 'test'@'%' identified with mysql_native_password by 'test' with max_queries_per_hour 500 max_updates_per_hour 100;
                                        复制

                                        max_queries_per_hour 500 用户可以在一小时内执行的最大查询数为500

                                        max_updates_per_hour 100 用户可以在一小时内执行的最大更新次数为100次

                                        select password('XXXX');


                                        10、授予和撤销用户的访问权限

                                          grant select on test.* to 'test'@'%';
                                          复制

                                          授权并创建用户


                                            grant insert on test.* to 'test'@'%' identified by 'XXXXX';
                                            grant insert ,delete,update on test.* to 'test'@'%' identified with mysql_native_password as 'XXXXX';
                                            grant select(id,name) on test.mytable to 'test'@'%' identified with mysql_native_password as 'XXXXX';
                                            create user 'test'@'%' identified with mysql_native_password by 'test';
                                            grant all privileges on *.* to 'mycat'@'%';
                                            复制

                                            授予grant特权

                                              grant grant option on *.* to 'mycat'@'%';
                                              复制

                                              查看权限

                                                show grants for 'test'@'%'\\G
                                                复制

                                                撤销权限

                                                  revoke delete on test.* from 'test'@'%';
                                                  复制

                                                  密码过期

                                                    alter user 'mycat'@'%' identified with mysql_native_password by 'XXXX'
                                                    复制

                                                    设置用户密码过期

                                                      alter user 'mycat'@'%' password expire interval 90 day;
                                                      复制

                                                      锁定用户


                                                        alter user 'mycat'@'%' account lock;
                                                        alter user 'mycat'@'%' account unlock;
                                                        复制

                                                        创建角色


                                                          create role 'app_read_only','app_writes','app_developer';
                                                          grant select on test.* to 'app_read_only';
                                                          grant insert,update,delete on test.* to 'app_writes';
                                                          grant all on test.* to 'app_developer';
                                                          grant 'app_developer' to 'test'@'%';
                                                          复制


                                                          11、查询数据并保存到文件和表中

                                                          输出到文件

                                                            grant file on *.*  to 'root'@'%';
                                                            复制

                                                            my.cnf 添加 secure_file_priv=/var/lib/mysql;


                                                              select first_name,last_name into outfile 'result.csv' fields terminated by ','optionally enclosed by '"' lines terminated by '\n' from employees where hire_date<'1986-01-01' limit 10;
                                                              复制

                                                              加载文件

                                                                load data infile 'result.csv' into table employee_names fileds terminated by ',' optionally enclosed by '"' lines terminated by '\n'
                                                                复制

                                                                如果开头你想忽略的行,可以使用ignore n lines 指定。

                                                                可以使用replace ignore处理重复行

                                                                  load data infile 'result.csv'  replace/ignore into table employee_names fileds terminated by ',' optionally enclosed by '"' lines terminated by '\n'
                                                                  复制

                                                                  远程登录服务器 加载文件

                                                                    load data local infile 'result.csv'  ignore into table employee_names fieds terminated by ',' optionally enclosed by '"' lines terminated by '\n'
                                                                    复制

                                                                    13、表关联


                                                                    14、存储过程

                                                                    存储过程处理的是一组sql语句,且没有返回值。

                                                                      create table employee (id int,name varchar(20),age int);
                                                                      drop procedure if exists employees;
                                                                      /*修改分隔符*/
                                                                      delimiter $$
                                                                      /*in 指定作为函数的变量,out 指定输出变量*/
                                                                      create procedure employees(out new_id int,in name varchar(20),in age int )
                                                                      begin
                                                                      /*声明变量*/
                                                                      /*declare n_id char(4);*/
                                                                      select max(id) into new_id from employee;
                                                                      set new_id=new_id+1;
                                                                      insert into employee values (new_id,name,age);
                                                                      end
                                                                      $$
                                                                      delimiter ;


                                                                      grant execute on *.* to 'root'@'%';
                                                                      insert into employee values(1,'aa',10),(2,'bb',20);
                                                                      commit;
                                                                      select * from employee;
                                                                      call employees(@new_id,'cc',50);


                                                                      select @new_id;
                                                                      show procedure status ;
                                                                      复制


                                                                      SECURITY_type 列值

                                                                      definer:即使只有execute权限的用户也可以调用并获取存储例程的输出,而不管该用户是否具有对基础表的操作权限。

                                                                      如果definer具有权限,那就足够了。

                                                                      invoker:安全上下文被切换到调用存储例程的用户。在这种情况下,调用者应该可以访问基础表。


                                                                      15、函数

                                                                      创建存储函数是为了简化复杂的计算,函数应该有一个我返回值。并且可以在select中调用函数。

                                                                        DROP function if EXISTS fun_employee;


                                                                        delimiter $$
                                                                        create function fun_employee(emp int) RETURNS VARCHAR(20)
                                                                        DETERMINISTIC
                                                                        BEGIN
                                                                        DECLARE n_age int;
                                                                        select avg(age) into n_age from employee where id=emp;
                                                                        return (n_age) ;
                                                                        END
                                                                        $$
                                                                        delimiter ;


                                                                        select * from employee;
                                                                        select fun_employee(2);
                                                                        show create function fun_employee \G;
                                                                        复制

                                                                        DETERMINISTIC 确定性的(对于相同的输入总是输出相同的值)

                                                                        默认是 not DETERMINISTIC 


                                                                        16、触发器

                                                                        触发动作时间可以是before 或after

                                                                        触发事件可以是insert、delete或update

                                                                        insert:无论何时通过insert、replace或load data语句插入新行,都会激活insert触发事件

                                                                        update:通过update语句激活update触发事件

                                                                        delete:通过delete或replace语句激活delete触发事件

                                                                        一个表同时具有多个触发器。必须使用follows 或precedes指定先行的触发器。

                                                                          drop trigger if exixts t_age;
                                                                          delimiter $$
                                                                          create trigger t_age before insert on employee for each row
                                                                          begin
                                                                          set new.age=round(new.age);
                                                                          end
                                                                          $$
                                                                          delimiter ;
                                                                          复制

                                                                          检查所有触发器

                                                                          show triggers \G

                                                                          检查现有触发器的定义 

                                                                          show create trigger <trigger_name>


                                                                          17、视图

                                                                          #修改加密规则  

                                                                            ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; 
                                                                            复制


                                                                            #更新密码(mysql_native_password模式)    

                                                                              ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'NewPassword';
                                                                              drop VIEW v_employee;
                                                                              create ALGORITHM=UNDEFINED DEFINER='root'@'localhost' SQL SECURITY DEFINER VIEW v_employee as select * from employee where id>5;
                                                                              INSERT into employee values (6,'hh',60)
                                                                              COMMIT;
                                                                              select * from v_employee;
                                                                              复制

                                                                              列出所有视图

                                                                                show full tables where table_type like 'VIEW';
                                                                                复制

                                                                                要检查视图的定义

                                                                                  show create view v_employee \G;
                                                                                  复制

                                                                                  VIEW  算法

                                                                                  merge:mysql将输入查询和视图定义合并到一个查询中,然后执行组合查询。

                                                                                  仅允许在简单视图上使用merge算法。

                                                                                  temptable:mysql将结果存储在临时表中,然后对这个临时表执行输入查询。

                                                                                  undefined(默认):mysql自动选择merge或temptable算法。mysql把merge算法作为首选的tempable算法,

                                                                                  因为merge算法效率更高。


                                                                                  18、事件

                                                                                  事件调度线程是未启用的

                                                                                    set global event_scheduler=on;
                                                                                    drop event if exists e_employee;
                                                                                    delimiter $$
                                                                                    create event if not exists e_employee on SCHEDULE every 1 week starts CURRENT_DATE do
                                                                                    begin
                                                                                    delete from employee where id <6;
                                                                                    end
                                                                                    $$
                                                                                    delimiter ;
                                                                                    复制


                                                                                    show events \G

                                                                                    检查事件的定义

                                                                                    show CREATE event e_employee \G;

                                                                                    禁用、启用事件

                                                                                    alter event e_employee disable;

                                                                                    alter event e_employee enable;

                                                                                    访问控制

                                                                                    所有存储的程序(过程、函数、触发器和事件)和视图都有一个definer。如果未指定definer,则创建该对象的用户将被选为definer。

                                                                                    存储例程(包括过程和函数)和视图具有值为definer或invoker的sql security特性,来指定对象

                                                                                    是在definer还是在invoker上下文中执行。触发器和事件没有sql security 特性,并且始终在definer

                                                                                    上下文中执行。服务器根据需要自动调用这些对象,因此不存在调用用户。


                                                                                    19、获取有关数据库和表的信息

                                                                                    information_schema

                                                                                    静态表元数据:

                                                                                    table_schema,table_name,table_type 和engine 这些统计信息将直接从数据字典中读取。

                                                                                    动态表元数据:auto_increment,avg_row_length 和data_free 。动态元数据会频繁更改(例如,

                                                                                    auto_increment值将在每次insert后增长)。在很多情况下,动态元数据在一些需要精确计算的情况下也会产生

                                                                                    一些开销,并且准确性可能对常规查询不会有好处。考虑到data_free统计量的情况(该统计显示表中的空闲字节数),

                                                                                    缓存值通常足够了。

                                                                                    set @@global.information_schema_stats='LATEST'


                                                                                    本公众号是个人学习工作笔记,希望大家发现问题能及时和我本人沟通,希望你与我共同成长。个人微信zgjt12306。



                                                                                     

                                                                                    欢迎关注“自学Oracle”



                                                                                    最后修改时间:2019-12-17 12:30:50
                                                                                    文章转载自自学Oracle,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                                                                    评论