PHP4 WEB数据库 附天龙八部

【数据库介绍】

    作用

        1、开房记录
        2、银行卡信息
        3、身份证

库-》表-》字段-》数据行

【关系型数据库和非关系型数据库】


    关系型数据库   
        mysql
        Oracle
        SqlServer

    非关系型数据库
        redis
        mongodb

【引擎的区别】

MyISAM与InnoDB的区别
  InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。

【sql分类】

    DDL
        CREATE、DROP、ALTER

    DML   
        INSERT、UPDATE、DELETE

    DQL[重点]
        SELECT
    DCL
        GRANT、REVOKE
    DTL
        BEGIN、COMMIT、ROLLBACK

【命令行链接数据库】

    更改环境变量

    找到你的mysql安装的目录 找到bin 把路径复制一份

    我的电脑 属性-》高级设置-》环境变量-》path 以分号结束,把你复制过来的路径粘贴进去确定
    把你的小黑框关掉重新开

【数据库链接】

    mysql -hlocalhost -uroot -p
    密码

    这种写法 不建议使用
        mysql -uroot -proot

    如果你是本地访问你不用加localhos

    当你的一句命令结束的时候加 ; 或者 \g


    退出当前mysql
        quit

    清空dos命令 cls

    \h 帮助
    \c 清空当前命令

    查看当前库
        show databases
    创建库
        create database 库名
    删除库
        drop database 库名

    注意:
        你想在一个库里面建表的时候 首先你要记得use 使用当前的库

    use 库名


    【创建表】
        create table 表名(id int,mame varchar(35),price int);

        id name price 是字段  后面的限制是类型

    【删除表】
        drop table 表名字

    【查看表结构】
        desc 表名字

    【查看建库语句】
        show create database 库名字

    【查看建表语句】
        show create table 表名字


    【修改表字段值】
        alter table 表名 modify 字段名字 修改后的值;

    【修改表字段】
        alter table 表名 change 原来字段名 修改后字段名(你要修改成为的类型)
    【添加表字段】
        alter table 表名 add 字段名字 (字段类型)
    【删除表字段】
        alter table 表名 drop 字段名字

    【插入顺序的问题】
        first

            alter table 表名 add 你要添加的字段(字段类型) first

        after

            alert table 表名 add 你要添加的字段名字(字段类型) after (在谁后面)

    【修改表名字】
        alert table 原表名 rename 新的名字

    【数据库优化问题】
        1、用合适的字段存合适的东西

【数据类型】
        整型的 int  -2147483648~2147483647
        tinyint -128 - 127

        浮点类型
            decimal(m, d)

            d是你要保留几位小数 m 是包括你保留的小数加上前面的整数不能超过的数字的长度


【char 和 varchar】
        char 比 varchar效率高
            定长的

        varchar比char存的东西多
            可变长度

【时间】
    timestamp 获取你当前插入的时间


【导出sql语句】
    mysqldump -uroot -p 库名 > 路径

【导入sql语句】
    mysql -uroot -p 新的库名 < 路径

[client]
#password = your_password
port = 3306
socket = /tmp/mysql.sock
default_character_set = utf8

[wampmysqld64]
#skip-grant-tables
port = 3306
socket = /tmp/mysql.sock
key_buffer_size = 64M
max_allowed_packet = 1M
character_set_server=utf8
#Added to reduce memory used (minimum is 400)
table_definition_cache = 600


【类型区别】

myisam    不支持事务
    常用。读取效率很高的引擎
innodb  支持事务
    常用。写入大量数据,事务处理等都支持

【查看执行引擎】
    show engines

【默认存储引擎】
在my.ini default-storage-engine=MYISAM

【 你知道有几个存储引擎】

    myisam
    innodb
    memory
    csv
.............

【索引】

    1、普通索引
        添加不同索引
            alter table 表名 add index(money);
    2、唯一索引
        alter talbe 表名 add unique(email);
    3、主键索引
        alter table 表名 add primary key(字段)
    4、全文索引
        alter table 表名 add fulltext(字段);
【查看索引】
    show index from 表名;

【查看当前表在哪个数据库下面】 不是重点
 select database();

【建表语句】

CREATE TABLE `表名` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `name` varchar(35) NOT NULL,
 `pass` char(32) NOT NULL,
 `status` tinyint(2) DEFAULT NULL,
 PRIMARY KEY (`id`))
 ENGINE=InnoDB DEFAULT CHARSET=utf8
-------+---------------------------------------
【复制表】 不是重点
create table 表名 select * from 旧的的表

【插入表内容】

insert into 新表 select * from 旧的的表


【重点】

    增、删、改、查(更加重点)


【插入数据】

    第一种插入方式
        insert into 表名字 values(值1,2,3、、、、、、);
        insert into 表名 values(1,'王宝强','123','河北邢台',30,1);


    第二种插入方式
        注意:你写的值一定要跟你写的字段对应上
        insert into 表名 (字段1,字段2,字段3) values(值1,值2,值3);
        insert into 表名 (id,name,money,age,sex) values(3,'刘德
华',11111111,60,1); 常用

    第三种插入方式
        insert into 表名(name,money,province,age,sex) values('谢霆锋',999,'香
港',37,1),('张柏芝',888,'香港',18,0),('冠冠',10,'加拿大',37,1);

        前面可以跟字段,后面一个values(),(),()
        注意:也要跟字段对应上

        插入数据可以不传值的情况:
        自增的字段可以不用传入值(每插入一条该字段的值会自动加1)
        有默认值
        可为空的字段可不传
        说明:插入记录2的方式为更常用的用法


【删除数据】


    delete from 表 where 字段 = 值
    注意:where必须要加,否则后果自负

【修改】

    update 表名 set 字段名 = ‘你要修改的值’,........ where条件
    update 表名 set name='梁朝伟',money=555,province='河南',age=50,sex=1 where id=11;
    注意:where必须要加,否则后果自负

【查询】重点中的重点


    select * from 表名字 注意:一般情况下咱们不用* 因为有些数据咱们没必要查询,工作量
大(mysql)

    1、按照指定字段查询

        select 字段1,。。。。from 表名字
    2、去除重复值
        select distinct 字段 from 表名字

        select distinct name,province from user;

        两个必须都一样才会排出重复值
    3、配合where来查询
        select * from 表 where 字段名字=值

    4、
        between and
        select * from user where age between 30 and 50;

        select * from user where age>=50 or age <=18;

        select * from user where age!=30;

        select * from user where age<>30;

        select * from user where age in(30,37,18);

        select * from user where province like '%口';

        select * from user where province like '%口%';

        select * from user where province like '_口';

        select * from user where id > 5 and age>30;

        如果不加排序
        默认 升序 order by asc
        select * from user order by id asc;
        desc 降序
        select * from user order by id desc;

        查询5条
        select * from user limit 5;

        从第五个开始查,要五条数据
        select * from user limit 5,5;

        0,5  第一页

        5, 5 第二页

        10,5 第三页

        15,5 第四页

            第n页

        (n-1)*5,5
        select * from user order by money desc  limit 5;

         14672538

        分组      select * from user group by province;

        //根据身份分组 并且统计出来总个数
        select count(*), province from user group by province;

        //对结果集在进行过滤
        select count(province) as likun,province from user group by province
having likun>2;



【多表查询】
select * from shop_user join shop_goods; 这么查询没有意义

【隐式内连接】因为没有join关键字
    select 表1.字段 [as 别名], 表n.字段 from 表1 [别名], 表n where 条件;

    select shop_user.name,shop_goods.name from shop_user,shop_goods where shop_user.gid = shop_goods.gid;

【内联】
    select 表1.字段 [as 别名],表n.字段 from 表1 inner join 表2 on 条件;

    select username,name from shop_user inner join shop_goods on shop_user.gid = shop_goods.gid;

    说明:以上方式的inner关键字换成cross同样可以,其实也可以省略

【左连接】
    select 表1.字段 [as 别名], 表n.字段 from 表1 left join 表n on 条件;

    select username,name from shop_user left join shop_goods on shop_user.gid = shop_goods.gid;
【右链接】
    select 表1.字段 [as 别名], 表n.字段 from 表1 right join 表n on 条件;

    select username as uname,name as gname from shop_user right join shop_goods on shop_user.gid = shop_goods.gid;

【嵌套查询】
    select 字段 from 表 where 字段 in(select id form 表)

    select * from shop_user where gid in(select gid from shop_goods);
【了解】
    select * from shop_goods left join shop_user on shop_goods.gid = shop_user.gid
    union
    select * from shop_goods right join shop_user on shop_goods.gid = shop_user.gid;

【这种修改】
    update shop_goods set price = price-1 where gid=1;
【两个表修改】
     update shop_user as u,shop_goods as g set u.username='马德华华', g.name='奥迪A77L' where u.gid = g.gid and u.gid=1;


【删除表】清空表  没有意义


    delete from 表名 告诉你们禁用

    如果你想把你的自增的id从头开始 加上 truncate table 表名

【添加一个后台登录的用户】
    create user'likun'@'localhost' identified by 'niaiwo';

【赋权限】
    grant select on *.* to 'likun'@'localhost';

【删除用户】
    drop user 'likun'@'localhost';

【删除权限】
    revoke select,update on *.* from 'likun'@'localhost';

【事务】DCL


    双向成功才成功,单项成功回滚 rollback

    第一步你要把你的存储引擎改成 innodb

    把自动提交修改成手动提交

        set autocommit = 0;

    开启一个事务
        begin

    写你的修改。。。。。语句
    注意:如果回滚了rollback 你再提交是无效的
        commit;

    OK!!!!


【天龙八部】

1、连接数据库
    $link = mysqli_connect('主机名',‘用户名’,‘密码’);
2、判断是否连接成功
    if (!$link) {        }

3、设置字符集
    mysqli_set_charset($link , 'utf8');

4、选择数据库   
    mysqli_select_db($link , '库名');

5、准备sql语句

    $sql = '你的命令行下面怎么写,这里就怎么写';

6、发送sql语句   
    $result = mysqli_query($link , $sql) //返回一个对象

7、处理结果集   
    mysqli_fetch_assoc($result) 一个一个往下读的 返回的时候一个一维的关联数组(必须记住)   

    mysqli_fetch_row($result) 返回一个索引数组

    mysqli_fetch_array($result) 返回一个有索引又有关联的数组

    mysqli_num_rows($result) 返回查询时候的结果集的总条数

    mysqli_affected_rows($link) 返回你修改,删除,添加的时候的受影响的行数

    mysqli_insert_id($link); 返回的是你插入的当前的数据的自增的id


8 关闭数据库链接

    mysqli_close($link);


数据库(表)设计3范式:

第一范式(1NF):

要求数据达到原子性,使数据不可再分;
看一个没有满足第一范式的例子:
对其进行修改后,就符合第一范式了:

第二范式(2NF)

使每一行数据具有唯一性,并消除数据之间的“部分依赖”,使一个表中的非主键字段,完全依赖于主键字段;
经验上:常常是每个表都要设计主键,并通常多数情况下,使用一个自增长的int类型的字段当做主键
实际,有2个方面的要求:
1 ,每一行数据具有唯一性:只要给表设计主键,就可以保证唯一性。
2 ,消除数据之间的“部分依赖”;
什么叫做“依赖”?
依赖,就是在一个表中,其中某个字段的值B可以由另一个字段的值A来“决定”,则此时我们就称为:
字段B依赖于字段A,
或:
字段A决定字段B;
其意思是,如果根据字段A的某个值,一定可以找出一个确定的字段B的值,就是A决定B。
对一个有主键的表,这种情况就成了:
确定了主键字段的值,则其他字段肯定都确定了。
也可以这样说:
主键决定了其他字段;
其他字段依赖于主键;
什么叫做部分依赖?
如果某个字段,只依赖于“部分主键字段”,此时就称为“部分依赖”
—— 发生此情况的前提一定是:主键字段有多个!!!
什么叫做完全依赖:
就是某个字段,是依赖于“主键的所有字段”。
—— 推论:如果一个表的主键只有一个字段,则此时必然是完全依赖。
一个不良例子:
改进之后:

第三范式(3NF)

独立性,消除传递依赖:
使每个字段都独立地依赖于主键字段(独立性),而要消除其中部分非主键字段的内部依赖——这种内部依赖会构成“传递依赖”
不良做法:
修正之后:
经验总结:
通常,在设计表的时候,基本只要遵循这样一个原则,就可以满足前述 3 范式要求:
每一种数据,使用一个表来存储。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值