Mysql&SQL笔记

SQL(国际标准化,结构查询语言)
1. mysql结构
    mysql=国际标准化+自定义
    a.  mysql逻辑结构:
    mysqld(process+threads)-->库-->表-->记录(由行与列组成)

    b. 物理结构:
    mysql软件+mysql数据文件+配置文件

    c. 整体结构:
    物理+逻辑(实例)=mysql
    数据库        --理解为磁盘上面的文件
    实例            --运行中mysqld

    d. mysql中是一个实例对应多个物理库

2. 关系型数据库
    表与表发生关系,叫关系型
    例如:
    部门表(部门ID、部门名称)
    雇员表(员工ID、员工姓名、部门ID)
    
3. mysql数据库对应的语言编码配置文件
    相应数据库对应目录下面的db.opt 文件
  如:
    # cat /d1/db2/db.opt             --库对应的语言编码的配置文件
    default-character-set=utf8
    default-collation=utf8_general_ci
    
4. mysql表对应的文件
    例如:
    # ls /d1/db03/t1* -l        --表(myisam)在磁盘上的表现形式
    -rw-rw---- 1 mysql mysql 8652 Mar 23 10:41 /d1/db03/t1.frm        表结构
    -rw-rw---- 1 mysql mysql    0 Mar 23 10:41 /d1/db03/t1.MYD        表中的数据
    -rw-rw---- 1 mysql mysql 1024 Mar 23 10:41 /d1/db03/t1.MYI        索引    
        
5.刷新权限表flush和查看信息show
    a. flush    
    mysql> flush privileges;    --刷新权限表
    b. show

6. mysql如何验证:
    client(192.168.0.1)-->root@192.168.0.1-->mysqld(192.168.0.2)
        1、先验证客户端的地址是否被允许登录192.168.0.2的mysqld
        2、最后验证账号和密码
        
7. 数据类型
    http://www.runoob.com/mysql/mysql-data-types.html
        
    


8. SQL的种类:
    a.  数据定义语言:DDL        create drop alter
    1) create             --创建库,表,用户
        帮助信息:  
        mysql> ? create
       库:
        mysql> create database test01;
        mysql> create database db2 default charset utf8;
        
        # cat /d1/db2/db.opt             --库对应的语言编码的配置文件
        default-character-set=utf8
        default-collation=utf8_general_ci
        
        mysql>create database  IF NOT EXISTS test02  default charset gbk;
        mysql>show warnings;
        mysql>show databases;
        
       表:
        mysql> use db03;
        mysql> create table t1(id tinyint, name varchar(20), math tinyint, english tinyint);
        
        # ls /d1/db03/t1* -l        --表(使用myisam)在磁盘上的表现形式
        -rw-rw---- 1 mysql mysql 8652 Mar 23 10:41 /d1/db03/t1.frm        表结构
        -rw-rw---- 1 mysql mysql    0 Mar 23 10:41 /d1/db03/t1.MYD        表中的数据
        -rw-rw---- 1 mysql mysql 1024 Mar 23 10:41 /d1/db03/t1.MYI        索引
        
        mysql [db03]>show create table t1;        --查看表是如何创建的
        | t1    | CREATE TABLE `t1` (
          `id` tinyint(4) DEFAULT NULL,
          `name` varchar(10) DEFAULT NULL,
          `math` tinyint(4) DEFAULT NULL,
          `english` tinyint(4) DEFAULT NULL
        ) ENGINE=InnoDB DEFAULT CHARSET=latin1 |        --可以查出此使用何种存储引擎及语言编码
        
        mysql> DESCRIBE t1;            --查看表结构
        +---------+-------------+------+-----+---------+-------+
        | Field   | Type        | Null | Key | Default | Extra |
        +---------+-------------+------+-----+---------+-------+
        | id      | tinyint(4)  | YES  |     | NULL    |       |
        | name    | varchar(20) | YES  |     | NULL    |       |
        | math    | tinyint(4)  | YES  |     | NULL    |       |
        | english | tinyint(4)  | YES  |     | NULL    |       |
        +---------+-------------+------+-----+---------+-------+
        4 rows in set (0.06 sec)
        
       用户:
        mysql> create user user01;    --创建一个用户,密码为空
        mysql> set password for user01=password('123');    --设置用户的密码

        mysql> set password for user01=password('123');    --设置用户的密码
        mysql> select user from mysql.user where user='user01';    --验证用户是否创建成功
        +--------+
        | user   |
        +--------+
        | user01 |
        +--------+
        
        mysql> flush privileges;    --刷新权限表
        
    2) drop      --删除库,表,用户
        帮助信息:  
        mysql> ? drop
        库:
        mysql> drop database test1;    --删除库
        mysql> show databases;    --验证库是否删除成功
        
        表:
        mysql> use db03
        mysql> drop table t1;    --删除表
        mysql> show tables        --验证表是否删除成功
        
        用户
        mysql> drop user user01;    --删除用户
        mysql> select user from mysql.user where user='user01';    --验证用户是否删除成功

    3) alter      --修改已经存在数据库对象(库/表/列)的属性,并不是其内部数据而是属性
        帮助信息:  
        mysql> ? alter
        库:
        mysql> ALTER DATABASE DB1 DEFAULT CHARACTER SET latin1;    --修改数据库语言编码
        mysql> show create database DB1;        --验证修改是否成功
        
        表:
        mysql> ALTER DATABASE DB1 DEFAULT CHARACTER SET latin1;    --修改数据库语言编码
        mysql> show create database DB1;        --验证修改是否成功
        
    
    b.  数据操作语言:DML        insert delete update select
    1) insert                 --插入数据
       mysql> ?  insert
        插入单行记录多列数据
        mysql> insert into t20 set id=1, name=.'zhansan';                  --向指定列插入数据
        mysql> insert into t20 set id=100;    
        mysql>insert into t20 select math,english from t02;                --通过查询另一表的值来完数据的插入
        mysql> insert into t20(id,name) values(2,'lisi');    
        
        插入多行记录多行数据
        mysql> insert into t20(id,name) values(2,'lisi'),(3,'wangwu') ;        --插入多条记录
        mysql> insert into t20  values(4,'name04'),(5,'name05');                --不写列名,需要填写表中没列的内容

    2) update      --更新/修改记录
       mysql> ?  update
        mysql> update t1 set math=81,english=91 where id=1 and name='zhang3';

        更改root用户对应在localhost登录的密码
        mysql> update mysql.user set password=password('123') where user='root' and host='localhost';
        mysql> flush privileges;        --刷新权限表(把内存数据写回磁盘)
        mysql> update mysql.user set password=password('123') where user='root';
        
    3)     delete/truncate
        mysql> ?   delete/truncate
        delete 会将操作记录到日志,写的效率低
        truncate 是直接删除物理和实例的链接关系,速度快,但是不记录日志,不可以修复
        
        删除用户:
        mysql> delete from mysql.user where user='';        --删除mysql中的匿名用户
        mysql> flush privileges;

扫描二维码关注公众号,回复: 4824728 查看本文章

        删除表内内容:
        mysql> delete from imptest where id=1;         --指定条件删除
        mysql> delete from imptest where id < 4;         --指定区间删除
        mysql> delete from imptest;                     --删除整个表,一行一行删除,所有的操作都会被记录至事务日志中
        mysql> delete from imptest where name like 'test%';

        mysql> truncate imptest;    --一次性全部删除,不会被记录至事务日志中.
        
    4)select:(% _= ^)    --查询
      (1) 通配符:
        %    匹配单个或任意多个字符
        _    匹配一个字符
        =    精确匹配
        like    模糊匹配
        regex(^  .  .* .....)        使用正则表达式来匹配
            
                mysql> select host as 主机名,password as 密码,user as 用户名 from mysql.user;    --给列取别名,增加可读性
            mysql> select user,password,host from mysql.user where host like 'localhos_';    --模糊匹配
            mysql> select user,password,host from mysql.user where host  regexp '^l';    --支持正则表达式
            mysql> select * from mysql.user where user='root'    --精确匹配
            
        (2)排序:
        order by    排序
            asc        升序排列结果
            desc    降序排列结果
        group by    聚合,排除重复的,可以统计数量
        
        
            mysql> select * from t1 order by id asc;
            +------+--------+------+---------+
            | id   | name   | math | english |
            +------+--------+------+---------+
            |    1 | zhang3 |   80 |      90 |
            |    2 | li4    |   50 |      60 |
            |    3 | wang5  |   77 |      88 |
            |    3 | a02    |   55 |      66 |
            |    4 | a01    |   70 |      67 |
            |    4 | a03    |   99 |      88 |
            +------+--------+------+---------+
            6 rows in set (0.00 sec)

            mysql> select * from t1 order by math desc;
            +------+--------+------+---------+
            | id   | name   | math | english |
            +------+--------+------+---------+
            |    4 | a03    |   99 |      88 |
            |    1 | zhang3 |   80 |      90 |
            |    3 | wang5  |   77 |      88 |
            |    4 | a01    |   70 |      67 |
            |    3 | a02    |   55 |      66 |
            |    2 | li4    |   50 |      60 |
            +------+--------+------+---------+
            6 rows in set (0.00 sec)
        
        
        
            mysql>  select distinct user from mysql.user where user='root';    --去除一模一样的行
            mysql>  select user,host from mysql.user where user='root' group by user;    根据某列把相同值的记录聚合成一条记录
            mysql> select user from mysql.user where user regexp 'r..t' group by user having user='root';
                                            --group by聚合函数中的条件语句不能用where,需要使用having
            
        (3)查看mysql支持字符转换函数:
            select password('123');        --常用
            select md5('123');
            select sha1('123');            --常用
            select encrypt('123');        --很旧的东西,基本上不用了            
    
        
        (4)使用select来调度mysql中的常见函数:
            mysql> select current_user();
            mysql> select current_time();
            mysql> select current_date();
            mysql> select count(*) from t1;    --计算表中有多少条记录
            mysql> select now();

        (5)合并列:
            mysql> select concat(user,'    ',password) as 用户名和密码 from mysql.user;
            mysql> select concat(user,'    ',password) as 用户名和密码 from mysql.user order by 用户名和密码 asc;    --按照升序来排列结果 
            mysql> select concat(user,'    ',password) as 用户名和密码 from mysql.user order by 用户名和密码 desc;    --降序排列


        (6)分页函数:
            mysql> select * from t1 limit 10;    --显示前10行
            mysql> select * from t1 limit 10,10;    --显示11至20行    
            
            mysql> select * from t1 order by english desc limit 3
            mysql> select * from db1.t1 order by english asc limit 1,2;    显示第二名和第三名
            mysql> select * from db1.t1 where math >= 60 or english >=60 ;            
            
         (7) + - * /    mysql运算符
            mysql> select 1 + 1, (10-1)/3, 2*2/2;      ---以1 + 1, (10-1)/3, 2*2/2为列明,各列的值为表达式计算出的值
            +-----+-----+-----+
            | 1+1 | (10-1)/3 | 2*2/2|
            +-----+-----+-----+
            |   2   |   4   |   6 |
            +-----+-----+-----+

            mysql> select 1 + '10a';        ---带有字符的以前面的数字做其值计算
            +-----------+
            | 1 + '10a' |
            +-----------+
            |        11 |
            +-----------+
            1 row in set, 1 warning (0.00 sec)

            mysql> select 1 + 'a10';          --以字符开头的计算时不处理
            +-----------+
            | 1 + 'a10' |
            +-----------+
            |         1 |
            +-----------+
            1 row in set, 1 warning (0.00 sec)


            mysql> select 1 = 2;              ---条件表达式的值
            +-------+
            | 1 = 2 |
            +-------+
            |     0 |
            +-------+
            1 row in set (0.00 sec)

            mysql> select 1 = 1;                     ---条件表达式的值
            +-------+
            | 1 = 1 |
            +-------+
            |     1 |
            +-------+
            1 row in set (0.00 sec)

            mysql> select 1 + 1 from dual;        --dual表,俗称万能表                
            
            
            (8) and or not    逻辑运算
            and
                mysql> select * from t1 where id > 2 and name like 'li%';

            not
                mysql> select * from t1 where not name='lisi' ;
                mysql> select * from t1 where not name like 'lisi%' ;

            or
                mysql> select * from t1 where id > 2 or name like 'li%';
                
           (9) 列的相加:
            mysql> select name as 学生名字,math+english as 总分 from t1;
            mysql> select name as 学生名字,(math+english)/2 as 平均分 from t1;        

          (10) sum() avg() max() min() count()
            mysql> select name,sum(math),sum(english) from t1;     ---以sum(math),sum(english)为列明显示平均值
            +----------+-----------+--------------+
            | name     | sum(math) | sum(english) |
            +----------+-----------+--------------+
            | zhangsan |       215 |          252 |
            +----------+-----------+--------------+
            1 row in set (0.00 sec)
            
            mysql> select name,avg(math),avg(english) from t1;     ---以 name,avg(math),avg(english)为列明显示平均值
            +----------+-----------+--------------+
            | name     | avg(math) | avg(english) |
            +----------+-----------+--------------+
            | zhangsan |   53.7500 |      63.0000 |
            +----------+-----------+--------------+
            1 row in set (0.00 sec)
            
            mysql> select name,max(english) from t1;
            mysql> select name,min(english) from t1;
            mysql> select count(*) from t1;                  ---计算记录数量
            +----------+
            | count(*) |
            +----------+
            |        4 |
            +----------+
            1 row in set (0.00 sec)

            mysql> select max(english) - min(math) from t1;    --英语的最高分与数学最低的差距
            
          (11) 表结构的复制
            mysql> create table t3 like t1;            --复制表结构
            mysql> insert into t3 select * from t1;    --复制记录
            mysql> select * from t3;
            
          (12) 表的连接                             ----纵向连接/内连接/左连接/右连接
                  [1] 数据准备:
                mysql> create table t1(id int,name varchar(50));
                mysql> create table t2(id int,socre int);

                mysql> insert into t1 set id=1,name='lee';
                mysql> insert into t1 set id=2,name='zhang';
                mysql> insert into t1 set id=4,name='wang';

                mysql> insert into t2 set id=1,socre='90';
                mysql> insert into t2 set id=2,socre='100';
                mysql> insert into t2 set id=3,socre='90';
            
            [2] 常规查表:              ----有重复的列
                mysql> select * from t1,t2;
                mysql> select * from t1,t2 where t1.id=t2.id;
                +------+-------+------+-------+
                | id   | name  | id   | socre |
                +------+-------+------+-------+
                |    1 | lee   |    1 |    90 |
                |    2 | zhang |    2 |   100 |
                +------+-------+------+-------+
                
            [3]左连接:            ----以左表为标准,连接
                letft join=left [outer] join

                mysql> select * from t1 left join t2 ON t1.id=t2.id;
                +------+-------+------+-------+
                | id   | name  | id   | socre |
                +------+-------+------+-------+
                |    1 | lee   |    1 |    90 |
                |    2 | zhang |    2 |   100 |
                |    4 | wang  | NULL |  NULL |
                +------+-------+------+-------+
                3 rows in set (0.00 sec)


            [4]右连接:          ----以右表为标准,连接
                right join= right outer join
                mysql> select * from t1 right join t2 ON t1.id=t2.id;
                +------+-------+------+-------+
                | id   | name  | id   | socre |
                +------+-------+------+-------+
                |    1 | lee   |    1 |    90 |
                |    2 | zhang |    2 |   100 |
                | NULL | NULL  |    3 |    90 |
                +------+-------+------+-------+
                3 rows in set (0.00 sec)


            [5]内连接:                                                    -----取多表之间的交集
                mysql> select * from t1 join t2 on t1.id=t2.id;
                +------+-------+------+-------+
                | id   | name  | id   | socre |
                +------+-------+------+-------+
                |    1 | lee   |    1 |    90 |
                |    2 | zhang |    2 |   100 |
                +------+-------+------+-------+
                2 rows in set (0.00 sec)

            [6]纵向连接:                                              ---- 取表的并集,重向合并
                mysql> select * from t1 union select * from t2;
                +------+-------+
                | id   | name  |
                +------+-------+
                |    1 | lee   |
                |    2 | zhang |
                |    4 | wang  |
                |    1 | 90    |
                |    2 | 100   |
                |    3 | 90    |
                +------+-------+
                6 rows in set (0.00 sec)            
                
        (13)   子查询:                       ----select的嵌套使用
            mysql> select * from emp  where id in (select id from emp_id where id=1);
            mysql> select * from emp  where id in (select id from emp_id where id>=1);

                                                
        
    c. 数据控制语言:DCL        grant revoke         ---用户权限控制
        1) 权限分类:
            USAGE                            --无权限,只有登录数据库,只可以使用test数据库
            ALL                                --所有权限
            select/update/delete/super/slave/reload    --指定的权限
            with grant option                    --允许把自己的权限授予其它用户

        2) 权限级别:
            *.*            --全库、全表
            mysql.*        --mysql库下所有表(某库中的所有表)
            mysql.user        --mysql库中user表(单表)
            mysql.user.host    --mysql库中user表的host列

        3) 用户权限:
            对于用户username@localhost的含义
                username            --确定你被授予了什么权限
                username/password    --确定你登录时需要的账号密码,
                localhost                    --表示你可以在哪里登录(这里表示只能本机通过socket登录)
    
            用户定义的格式:
                user@localhost        --表示user只能在本地通过socket登录服务器
                [email protected]        --表示user用户只能在192.168.0.1登录数据库服务器
                [email protected]/255.555.255.0
                            --指定某个子网的主机可以登录数据库
                user@%                --表示user用户能在所有的机器上通过ip登录数据库服务器


        4)查看权限:
            mysql> show grants;    --查看自己的权限
            mysql> show grants for user02@'%';    --查看指定用户的权限 


        5)权限的作用范围(*.* database.* database.table)
            mysql> grant select,update on DB.t3 to user04@'localhost' identified by '123'; 

        6)列的授权:
            mysql> grant update (user) on mysql.user to user03@'%';
            mysql> grant update (user,host,password) on mysql.user to user03@'%';
            

        7)权限的保存位置:
            mysql.user            --所有mysql用户的账号和密码,以及对用户对全库全表权限(*.*)
            mysql.db                --非mysql库的授权都保存在此(db.*)
            mysql.table_priv        --某库某表的授权(db.table)
            mysql.columns_priv        --某库某表某列的授权(db.table.col1)
            mysql.procs_priv        --某库存储过程的授权
            
        8)    撤销权限           ---revoke,drop
            REVOKE INSERT ON *.* FROM 'jeffrey'@'localhost';    --撤消指定的INSERT权限
            REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ... --撤消所有权限

            mysql> drop user user02;        --撤消所有权限后把用户一并删除
    

        9)实例
            新建user02用户, 要求user02只能在本机登录而且对DB这个库的所有表拥有完全控制的权限:
            mysql> grant all on DB.* to user02@'localhost' identified by '123';
            mysql> select user,password,host from mysql.user;  --查看用户创建是否成功

            更改user02在所有机器上都能登录数据库.
            mysql> update mysql.user set host='%' where user='user02'; 
            mysql> flush privileges;

            让user02可以把自己的权限授予其它用户:
            mysql> grant ALL on DB.* to user02@'%' with grant option;

7. 触发器            -----在执行相应SQL语句操作前或者后触发相应动作
    create trigger <trigger_name>
    {before | after}
    {insert | update | delete}
    ON table_name
    for each row
    <触发的sql语句>       

   a. 查看当前mysql中有哪些触发器
    mysql> show triggers;        --查看当前mysql中有哪些触发器

   b. 创建触发器
    mysql> create trigger tr_test                     ---在插入表一的时候,同时插入到表2
        > after insert on testbb.t1 
        > for each row 
        > insert into testbb.t2 set time=now();

  c. 删除触发器:
    mysql> drop trigger tr_test;
    
8. 数据库数据的导入和导出
    a. 导出数据:
        mysql> select * from testbb.t1 into outfile '/tmp/testbb.t1';

    b. load data 导入数据:
        mysql> delete from testbb.t1;
        mysql> load data infile '/tmp/testbb.t1' into table  testbb.t1;

    c. mysqlimport导入数据:
        # mv /tmp/testbb.t1 /tmp/t1.txt
        # mysqlimport -uroot -p123 testbb /tmp/t1.txt
        # mysqlimport -S /d1/mysql.sock -uroot -p123 testbb /tmp/t1.txt
        testbb.t1: Records: 2  Deleted: 0  Skipped: 0  Warnings: 0
    
9. 索引                          -----提升查询速度
    # seq 1000000 >> /tmp/t2.txt
    mysql> load data infile '/tmp/t2.txt' into table t1;    --导入数据
  a. 新建索引    
    mysql> create index index_test on t1(id);        --新建索引 
    mysql> select * from t1 where id=123684;        --测试索引的速度
    +--------+
    | id     |
    +--------+
    | 123684 |
    +--------+
    1 row in set (0.00 sec)
  b. 查看索引
    mysql> SHOW INDEX FROM t1;        --查看表的索引
    
  c. 删除索引
    mysql> drop index index_test on t1;    --删除索引
    
10 .视图                   -用数据库数据拼凑成的假表,在数据库里面并不存在
    a. 创建视图
        mysql> create view view_test as select user,password,host from mysql.user;

    b. 引用视图:
        mysql> select * from view_test;

    c.  查看视图的定义内容:
        mysql> show create view view_test;
        mysql> show create table  view_test;
        
11. 主键的操作(一个表唯有一个主键,可以使用多列组合成一个主键):
    --- 前步骤见雇员表的创建实例
    a. 创建主键:
        root db001>alter table emp add primary key(id,emp_name);         ----添加不存在的列为主键
        root db001>alter table emp modify `id` int(10) unsigned NOT NULL auto_increment COMMENT '员工编号';
                                    ---修改已经存在的列为主键
        
    b. 删除主键:
        root db001>alter table emp modify `id` int(10) unsigned NOT NULL COMMENT '员工编号';
                            ---修改主键列的主键属性
        root db001>alter table emp drop PRIMARY KEY;                            ---删除主键列
            
    c. 主键/自动增长列:
        主键自动增长:
            mysql> create table t1(id int primary key not null auto_increment, name varchar(20));
        普通列自动增长:
            mysql> create table t1(id int not null auto_increment, name varchar(20),primary key(id));
            
            # for i in `seq 100`; do mysql -uroot -p147258369 -e "insert into testbb.t1 set name='test$i'"; done            

    
12. 修改表的名字
    mysql> RENAME TABLE t1 to t2;


13.     忘记root密码的操作:

    a.  mysql的用户验证逻辑:
        mysqluser-->mysqld(3306/scoket)-->(user/password/host)-->mysql.user

    b.修改root密码
        1)关闭正在运行的mysql服务器
        2)重新启mysql,但启动的过程让mysql跳过用户验证(mysql.user)--skip-grant-tables ,然后改密码
        3)安全关闭mysql,然后再启动,这样密码就被重置了。
        
        # pkill -9 mysql
        # cd /opt/mysql-glibc
        # /opt/mysql-glibc/bin/mysqld_safe --defaults-file=/data2/my.cnf --skip-grant-tables &
        mysql> update mysql.user set password=password('147258369') where user='root';               --修改密码
        # mysqladmin shutdown
        # /opt/mysql-glibc/bin/mysqld_safe --defaults-file=/data2/my.cnf &

猜你喜欢

转载自blog.csdn.net/darling757267/article/details/86062237
今日推荐