美文网首页
数据库 mysql 命令(总结)与正则

数据库 mysql 命令(总结)与正则

作者: 恬恬i阿萌妹O_o | 来源:发表于2018-08-12 20:54 被阅读0次

    Ubuntu下安装mysql
    apt update
    sudo apt-get install mysql-server mysql-client
    启动 service mysql start
    停止 service mysql stop
    重启 service mysql restart
    查看mysql服务状态 service mysql status
    允许远程连接
    找到mysql配置文件并做如下修改:允许远程连接
    sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
    刷新权限 FLUSH PRIVILEGES;
    退出命令行 exit quit
    进入mysql mysql -u root -p;
    创建数据库

    1. 直接创建:create database 名称;(这样会使用mysql默认的字符集)  create schema 名称;
    2. 通过字符集来创建: create database 名称 charset=utf8;
    3. 创建数据库前判断数据库是否存在: create database if not exists 名称;
      查看数据库:show databases;
      选择数据库:use 数据库名称;l
      查看当前所在数据库:select database();
      1
      删除数据库:例如:drop database 数据库名称;
      如果删除的数据库不存在,则会报错,的解决方:例如:drop database if exists 名称;

    查看所有的字符集:show charset;
    查看当前数据库编码格式: show variables like 'character_set_database';
    添加数据库的utf8默认编码:alter database 数据库名 character set utf8;
    查询MySQL中支持的存储引擎 show engines;
    查看数据库的默认的搜索引擎:show variables like ' default_storage_engine ';
    修改默认存储引擎 set default_storage_engine=innodb
    创建表:create tables 表的名字;列表的名字和定义用逗号隔开;(userid int not null auto_increment),(name char(10) not null);
    查看表:show tables;
    查看表的详细信息:show create table 名称;
    查看表的结构:desc 数据表名;
    查看某一列的的结构: desc 数据表名 列名; 例如: desc oppo name;
    创建表时如果一个表存在的时候还创建,应在表名后给出 if not exists 检查表是否存在,仅在表名不存在的时候创建它;
    自增长:auto_increment ;
    主键:primary key;
    设置默认值:default
    例如:phone varchar(11) not null default '12345678909';

    更新表时:alter table ;
    添加新字段(列):例如:alter table 表名 add age int default 10;
    修改字段的值: alter table 表名 modify 字段 修改后的类型;
    修改字段名(列):alter table 表名 change 旧字段名 新字段名 数据类型 约束 属性;
    在不改变旧字段名的情况下修改(类型,复制);
    例如:alte table 表名 change modify 字段名,匹配;类型 约束 属性;
    删除字段(列):例如:alter table 表名 drop phone ;
    修改表名:例如:alter table 旧表名 rename as 新表名;
    修改表:alter table 表名 charset=.......;
    重名表名:例如:rename table 旧表名 To 新表名;
    删除表:例如:drop table 表名;
    删除一个不存在的表会报错,如果不报错如下;
    例如:drop table if exists 数据表名;
    复制表:例如:create table if not exists 原名字 like 复制后的新名字;
    crud  对表的增删改查
    增 insert into (注意:我们插入的数据顺序必须要跟列对应)
    1.完全插入:例如:insert into 表名 values( 108401,' 小甜甜 ', 20,1,' 1245678999 ');
    2.选择插入:例如:insert into 表名(userid,name,age) values( 10000,' 花花 ',19);
    3.多行插入:例如:insert into 表名(userid,name) values(19999,' 葡萄 '),(18888,‘ 辣椒 ’);
    查看已经插入的数据 select * from 表名 (表示所有);
    将一个表复制到另一个表中 insert into 新表 (列名,列名...) select 列名,列名... from 原表 ;
    修改 跟新 update
    1.跟新单个字段(列) update 表名 set name = '娜娜' , age = 19 where id = 12345;
    2.跟新多行 : update 表名 set name = ' 娜娜 ' ;(修改表中某一列的全部值 尽量不要去做)
    3.跟新多个字段(列) update 表名 set name = ' 娜娜 ', age = 19 where id = 18888 ;
    删除数据 delete
    删除特定的一行:例如:delete from 表名 where id = 10010 ;
    删除所有行:例如:delete from 表名 (不能轻易做);
    查询
      查询所有 select * from 表名 ;
      查询某一个 select * from 表名 where id = 13333 ;
      查询年龄这个列 select age from 表名 where id = 19999;
    使用限定的方式查找,不进入数据库就可以查询到表的信息
      select * from 数据库名.表名;
    使用 distinct 去重,返回不重复的列的值
      select distinct age from 表名;
    把一个表插入到另一个表中:例如:insert into 表 (列名,列名...) select 列名,列名... from 表
    数据库的查询 where(过滤)
      查询一行 select * from 表名 where age = 6  ;
    select 字段名 from 表名 WHERE 条件;
    where 条件查询和运算符 
      = 等于 select * from 表名 where age = 6 ;
    <> 不等于, != 不等于,
      < 小于, <= 小于等于, > 大于, >= 大于等于,
      between ... and 在两者之间(包含边界值);(左右闭合)
    例如:select name ,age from 表名 where age between 5 and 30 ;
      is null 判断某一列的数据,如果包含null ,则返回记录;
      例如:select * from 表名 where phone is null ;
    and 链接查询条件,查询的数据要全部满足
      例如:select name from 表名 where userid>=18004 and age>99;
    or 链接查询条件,查询的数据只要满足其中一个即可
      例如:select name from 表名 where userid>=18004 or age>90;
    in 操作符 (相当于 or ) in (条件1,条件2,条件3);
      SELECT name FROM customers WHERE userid IN(10011,10013);   
    NOT操作符
      例如:> select name from 表名 where userid not in(10011,10013);
    排序 order by
    升序(asc): 例如:select * from 表名 order by age(列)(默认的是升序的);
    降序(desc): 例如:select * from 表名 order by age(列)desc;
    多个列做排序:例如:select * from 表名 order by 列(asc|desc),列(asc|desc);
    聚合函数
    count(
    ) | count(1) :计算所有行;
    avg() :计算列的平均值;
    max() :计算列的最大值;
    min() :计算列的最小值;
    sum() :求和 ,计算列的总和;
    通配符
    % :匹配任意字符,任意次数;
    _ : 匹配任意字符,必须有仅且有一次;
    一般和ike配合使用
    select 列 ,列 from 表名 where 列 like ‘赵%’;
    select 列 ,列 from 表名 where 列 like ‘赵%’;
    正则
    . 匹配任意1个字符(除了\n)
    [ ] 匹配[ ]中列举的字符
    \d 匹配数字,即0-9
    \D 匹配非数字,即不是数字
    \s 匹配空白,即 空格,tab键
    \S 匹配非空白
    \w 匹配单词字符,即a-z、A-Z、0-9、_
    \W 匹配非单词字符
    * 匹配前一个字符出现0次或者无限次,即可有可无
    + 匹配前一个字符出现1次或者无限次,即至少有1次
    ? 匹配前一个字符出现1次或者0次,即要么有1次,要么没有
    {m} 匹配前一个字符出现m次
    {m,n} 匹配前一个字符出现从m到n次,最少m次,最大n次
    非贪婪模式匹配:尽可能少的匹配
    转义符号 \
    ^ 匹配字符串以...开头
    $ 匹配字符串以...结尾
    | 匹配左右任意一个表达式
    (ab) 将括号中字符作为一个分组
    \num 引用分组num匹配到的字符串
    (?P<name>) 分组起别名
    (?P=name) 引用别名为name分组匹配到的字符串
    python re 模块
    complie: 生成一个正则匹配规则对象。
    match:丛起始位置匹配,单次匹配,如果匹配不成功直接返回none,如果匹配成功就立即返回,
    ,取值使用group();
    search:从头开始匹配,在整个字符串中查询,只要符合规则就立即返回,
    单词匹配,如果不符合返回NONE ;
    sub:字符串替换;
    split:分割字符串,返回列表;
    findall:在整个串中,返回所有符合规则的结果,是一个列表;
    finditer:跟findall功能一样,都是匹配出所有符合正则规则的结果,返回结果有区别,返回的是一个可迭代对象;
    r:原始字符串;
    \:转义符;
    分组 group by
    单单只是用分组没有意义;
    分组跟聚合函数的使用,统计每一个分组下有多少人(有多少条记录)
    SELECT count() as total,age FROM studentinfo GROUP BY age;
    统计分组的信息
    SELECT count(
    ), avg(age),min(age),sum(age),gender FROM studentinfo GROUP BY gendeou
    group by 与 group_concat(列)(表示分组之后)
    group_concat(字段名)可以作为一个输出字段来使用,
    表示分组之后,根据分组结果,使用group_concat()来放置每一组的某字段的值的集合
    SELECT gender,group_concat(student_name),group_concat(age) FROM studentinfo GROUP BY gender;
    group by + with rollup (统计总数)
    在最后新增一行,来记录当前列里所有记录的总和
    SELECT gender,count() FROM studentinfo GROUP BY gender with rollup;
    having过滤分组,
    每个分组下的记录(行)大于2,才返回
    SELECT count(
    ),age FROM studentinfo GROUP BY age HAVING count() >2;
    SELECT count(
    ),age,gender FROM studentinfo GROUP BY age,gender HAVING gender =1 ;
    跟order by 配合使用
    SELECT count(),age,gender FROM studentinfo GROUP BY age,gender HAVING gender=1
    ORDER BY age DESC;
    having后跟多条件筛选分组
    SELECT count(
    ),age,gender FROM studentinfo GROUP BY age,gender HAVING gender=1
    AND age > 67 ORDER BY age DESC;
    限定查询 limit
    1.如果LIMIT 后面只跟了一个数字,表示限制返回多少条,并且从第一条开始。
    SELECT * FROM studentinfo LIMIT 6; => SELECT * FROM studentinfo LIMIT 0,6;
      2.如果LIMIT 后面只跟了两个数字,第一个数字表示偏移量(不包含当前数字对应的这一行),
    后一个数字表示限制返回多少条。
    SELECT * FROM studentinfo LIMIT 6,6;

    从第6条开始查询,返回6条结果。不包含第六条。返回(7条-12条)

       select * from 表名 limit 7,12;
    

    我们如何去实现一个分页功能,输入对应的页码m,每一页返回20条数据,

       SELECT * FROM studentinfo LIMIT (m-1)*20,20
    

    取年龄最大的

       SELECT * FROM studentinfo ORDER BY age DESC LIMIT 1;
    

    取年龄最小的

       SELECT * FROM studentinfo ORDER BY age LIMIT 1;
    

    限定条件返回结果(LIMIT)

      SELECT count(*),age,gender FROM studentinfo GROUP BY age,gender HAVING gender=1 ORDER BY 
       age DESC LIMIT 2,2;
    

    查询语句的顺序:
    SELECT 列,列 FROM 表名 WHERE 条件 GROUP BY 列,列 HAVING 条件 ORDER BY 列
      (ASC|DESC) LIMIT start,count;
    回顾
    关于自增的扩展:
    可以设置设置auto_increment一个起始值
    ALTER TABLE 表明 AUTO_INCREMENT=180460
    改变自增的步长
    1.会话级别:
    show session variables like 'auto_inc%';
    +--------------------------+-------+
    | Variable_name | Value |
    +--------------------------+-------+
    | auto_increment_increment | 1 |
    | auto_increment_offset | 1 |
    +--------------------------+-------+
    修改步长:
    SET SESSION auto_increment_increment=2(设置步长的值)
    2.基于全局的设置:
    show global variables like 'auto_inc%';
    +--------------------------+-------+
    | Variable_name | Value |
    +--------------------------+-------+
    | auto_increment_increment | 1 |
    | auto_increment_offset | 1 |
    +--------------------------+-------+
    修改步长:
    SET global auto_increment_increment=2(设置步长的值)
    总结:
    一个表里面只能有一个自增,并且一般都会设置主键为自增,
    不然会报错:
    ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key

    创建计算字段

       创建的计算字段原本并不存在我们的表里面。我们通过mysql的函数或者算术运算得到一个结果,
       我们把这个结果起一个别名,这个字段就是我们创建的计算字段。
    

    加密函数

       1.PASSWORD('')     2.MD5('')
    

    创建计算字段

       1.IF(x1,v1,v2) : x1:表示条件,如果满足返回v1,否则返回v2
       2.IFNULL(v1,v2) :if v1 not NUll,返回v1,否则返回v2
       3.CASE WHEN 条件 THEN 结果1 ELSE 结果2 END:当遇到某种条件,
       当WHEN后面的条件满足,返回THEN后面的结果1,否则返回结果2.
    

    还有数字函数、字符串函数、日期、时间函数

    三范式 、E-R

    三范式
    1NF:列不可再分(尽量细的去拆分每一列)
    2NF:1.一个表必须要有一个主键(这个主键可以由单个列,或者多个列组成)
       2.非主键的列,必须完全依赖于主键,而不是及部分依赖于键
    3NF:在第二范式的基础上,不能存在传递依赖,非主键的列,必须直接依赖于主键,而不能存在传递依赖的关系。
    E-R模型
    E:Entry 表示实体,其实就是根据某一个事物的体征,添加描述信息,我们将这些描述信息添加
    在一个表(table)里面,那么这个表就相当于一个实体。
    R:Relationship 关系,在这里其实就是指的表与表之间的关系
    一对一:个人信息与身份证的信息例子;
    一对多:班级与学生的例子;
    多对多:很多学生选课的例子;
    一对一:个人信息与身份证
      个人信息表
      create table userinfo(
    id int auto_increment,
    name varchar(10) not null,
    idcard int not null,
    primary key(id),
    #外键:
    CONSTRAINT FK_IDCARD(起个名字) FOREIGN KEY(idcard) REFERENCES IDENTIFITY(id)
    );
      身身份证表ID
    CREATE TABLE IDENTIFITY(
    id int auto_increment,
    id_num varchar(50) not null,
    primary key(id)
    );
    一对多:班级与学生
    学生表
    CREATE TABLE studnets(
    stu_id int auto_increment,
    stu_name varchar(20) not null,
    #班级
    primary key(stu_id)
    );
    班级表
    CREATE TABLE grade(
    cls_id int auto_increment,
    cls_name varchar(20) not null,
    cls_desc varchar(255) not null,
    cls_student_num int default 0,
    primary key(cls_id)
    );
    多对多:选课
    学生表
    CREATE TABLE studnets(
    stu_id int auto_increment,
    stu_name varchar(20) not null,
    #班级
    primary key(stu_id)
    );

    课程
      CREATE TABLE courses(
    cour_id int auto_increment,
    cour_name varchar(20) not null,
    primary key(cour_id)
    )
    如何设置外键?
    1.首先要找表与表之间的关系。
    2.班级表(id,name,主键为id)
    3.学生表(id,name,主键id,clsid(外键)->班级表中的班级的主键)
    创建学生表必须要有班级表
    创建班级表
    CREATE TABLE classes(
    id int auto_increment,
    name varchar(20) not null,
    primary key(id)
    )engine = innodb default charset=utf8
    CREATE TABLE students(
    id int auto_increment,
    name varchar(20) not null,
    clsid int,
    primary key(id),
    constraint FK_CLSID foreign key(clsid) references classes(id)
    );

    删除外键

    ALTER TABLE students drop foreign key FK_CLSID;

    添加外键

    ALTER TABLE student ADD constraint FK_CLSID foreign key(clsid) references classes(id);

    7]

    相关文章

      网友评论

          本文标题:数据库 mysql 命令(总结)与正则

          本文链接:https://www.haomeiwen.com/subject/qcwcbftx.html