MySQL基础知识点

数据库系统 DBS

    数据库 DB

    数据库管理系统 DBMS

    数据库管理员  DBA Database       

    Administrator

 

关系型数据库

    以行和列的形式存储数据,这一系列的行和列被称为表,一堆表组成了库,一堆库组成数据库服务器

非关系型数据库 ----nosql  not only spl

    09年左右兴起的东西,redis

 

SQL结构化查询语言

    数据定义语言(DDL)

    数据操作语言(DML)

    数据查询语言(DQL)

    数据控制语言(DCL)

连接mysql

    mysql -u用户名 -p密码 -h主机

    mysql -uroot -p

常见的操作

    显示帮助信息:\h

    \q  退出当前客户端

    \s  显示当前服务器信息

    \cctrl+c 结束当前末完成的操作

    \G  将查询后的数据立起来

    \d  修改命令执行符

-- 链接数据库

mysql -u用户名 -p

 

-------库相关操作--------

---查看所有数据库

show databases;

---创建数据库

create database 库名;

create  database if not exists 库名;

---删除数据库

drop database 库名;

drop database if exists 库名;

---选择数据库

use 库名

 

-----------表的相关操作------

--查看所有数据表

show tables;

--创建数据表

create table 表名(

    字段1 类型,

    字段2 类型

    。。。

)engine=innodb default charset=utf8

注意:字符集为utf8,不是utf-8

--查看表结构

desc 表名;

--查看建表语句

show create table 表面;

--删除表

drop table 表名;

 

---------数据的相关操作-------------

--插入数据

insert into 表名(`字段1`,`字段2`...) value('1','2'...);

insert into 表名 value('1',...);

这种方式一定要将所要的字段都对于上值

 

--查询数据

select `字段1`,`字段2`...from 表名;

select * from 表名;

--修改数据

update 表名 set `字段1`='1',`字段2`=`2`...where 条件;

--删除数据

delete from 表名 where 条件;

---

注意:修改和删除必须加条件,否则就是耍流氓!

 

----------------

数据库的备份和还原--------

---cmd想操作

---导出数据库

mysqldump -u用户名 -p 库名 >路径

mysqldump -uroot -p gz24 > c:/gz24.sql

---还原数据

--导入1:在cmd下操作

mysql -u用户名 -p 库名 < 文件路径

mysql -uroot -p gz24 < c:/gz24.sql

--导入2:在进入mysql并选择了数据库的情况下

source 文件路径

 

权限相关

    修改密码

    方式1:在cmd操作

    mysqladmin  -u用户名 -p password 新密码

 

    方式二:在进入mysql的情况

    set password for 用户名@主机=password('123');

    

    方式3:修改mysql库中的user用户表

        upadte user set authentication_string=password('abc') where user = 'root';

        刷新服务器

        flush privileges

    注意:低版本的密码字段不是authentication_string,password;改完之后要记得刷新服务器

 

    添加用户

    grant selsect,update,insetr,delete on 库名.表名 to 用户名@主机名 identified by '密码';

 

    例子:

    grant all privileges on *.* to

    hehe@localhost identified by '123';

 

创建数据表

    create table 表名(

        字段1 类型

    );

 

整型

    tinyint

        取值范围

            有符号: -128~127

            无符号:0~255

        可以用于存年龄、标记,比如商品的状态:1新添加,2表示在售中,3已下架;订单状态、性别

    smallint

    mediumint

    int

        取值范围

            有符号:正负二十多个亿

            无符号:0~40多个亿

        用于计算、时间戳

    bigint

    注意:

        1.存入小数会四舍五入

        2.超出取值范围报错

            非严格模式下,取最大值存入

        3.int(5)表示的只是显示宽度,并不是限定只能插入5位数,它具体取值范围,由类型所决定

 

浮点型

    float(浮点型)

    double(双精度)

        可以表示的范围更广,精度更高

    decimal(定点数)

        默认为(10,0)

        float更精确

 

    注意:

        1.当小数超出规定长度,采用四舍五入保存

        2.超出整数范围,报错,无法插入

    建议:涉及金钱的存储用int,取出后除以100进行计算;

 

字符串

    char(定长)

        取值范围:0~255

        定长:char(10)表示固定的占10个字节,哪怕你存的是abc,在存储的时候占的空间也是10个字节

        什么时候定长?

        手机号、邮编、md5的密码(32)

    varchar(变长)

        取值范围:0~65535

        变长:varchar(10)表示最大只能存10个字符,但是你存个abc,实际占的字节数是4,引文它需要用1个字节来表示字符串的长度,还需要用1个字节来表示是否为null

    注意:

        1.字符串的值必须要加引号(单双引号都可以)

        2.不管是char还是varchar超出指定长度都不行

        3.char会截取掉后面的空格,而varchar不会

        4.char(10)或者varchar(10)表示是10个字符,而不是10个字节,存储时实际占用的字节数跟字符集相关。

    text

        用于存储大文本,比如一篇文章、简介信息等等

枚举

    enum

 

集合

    set

 

    总结:

        1.取值范围需要在建表的时候显式指定,超出集合范围报错,无法插入

        2.enum类型允许有0~65535个成员;对于1-255个成员,需要占1个字节存储,对于256~65535个成员需要用2个字节储存

        3.枚举不区分大小写

        4.set可以选多个成员,枚举只能选1个成员

        5.set类型可以设置64个成员

            1~8     1个字节

            8~16    2个字节

            17~24   3个字节

            25~32   4个字节

            33~64   8个字节

日期和时间

    我们通常使用时间戳来表示日期和时间,时间戳用int类型存储

date类型

 

数据字段的属性(字段的约束)

    unsigned(常用)

        用于表示无符号,可以改变某些类型的取值范围

        注意:unsigned必须紧跟在类型的后面

    zerofill

        用于设置显示宽度不足的时候自动填充0

    auto_increment(重要)

        用于表示自增,通常我们的ID就是自增的

        1.会产生一个唯一的标识或顺序值,值一般从1开始

        2.mysql会找出出现过的最大的值加1,作为下一次的自增值

        3.插入null会自增

        注意:auto_increment必须加在

        primary key或者unique的字段上;

        ☆:往primary key的字段上插入数据时,就算其中一条错导致报错,其他对的数据也会正常插入

 

    nullnot null

        默认为null,如果知道了not

        null,则添加数据时,必须要给它指定值

    default

        设置字段的默认值

 

--数据库的索引

索引是数据库中用来提示搜索性能的,做数据库优化的时候,第一步想到就是索引的优化。

 

    索引的分类

        1.常规索引

            index,最基本的索引,没有任何限制

            创建:

                create table 表名(

                    ....

                    index 索引名(要索引的字段)

                    );

            添加:

            create index 索隐名 on 表名(

                字段名)

            删除:

            drop index 索引名 on 表名;

        2.唯一索引

            unique,与普通索引类似,但是表示这一列的值不能有重复的

            创建:

            create table 表名(

                字段 类型 约束 unique,

                unique 索隐名(字段名)

                );

            删除:

            drop index 索引名 on 表名(字段名);

            添加:

            create unique index 索引名 on 表名(字段名);

 

        3.主键索引

            primary key,与唯一索引类似,也是用于表示唯一;一张数据表只能有1个主键索引

            创建:

            create table 表名(

                字段 类型 约束 primary key);

            create table 表名(

                字段 类型 约束,

                primary key(字段名)

                );

            删除:

            alter table 表名 drop primary key;

            添加:

            alter table 表名 modify 字段 类型 约束 primary key;

 

            4.全文索引

-- 存储引擎

    mysql中常用的存储引擎就两种:myisaminnodb

    基本的差别:

        1.myisam不支持事物处理、外键等高级特性,而innodb支持

        2.myisam强调的是性能,其执行速度比innodb略块

        3.myisam是表锁,innodb是行锁

 

-- 字符集的设置

    mysql的字符集分为4个级别:

        服务器基本

        库级别

        表级别

        字段级别

 

    库级别

        1.查看数据库的字符集

        show create database 库名;

        2.建库的时候指定字符集

        create database hehe default charset=utf8;

        3.修改库的字符集

        alter database gz24 default charset=utf8;

 

    表级别

        1.查看表的字符集

        show create table s1;

        2.建表的时候指定字符集

        参考之前的代码

        3.修改表的字符集

        alter table s1 default charset=utf8;

        注意:没有指定字符集的时候,默认是向上继承

 

--表的修改

    1.修改表的名字

    alter table 旧表名 rename 新表名

    2.改字段的类型

    alter table s1 modify name char(30) not null;

    3.改字段名

    alter table s1 change username name varchar(30) default 'no';

    4.添加新字段

    alter table s1 add sex enum('m','w','y') not null default 'm';

    alter table s1 add des varchar(255) first;

    alter table s1 add des2 varchar(255) after id;

    5.删除字段

    alter table s1 drop des2;

    6.修改表的存储引擎

    alter table s1 engine=myisam;

    7.修改表的字符集

    alter table s1 charset=utf8;

    alter table s1 default charset=utf8;

 

--数据操作语言(DML)

    1.insert

        1.可以插入单条语句

        insert into 表名 value();

        2.插入多条语句

        insert into 表名 values(),()...;

        3.指定字段

        insert into 表名(字段1,字段2...)

            values(),();

            注意:没有指定字段的情况下,必须将所有的字段都一一赋值

    2.update

        update 表名 set 字段=where 条件;

 

    3.delete

        delete from 表名 where 条件;

 

-- 数据查询语言(DQL)

    select语言

    1.查询所有

    select * from 表名;

    2.查询指定字段

    select 字段1,字段2 from 表名;

    3.给字段指定别名

    select 字段1 as 别名,字段2 from 表名;

    --as 可以省略

    select 字段1 别名,字段2 from 表名;

    4.distinct将查询结果取重

    select distinct 字段名 from 表名;

    5.select中使用表达式

    运算符:+ - * / %

    函数:

        md5() md5加密

        password() mysql的加密

        Unix_timestamp() unix时间戳

        concat() 将两个字段连接查询

    6.where条件

    and or

    is null is notnull

    between not between

    like not like

           _ 表示任意的单个字符

           % 表示任意个字符

    in

--使用统计函数

    count() 统计

    sum()   求和

    avg()   求平均值

    max()   求最大值

    min()   求最小值

 

--排序

    --倒序

    select * from 表名 order by 字段 desc

    --升序查询(默认)

    select * from 表名 order by 字段名 asc

 

 --限定结构行数

    --只查一条

    select * from 表名 limit 1;

    --跳过1条取2

    select * from 表名 limit 1,2;

 

--分组查询

    select count(*) from 表名 group by 字段名

--分组并筛选

    select count(*),sex,avg(age) from user group by sex having sex='';

 

--完整的select语句

select 字段 from 表名 where id>0 group by sex having sex='' order by sex limit 1;

--多表查询

    可以以'表名.字段名'的方式查询

    还可以给表取个别名

        select u.username from user as u;

 

-- 子查询

    将一个表的查询结果作为另一个表的条件

 

 

--php连接数据库

 --在使用php操作mysql之前请确认mysql扩展是否开启

    1.phpinfo查看mysqli扩展是否开启

    2.如果没有开,在php.ini里面找到extension=php_mysql.dll,将前面的分号干掉

--phpinfo();

--天龙八部

    1.连接mysql服务器

        1.主机名 数据库服务器的地址

        2.用户名

        3.密码 如果没有密码就为空字符串

        $link = @mysqli_connect('localhost','root','123');

    2.判断一下是否连接成功

        if(mysqli_connect_errno()>0) {

        echo '数据库连接失败:'.mysqli_connect_error();

        exit;

        }

    3.选择数据库:相当于use gz24;

        1.数据库的链接标准

        2.库名

        mysqli_select_db($link,'gz24');

    4.设置字符集

        mysql_set_charset($link,'utf8');

    5.准备sql语句

        $sql = 'select * from user where id < 0';

    6.发送sql语句

        $res = mysql_query($link,$sql);

 

    7.处理结果集

        判断sql语句是否有问题;并且判断是否查到结果

        if($fes && mysqli_num_rows($res)>0){

            $arr = [];

            while ($row = mysqli_fetch_assoc($res)){

            $arr[] = $row;

            }

            var_dump($arr);

            mysqli_free_result($res);--释放结果集

        } else {

            echo mysqli_errno($link);--错误号

            echo mysqli_error($link);

            --错误信息

        }

    8.关闭数据库连接

        mysqli_close($link);

 

--六脉神剑(查询)

    --1.连接数据库并判断

    $link = @mysql_conect('localhos','root','123','gz24') or die('数据库连接失败:'.mysqli_connect_error());

    --2.设置字符集

    mysqli_set_charsset($link,'utf8');

 

    --3.准备sql语句

    $id = $_GET['id'];

    $sql = "select * from user where id={$id}";

    echo $sql;

    --4.发送sql语句,查询成功返回的是包括结果集的对象

    $res = mysqli_query($link,$sql);

 

    --5.处理结果集

    if($res && mysql_num_rows($res)>0){

        --1.将结果读取为混合数组

        --$row = mysqli_fetch_array($res);

        --2.将结果读取为关联数组(常用)

        --$row = mysqli_fetch_assoc($res);

        --3.将结果读取为索引数组

        --$roe = mysqli_fetch_row($res);

        --4.将结果读取为对象(了解)

        --$row = mysqli_fetch_object($res);

        --将结果集全部读出来

        --$row = mysqli_fetch_all($res,MYSQLI_BOTH);

        $row = mysqli_fetch_all($res,MYSQLI_ASSOC);--常用

        --释放结果集

        mysqli_free_result($res);

        } else {

            $row = [];

        }

        var_dump($row);

    --6.关闭数据库

        mysqli_close($link);

 

--新增数据

--连接数据库

    $link = mysqli_connect('localhost','root','123','gz24') or die('数据连接失败');

--设置字符集

    mysqli_set_charset($link,'utf8');

--准备sql语句

    $pwd = md5('333');

    --一次性插入两条

    $sql = "insert into user values(null, '老马哥', '{$pwd}', '18338383836', '', '".time()."', '83'),(null, '老马哥', '{$pwd}', '18338383835', '', '".time()."', '31')";

    echo $sql;

--发送sql语句

    --插入成功返回的是布尔型,要么为true,要么为false

    $res = mysqli_query($link,$sql);

    var_dump($res);

--处理结果

    --返回受影响行数,插入失败返回-1

    echo mysqli_affected_rows($link);

    if($res && mysql_affected_rows($link) > 0){

        echo '插入成功';

    }else {

    echo '插入失败';

    }

--关闭数据库

    mysqli_close($link);

 

 

--修改操作

//连接数据库

$link = mysqli_connect('localhost', 'root', '123', 'gz24') or die('数据库连接失败鸟~~~');

// var_dump($link);

 

//设置字符集

mysqli_set_charset($link, 'utf8');

// mysqli_query($link, 'set names utf8');   //等效上一行

 

//准备sql语句

$sql = "update user set sex='',username='阴森森2' where username='阴森森'";

//发送sql语句

//发送修改语句,返回true或者false;不管有没有改到数据,只要sql语句没有语法问题,结果一定是true

$res = mysqli_query($link, $sql);

var_dump($res);

//处理结果集

echo mysqli_affected_rows($link);

if ($res && mysqli_affected_rows($link) > 0) {

    echo '修改成功';

} elseif ($res && mysqli_affected_rows($link) == 0) {

    echo '什么都没改';

} else {

    echo '修改失败';

}

 

//关闭数据库

mysqli_close($link);

 

--删除和获取最后插入id

//连接数据库

$link = mysqli_connect('localhost', 'root', '123', 'gz24') or die('数据库连接失败鸟~~~');

// var_dump($link);

//设置字符集

mysqli_set_charset($link, 'utf8');

// mysqli_query($link, 'set names utf8');   //等效上一行

//准备sql语句

// $sql = "delete from user where id=26 or id=25";

$sql = "insert into user(username,pwd,phone) values('小卓卓', '".md5('123')."', '12345678914'),('小卓卓', '".md5('123')."', '12345678915'),('小卓卓', '".md5('123')."', '12345678916')";

//发送sql语句

$res = mysqli_query($link, $sql);

var_dump($res);

echo mysqli_affected_rows($link);   //受影响行数

 

//处理结果集

if ($res && mysqli_affected_rows($link) > 0) {

    echo '删除成功';

} else {

    echo '删除失败';

}

//获取最后插入ID,多条同时插入的时候,只能获取第一条的id

echo mysqli_insert_id($link);

//关闭数据库

mysqli_close($link);

你可能感兴趣的:(MySQL)