zoukankan      html  css  js  c++  java
  • MySQL学习笔记

    数据库

    1. 数据库服务器:运行数据库管理软件的计算机
    2. 数据库管理软件:mysql,oracle,db2,sqlserver
    3. 库:文件夹
    4. 表:文件
    5. 记录:食物一系列典型的特征
    6. 数据:描述事物特征的符号
    • 数据库的分类:

      • 关系型:sqllite,db2,oracle,access,sqlserver,mysql,关系型数据库需要有表结构
      • 非关系型:mongodb,redis,memcache:key-vavle结构存储
    • 统一字符编码

      • utf-8
    • 初识SQL语句

    操作文件夹(库)
        增:create database db1 charset utf-8;
        查:show create database db1;查看所有show databases;
        改:alter database db1 charset gbk;
        删:drop database db1;
    操作文件(表)
        切换文件夹: use db1;
        查看当前所在文件夹:select database;
        增:create table t1(id int,name char);
        查:show create table t1;查看所有表:show tables;desc t1;
        改:alter table t1 modify name char(6);
        删: drop database db1;
    操作文件内容(记录)
        增:insert t1(id,name)values(1,'egon'),(2,'egon2');
        查:select id,name from t1;(必须切换到当前库目录,否则需要增加库前缀)
        改:updata db1.t1 set name='SB';updata db1.t1 set name='ALEX' where id=1;
        删:delete from t1;delete from t1 where id =2;
    

    库操作:

    • 语法:
    操作文件夹(库)
        增:create database db1 charset utf-8;
        查:show create database db1;查看所有show databases;
        改:alter database db1 charset gbk;
        删:drop database db1;
    

    表操作:

    • 存储引擎就是存储表的类型,查看mysql支持的存储引擎:show engines;
    • 指定表类型/存储引擎
    create table t1(id int)engine=innodb;
    create table t2(id int)engine=memory;
    
    语法:
    create table 表名(字段名 类型[()])
    ...
    
    
    
    数据类型
    * 整数类型:
    
    字符类型
    枚举类型和集合类型
    约束条件not null 与default
    * create table t1(id int(11)unsigned);在int确定数据类型后附加的约束条件
    * not null:不能为空如果传空了就是默认值default
    * create table t2(
        id int,
        name char(6)
        sex enum('male','female')not null default 'male'
        );
    
    约束条件unique key:传入的值是唯一的
    * create table department(id int,name char(10) unique);
    * create table department(id int,name char(10),unique(id),unique(name));
    * 联合唯一:create table services(id int,ip char(15),prot int,unique(id),unique(ipprot));
    
    约束条件:primary key
    * 约束:not null unique
    * 存储引擎(innodb):对于innodb存储引擎来说,一张表内必须有一个主键
    * 单列主键
        * create table t17(id int primary key,name char(16));
    * 复合主键
        * create table t18(ip char(15),port int,primary key(ip,port));
    
    约束条件auto_increment:自增
    * create table t19(id int primary key auto_increment);在插入字段的时候只需要插入数据,id会自增
    * auto_increment步长与起始设置:
        * 查看:show variables like 'auto_inc%'
        * 设置步长:
            * set session auto_increment_increment=5;
            * set global auto_increment_increment=5;
        * 设置起始偏移量:
            * set global auto_increment_offset=3;
        * 起始偏移量<=步长
    * 使用delete表清空后,会记录上次自增到什么位置,再传值的时候会从上次结束的地方开始
    * 使用truncate清空表后不会出现上述情况
    
    约束条件foreign key建立表之间的关系
    * 先建被关联的表,并且保证被关联的字段是唯一的,再建关联的表
        * create table dep(id int primary key,mame char(16),comment char(6));
        * create table emp(id int primaty key,name char(10),sex enum('male','female'),dep_id int,foreign key(dep_id) references dep(id)); 
    * 插入数据:
        * 先往被关联的表插入记录
        * 再往关联表插入记录
    * 删除数据:
        * 先删除关联的数据
        * 再删除被关联的数据
        * 在建立关联表时:在foreign ket加上 on delete cascade与on update cascade 没有逗号
    * 尽量不要去建立表关系,为了方便扩展尽量在逻辑层面去设计表关系
    
    表关系之多对一
    * 一个表的多条记录对应另外一个表的一条记录
    
    表关系之多对多
    * 一个表的一条记录对应另一个表的多条记录,并且另一个表的一条记录对应一个表的多条记录,解决方法是建立一个中间表,存放两个表之间的表关系
    
    表关系一对一
    * 一一对应的关系
    

    记录的增删该查

    插入数据:
    1. 插入完整数据(顺序插入)
        语法一:
        INSERT INTO 表名(字段1,字段2,字段3…字段n) VALUES(值1,值2,值3…值n);
    
        语法二:
        INSERT INTO 表名 VALUES (值1,值2,值3…值n);
    
    2. 指定字段插入数据
        语法:
        INSERT INTO 表名(字段1,字段2,字段3…) VALUES (值1,值2,值3…);
    
    3. 插入多条记录
        语法:
        INSERT INTO 表名 VALUES
            (值1,值2,值3…值n),
            (值1,值2,值3…值n),
            (值1,值2,值3…值n);
    
    4. 插入查询结果
        语法:
        INSERT INTO 表名(字段1,字段2,字段3…字段n) 
                        SELECT (字段1,字段2,字段3…字段n) FROM 表2
                        WHERE …;
    
    更新数据
    语法:
        UPDATE 表名 SET
            字段1=值1,
            字段2=值2,
            WHERE CONDITION;
    
    示例:
        UPDATE mysql.user SET password=password(‘123’) 
            where user=’root’ and host=’localhost’;
    
    删除数据
    语法:
        DELETE FROM 表名 
            WHERE CONITION;
    
    示例:
        DELETE FROM mysql.user 
            WHERE password=’’;
    
    练习:
        更新MySQL root用户密码为mysql123
        删除除从本地登录的root用户以外的所有用户
    

    单表查询

    #语法
    SELECT 字段1,字段2... FROM 表名
                        WHERE   条件
                        GROUP BY field
                        HAVING 筛选
                        ORDER BY field
                        LIMIT 限制条数
    
    关键字的执行优先级:
    from 找到表 
    where   拿着where指定的约束条件,去文件/表中取出一条条记录
    group by    将取出的一条条记录进行分组group by,如果没有group by 则整体作为一组
    having      将分组的结果进行having过滤
    select      执行select
    distinct    去重
    order by    将结果按条件排序
    limit       限制结果的显示条数
    
    • where 约束:where字句中可以使用:

      • 比较运算符:> < >= <= <> !=
      • between 80 and 100 值在80到100之间
      • in(80,90,100)值是80或90或100
      • like 'engo%'
        pattern可以是%或_,%表示任意多字符,_表示一个字符
      • 逻辑运算符:在多个条件直接可以使用逻辑运算符 and or not
    • group by

      • 分组:按照某个相同的字段进行分类,分组发生在where之后,即分组是基于where之后得到的记录而进行的
      • 分组之后,只能取分组的字段,以及每个组聚合结果
      • select post from employee group by post;
      • 聚合函数
    max 最大
    min 最小
    avg 平均
    sum 求和
    count   计数
    #每个职位有多少个员工
    select post count(id) from employee group by post;
    select post,group_concat(name) from employee group by post;得出每个分组中的人数
    
    
    * 如果我们用unique的字段作为分组依据,则每条记录自成一组,这种分组没有意义,多条记录之间的某个字段值相同,该字段通常用来作为分组的依据
    * 如果没有group by则默认整体算作一组
    
    • having过滤条件:在分组之后进行过滤

    • order by排序

    asc 升序
    desc 降序
    select * from employee order by age asc;按照年龄升序
    select * from employee order by age desc;按照年龄降序
    
    • limit限制打印到屏幕上的条数
    select * from employee limit3;
    
    • 正则查询
    select * from employee where name regexp '^jin';
    

    多表查询

    连表操作:
    # 内连接:只取两张表的共同部分
    select * from employee inner join department on employee.dep_id = departement.id;
    # 左连接:在内连接的基础上保留左表的记录
    select * from employee left join department on employee.dep_id = departement.id;
    # 右连接:在内连接的基础上保留右表记录
    select * from employee right join department on employee.dep_id = departement.id;
    # 全外连接:在内连接的基础上保留左右两个表没有对应关系的记录
    使用union将左连接与右连接组合在一起
    
    子查询
    #1:子查询是将一个查询语句嵌套在另一个查询语句中。
    #2:内层查询语句的查询结果,可以为外层查询语句提供查询条件。
    #3:子查询中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等关键字
    #4:还可以包含比较运算符:= 、 !=、> 、<等
    #5: 带EXISTS关键字的子查询
        EXISTS关字键字表示存在。在使用EXISTS关键字时,内层查询语句不返回查询的记录。
        而是返回一个真假值。True或False
        当返回True时,外层查询语句将进行查询;当返回值为False时,外层查询语句不进行查询
    

    权限管理

    创建账号:
    • 本地账号
    create user 'wualin'@'localhost'
    
    • 远程账号
    #创建用户
    create user 'egon'@'1.1.1.1' identified by '123';
    create user 'egon'@'192.168.1.%' identified by '123';
    create user 'egon'@'%' identified by '123';
    
    #权限
    user:放行db1,db2及其包含的所有
    db:放行db1,及其db1包含的所有
    tables_priv:放行db1.table1,及其该表包含的所有
    columns_prive:放行db1.table1.column1,只放行该字段
    
    #授权
    #针对所有库的授权:*.*
    grant select on *.* to 'egon1'@'localhost' identified by '123'; #只在user表中可以查到egon1用户的select权限被设置为Y
    
    #针对某一数据库:db1.*
    grant select on db1.* to 'egon2'@'%' identified by '123'; #只在db表中可以查到egon2用户的select权限被设置为Y
    
    #针对某一个表:db1.t1
    grant select on db1.t1 to 'egon3'@'%' identified by '123';  #只在tables_priv表中可以查到egon3用户的select权限
    
    #针对某一个字段:
    grant select (id,name),update (age) on db1.t3 to 'egon4'@'localhost' identified by '123';
    
    #删除权限
    revoke select on db1.* from 'egon'@'%';
    
  • 相关阅读:
    n9多媒体不显示图片处理方法
    STM32全球唯一ID读取方法
    VS2008+QT+CYAPI开发USB程序问题
    QT对话框中show和exec的区别
    华硕T20信号差的解决办法
    使用JTAG方式配置EPCS芯片时显示容量不够的解决方法
    QT中使用中文
    MODBUS CRC16
    递归的四条基本法则
    Java代码混淆和加密Jocky
  • 原文地址:https://www.cnblogs.com/wualin/p/9904741.html
Copyright © 2011-2022 走看看