《MySQL数据库入门教程》

基础知识

数据库系统的组成

  • 数据库
    • 存储数据的容器
  • 数据库管理系统
    • 软件
      • MySQL
      • Oracle
      • SQL Sever
        • 只能在windows上运行
      • DB2
  • 数据库应用程序

SQL语言

  • 介绍
    • 用来管理数据库中的数据
    • 可以嵌套到其他语言中
  • SQL的DML和DDL
    可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL)。
    • 查询和更新指令构成了 SQL 的 DML 部分:
      • SELECT - 从数据库表中获取数据
      • UPDATE - 更新数据库表中的数据
      • DELETE - 从数据库表中删除数据
      • INSERT INTO - 向数据库表中插入数据
    • SQL 中最重要的 DDL 语句:
      • CREATE DATABASE - 创建新数据库
      • ALTER DATABASE - 修改数据库
      • CREATE TABLE - 创建新表
      • ALTER TABLE - 变更(改变)数据库表
      • DROP TABLE - 删除表
      • CREATE INDEX - 创建索引(搜索键)
      • DROP INDEX - 删除索引
    • SQL 的数据定义语言 (DDL) 部分使我们有能力创建或删除表格。我们也可以定义索引(键),规定表之间的链接,以及施加表间的约束。
  • 数据控制语言
    • grant语句
      • 给用户增加权限
    • revoke语句
      • 收回用户权限
    • commit语句
      • 提交事务
    • rollback语句
      • 回滚事务
    • MySQL权限级别介绍
      • 全局——可以管理整个MySQL
      • 库——可以管理指定的数据库
      • 表——可以管理指定数据库的指定表
      • 字段——可以管理指定数据库的指定表的指定字段
      • 权限存储在mysql库的user, db, tables_priv, columns_priv, procs_priv这几个系统表中,待MySQL实例启动后就加载到内存中

MySQL目录下的文件

  • bin目录
    • 放置可执行文件
      • mysql.exe等
  • data目录
    • 放置日志及数据库
  • include目录
    • 放置头文件
      • mysql.h等
  • lib目录
    • 放置库文件
  • share目录
    • 放置字符集、语言等
  • my.ini
    • 是MySQL正在使用的配置文件
    • MySQL数据库使用的配置文件
  • my-huge.ini
  • my-template.ini
    • 配置文件的模板

cmd下MySQL使用

  • 启动mysql服务
    • net start mysql
  • net stop mysql
  • 登录
    • mysql -h 服务器地址 -u 用户名 -p
    • 或者使用MySQL Command Line Client登录

数据库和表的操作

注意

  • 打开CMD,将工作目录切换到MySQL的bin下
  • 库名、表名需要用反引号包裹
  • 操作要记得分号结尾

常用语法

  • 查询当前数据库版本:select version();

  • 查询当前数据库:select database();

  • 查询当前数据库用户:select user();

  • 查看数据库文件存放的目录:select @@datadir;

  • 查询当前路径:select @@basedir;

    • alt 路径
  • 查询所有数据库:show databases;

  • 查询所有表名:show tables;

  • 选择一个数据库:use+数据库名;

  • 创建一个数据库:create database `数据库名`;

  • 删除一个数据库:drop database `数据库名`;

  • 创建一个表:create table 表名(字段名 数据类型 字符集);

    • alt 创建表
  • 查询一个表结构:desc 表名;

    • alt 表结构
  • 查询当前系统:select @@global.version_compile_os;

    • alt 系统
  • 修改数据库编码

    • alter database + 数据库名 default character set +编码 collate +编码_bin
      • 例:alter database test default character set gbk collate gbk_bin

对数据库用户的基本操作

  • 查询当前数据库用户:select user();
  • 查看所有用户(用户名、给谁授权):select user,host from mysql.user; 或 select mysql.user;
  • 添加用户:create user 用户名@'主机地址' identified by '密码';
  • 创建用户同时授权:grant all privileges on mq.* to 用户名@主机名 identified by '密码';
  • 设置与更改用户密码:SET PASSWORD FOR '用户名'@'主机名' = PASSWORD('新密码');
  • 删除用户:drop user 用户名@'主机地址';
  • 查看当前用户权限:show grants for 用户名@'主机地址';
  • 给用户授权:grant 权限 on 数据库名.表名 to 用户名@'主机名' (在这里加上 WITH GRANT OPTION,可以使他有赋权能力)
  • 撤销权限:revoke 权限 on 数据库名.表名 from 用户名@'主机名'
    • 每次更新权限后记得刷新权限:FLUSH PRIVILEGES;
  • 切换用户:
    使用命令 -u 用户名 -p 即可
    注意:不同用户的主机得是一样的,否则无法切换;

数据表的基本操作

  • 操作表应先指定数据库
    • use + 数据库名称;
  • 查看数据表
    • 查看所有数据表
      • show tables;
    • 查看表中字段
      • show columns from +表名
    • show create table +数据表名;
    • describe + 表名
  • 修改数据表
    • 修改表名
      • alert table + 旧表名 rename to +新表名
    • 修改字段名
      • alter table +表名 change +旧字段名+新字段名 +新数据类型(数据完整性约束条件)
    • 修改字段的数据类型
      • alter table +表名 modify +字段名 +数据类型(数据完整性约束条件);
    • 添加字段
      • alter table +表名 add +新字段 +数据类型(数据完整性约束条件);
    • 删除字段
      • alter table +表名 drop +字段名;
    • 修改字段排列
  • 删除数据表
    • drop table +表名;

对数据的操作

  • 添加数据

    • 为表中字段添加数据

      • insert into +表名 (字段名1,字段名2..) values(值1,值2,..);
        • alt 添加
      • 其他写法: INSERT INTO 表名
        SET 字段名1=值1,字段名2=值2, ..
        举例: insert into student
        set id=10,name='zhangba',chengji=72;
        • alt 添加
    • 同时添加多条记录

      • insert into +表名
        values(值1,值2,值3),(值1,值2,值3),(值1,值2,值3);
  • 更新数据

    • update
      • alt 更新
      • 利用 where控制要更新的范围
  • 删除数据

    • delete from + 表名 where id= ;
  • 为表中所有字段添加规则

    • CREATE TABLE 创建表名;
      语句中指定所有字段名规则
      语法: CREATE TABLE '表名'(字段名1,规则,
      字段名2 规则,
      ...
      );
      命令:CREATE TABLE `student`(
          id INT(3) PRIMARY KEY AUTO_INCREMENT设置整数以及主键,
          name VARCHAR字符集(20) NOT NULL不能为空,
          grade FLOAT浮点型,gender CHAR男女(2)
      );
  • 单表查询

    • select
      • 查询所有字段
        • *通配符,代替所有字段名
        • select * from + 表名
      • 查询指定字段
        • select +字段名1,字段名2 from +表名
      • 按条件查询
        • select +字段名1,字段名2 from +表名 where id= ;
      • in关键字的查询
        • in关键字用来判断某个字段的值在不在指定集合中,若在,则可被查询出
        • select 字段1,字段2 from +表名 where id in(1,2,3);
      • between and关键字查询
        • between and关键字用来判断某个字段的值在不在指定范围内,若在,则可被查询出
        • select 字段1,字段2 from +表名 where id between 2 and 4;
      • 空值查询 is null
        • select 字段1,字段2 from +表名 where id is null;
        • select 字段1,字段2 from +表名 where id is not null;
      • distinct查询
        • 过滤掉查询记录中的重复值
        • select distinct +字段名 from +表名;
      • like关键字查询
        • 判断两个字符串是否匹配
        • select 字段名1,字段名2 from +表名 where id like “c%” ;
        • select 字段名1,字段名2 from +表名 where id not like 'c%' ;
        • 匹配字符串
          • 注:若匹配的字符串中有 %和_ 则需要转义 +&或+_
          • 常规字符串
          • %通配符
            • 匹配任意长度字符串
            • 如 c%匹配以c开头的任意字符串
          • _通配符
            • 匹配单个字符
            • 如c_匹配 ca 或cb等
      • and关键字的多条件查询
        • 可使用多个查询条件(多个条件必须同时满足)
        • select 字段名1,字段名2 from +表名 where id like ‘c%’ and id < 3 ;
      • or关键字的多条件查询
        • 可使用多个查询条件(多个条件中有满足的即可)
        • select 字段名1,字段名2 from +表名 where id like ‘c%’ or id < 3 ;
  • 其他查询

    • COUNT()函数:统计记录的条数
      语法::SELECT COUNT(字段名) FROM表名
      举例:查询student表中的id字段一 共有多少条记录
      命令:select count(id) from student;
      alt 属性文本
    • SUM()函数:求出表中某个字段所有值的总和
      语法::SELECT SUM(字段名) FROM表名;
      举例:求出student表中id字段的总和
      命令::SELECT SUM(id) FROM student;
      alt 属性文本
    • AVG()函数:求出表中某个字段所有值的平均值
      语法:SELECT AVG(字段名) FROM表名;
      举例:求出student表中id字段的平均值
      命令:SELECT AVG(id) FROM student;
      alt 属性文本
  • UNION联合查询

    • UNION 操作符用于合并两个或多个SELECT 语句的结果集
    • 注意:UNION 内部的SELECT 语句必须拥有相同数量的列。且第一个 SELECT 语句中被使用的字段名称也被用于结果的字段名称。列也必须拥有相似的数据类型。同时,每条SELECT 语句中的列的顺序必须相同。
    • 如 select version() union select id from users;
      version()的查询结果是int型,且只有一列,所以 union 之后的那个select查询结果也必须只有一列,而且数据类型也需要类似 int
      • alt 联合查询

mysql常用函数

  • concat(str1,str2 … … ); 没有分隔符的连接字符串
    • alt
    • 如果连接串中存在NULL,则返回结果为NULL;
      • alt
  • concat_ws(separator,str1,str2… … );该函数第一个参数是其他参数的分隔符,分隔符在连接字符串之间加入。分隔符可以是一个字符串,也可以是其它参数。
    • alt
    • 分隔符为NULL,则返回结果为NULL;
    • 如果参数中存在NULL,则会被忽略;
      • alt
    • 可以对NULL进行判断,并用其它值进行替换
      • alt
  • group_concat(str1,str2… … );将多行查询的结果以逗号为分隔符连接成为一
    行结果。
    • 在注入时,由于回显位的问题,concat() 不能一次性将多行内容展示出来,需要使用 limit 控制挨个去显示,这时使用 group_concat(),可将多行内容在一行显示。
      • alt

MySQL其他姿势(sql注入常用)

  • 构造永真,爆出字段下的所有内容
    alt
  • 当查询的值为true时,可正确查询
    alt
  • 特殊的查询结构id=1=(1)=1
    (该结构可以用来fuzz,只需要替换括号里的内容)
    select name from users where id=a=(b)=c
    b、c的值,只能为1或0,也可以是true或false
    当b、c的值均为1或0时,等价于id=a
    当b或c中有一个为0时,就会查询出,除id=a之外的字段下的其他值
    alt
    alt

导出数据

  • mysqldump –opt test > mysql.test
    • 即将数据库test数据库导出到mysql.test文件,后者是一个文本文件
      如:mysqldump -u root -p 123456 --databases dbname > mysql.dbname
      就是把数据库dbname导出到文件mysql.dbname中。

导入数据

  • source D:ceshi.sql
    • 这是sql文件存放的地址
原文地址:https://www.cnblogs.com/hacker-snail/p/13837338.html