Web开发-PHP基础篇(四)

一、数据库基本概念

数据库:信息存储的仓库,包括一系列的关系措施!
表:一个数据库中可以有若干张表(形式上你可以看出我们日常生活中建立的表)
字段:表里面的信息会分若干个栏目来存,这些栏目,在数据库技术中叫”字段”,栏目里面存的具体信息叫”字段值”
记录:一条信息我们叫一条记录
一个数据库管理系统中可以建立若干个数据库,每个数据库中又可以建立若干张表,每张表中可以有若干条记录。

二、MySQL支持的数据类型

MySQL数据库中的数据类型主要分为:数值类型、日期类型、字符串类型。

1.数值类型
1)整数类型
tinyint、smallint、mediumint、int和bigint
2)zerofill属性
配合int(数字)来用,表示显示的时候一个显示宽度
3)主键
主键可以唯一标识某条记录的一个字段或者多个字段
create table 表名(字段名称 类型 primary key,….);
create table 表名(字段名称1 类型,….,primary key(字段名称1));
删除:
alter table 表名 drop primary key;
注意:如果字段具有auto_increment属性必须先删除auto_increment属性
4)小数的表示
①浮点数
单精度(float):单精度的浮点数精确到大约7位小数位(整数部分加上小数部分的位数)
双精度精度(double):双精度的浮点数精确到大约15位小数位(整数部分加上小数部分的位数)
②定点数
decimal(7,2)

*整数类型的字段常见的属性设置*

1.UNSIGNED 无符号
2.auto_increment
自增(默认从1开始),用于整数类型和带索引的字段,比如:配合主键使用(其他类型的索引我们以后再说)
3.主键:
主键可以唯一标识某条记录的一个字段或者多个字段
一个字段设为主键
多个字段组合设为主键
注意点:
1)主键最好不要设置在某个与实际信息相关的字段上,主键的作用应该明确且单一
2)主键最好设置在整数类型的字段上面(处理或查询起来效率较高)
3)主键必须不同,并且不能为null
4)既然主键必须不同所以我们会配合 auto_increment属性
5)一个表只能有一个主键,最好只设置在一个字段上
6)根据主键的值来查询记录时可以获得极快的速度(因为设置了主键的字段已经创建了索引)!
设置方法:
在创建表的时候
primary key(字段)
primary key(字段1,字段2)
也可以直接写在需要创建主键的字段后面

如果忘了设置可以
    alter table 表名 add primary key(字段名);

删除:

    alter table 表名 drop primary key;

​ 注意:如果字段具有auto_increment属性必须先删除auto_increment属性
4.规定字段的值是否可以为null not null即不可以为null,该属性也可用于其他类型的字段
5.设置默认值 default 值,该属性也可用于其他类型的字段

2.日期类型
DATETIME是常用的日期类型
create table t1(dt datetime);
insert into t1 values(now());
3.字符串类型
CHAR(M) M为0~255之间的整数,表示可以存M个字符(不管是中文还是英文字符总共个数是M个就OK)

VARCHAR(M) M为065535之间的整数,表示可以存M个字符,具体M最大多大和字符集有密切关系
注意varchar列的最大的存储空间是65,532字节,如果是英文字符集(一个英文字符占1个字节)就是可以放65532个英文字符
自己在实际开发的过程中M设置的值,应该从自己的实际需求去考虑,而不是最大能存多少个字符,因为超过最大能设定的字符数会自动报错或者警告!
TINYTEXT 允许长度0
255字符
TEXT 允许长度065535字符
MEDIUMTEXT 允许长度0
16,777,215字符
LONGTEXT 允许长度0~4,294,967,295字符

注意点:
char与varchar列的区别
char类型的字符所占的存储空间是固定,不管你用的时候存了几个字符,它所占的空间都是你当初设定的字符空间
比如char(255) 哪怕你存的只是1个a,那么它也是站255个字符长度的空间!
varchar列所占的存储空间是可变的,根据存入的字符长度来确定实际占多少的空间!
varchar(255) 实际所占的空间就是实际字符的长度+1个字节!
varchar(超过255) 实际所占的空间就是实际字符的长度+2个字节!
更节省空间!
在检索时,char列删除尾部的空格,而varchar则保留这些空格。
选择:由于char是固定长度,所以它的处理速度比varchar快,但是缺点是浪费存储空间。所以对于那些长度变化不大的数据可以选择此列

三、MySQL使用

SQL分类:

DDL(Data Definition Languages)语句

数据定义语句,通过这类语言可以对数据库进行创建删除更改

DML(Data Manipulation Language)语句

数据操纵语句,用于添加、删除、更新和查询数据库记录并检查数据完整性

DCL(Data Control Language)语句

数据控制语句,通过此类语句可以对数据库的相关权限进行设置

DDL语句

了解

1.首先需要登录MySQL, mysql -u用户名 -p敲回车键,然后输入密码

2.命令结束符用“;”或“\g

3.客户端的连接ID,这个数字记录了MySQL服务到目前为止的连接次数;每个新连接都会自动加1

用法

1.创建数据库

1>create database 数据库名;

2>选择要操作的数据库:use 数据库;

3>查看数据中所有的数据表show tables;

例:

mysql> create database myph;
Query OK, 1 row affected (0.00 sec)

mysql> use myph
Database changed
mysql> show tables;
Empty set (0.00 sec)

2.删除数据库

drop database 数据库名称;

mysql> drop database myph;
Query OK, 1 row affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| bts                |
| challenges         |
| demo               |
| myphp              |
| mysql              |
| performance_schema |
| security           |
+--------------------+
8 rows in set (0.00 sec)

3.创建表

1)创建表

create table 表名(

  `字段1名 字段1类型  列的约束条件,`

  `字段2名 字段2类型  列的约束条件,`

  `...`

)

例:

mysql> create table user(id int ,name varchar(35),password varchar(40));
Query OK, 0 rows affected (0.00 sec)

列的约束条件部分可以设置很多信息比如,默认值设置:default null

2)创建完表之后可以查看表的定义

desc 表名;

例:

mysql> desc user;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int(11)     | YES  |     | NULL    |       |
| name     | varchar(35) | YES  |     | NULL    |       |
| password | varchar(40) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

3)查看创建表的SQL语句

show create table 表名 \G

例:

mysql> show create table user \G
*************************** 1. row ***************************
       Table: user
Create Table: CREATE TABLE `user` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(35) DEFAULT NULL,
  `password` varchar(40) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

\G选项使得记录能够按照字段竖向排列,以便更好地显示内容较长的记录,\G后面无需再加分号

4.删除表

drop table 表名;

5.修改表

1)修改表类型

alter table 表名 modify [column] 字段定义 [first|after 字段名];

例:

mysql> alter table user modify column name tinyint;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc user;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int(11)     | YES  |     | NULL    |       |
| name     | tinyint(4)  | YES  |     | NULL    |       |
| password | varchar(40) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+

2)增加表字段

alter table 表名 add [column] 字段定义 [first|after 字段名];

例:

mysql> alter table user add column wer int;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc user;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int(11)     | YES  |     | NULL    |       |
| name     | tinyint(4)  | YES  |     | NULL    |       |
| password | varchar(40) | YES  |     | NULL    |       |
| wer      | int(11)     | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

3)删除表字段

alter table 表名 drop [column] 字段名;

例:

mysql> alter table user drop column name;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc user;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int(11)     | YES  |     | NULL    |       |
| password | varchar(40) | YES  |     | NULL    |       |
| wer      | int(11)     | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

4)字段改名

alter table 表名 change [column] 旧的字段名 字段定义 [first|after 字段名];

例:

mysql> alter table user change wer qwzf int;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc user;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int(11)     | YES  |     | NULL    |       |
| password | varchar(40) | YES  |     | NULL    |       |
| qwzf     | int(11)     | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

注:change与modify都可以修改表的定义,不同的是change后面需要接两次列名,不方便,但是优点是change可以修改字段名称

5)修改字段排列排序

前面介绍的字段增加和修改语法(add/change/modify)中,都有一个可选项first|after 字段名,这个选择可以用来修改

字段在表中的位置新增的字段默认是加载在表中最后位置,而change/modify 默认都不会改变字段的位置

注意:change/first|after 字段名 这些关键字都是属于MySQL在标准SQL上的扩展,在其他的数据库上不一定适用

6)更改表名

alter table 表名 rename [to] 新的表名;

例:

mysql> alter table user rename to users;
Query OK, 0 rows affected (0.00 sec)

mysql> show tables;
+----------------+
| Tables_in_myph |
+----------------+
| users          |
+----------------+
1 row in set (0.00 sec)

DML语句

因为之前学习过MySQL的增删改查操作,这一部分可以参考一下我之前的博客,MySQL的简单使用

查询 select * from 表名;
1)插入记录
1>插入记录

insert into 表名(字段1,字段2,字段3,...,字段n)  values(值1,值2,值3,...,值n);

也可以不用指定字段名,但是values后面的顺序应该和字段的排序一致
2>一次插入多条记录

insert into 表名(字段1,字段2,字段3,...,字段n)
values
(值1,值2,值3,...,值n),
(值1,值2,值3,...,值n),
(值1,值2,值3,...,值n);

2)更新记录
1>更新一个表

update 表名 set 字段1=值1,字段2=值2,...字段n=值n [where 条件];

2>更新多个表中数据

update 表1,表2,...表n set 表1.字段1=表达式1,表n.字段n=表达式n [where 条件];

注:多表更新更多的用在根据一个表的字段来动态的更新另外一个表的字段
简单实例:

update t1,t2 set t1.age=2000,t2.age=3000 where t1.id=1 and t2.id=1;                

3)删除记录
1>删除单表中的数据

delete from 表名 [where 条件];

2>删除多个表中的数据

delete 表1,表2,...表n from 表1,表2,...表n [where 条件];

不管是单表还是多表,不加where条件将会把表中的所有记录删除,所以操作时一定要小心。

4)查询记录

select 字段名 from 表名;
mysql> use demo;
Database changed
mysql> select username from users;
+----------+
| username |
+----------+
| admin    |
| 69       |
+----------+
2 rows in set (0.00 sec)

1>查询不重复的记录

SELECT distinct field1,field2 FROM 表名;
mysql> select distinct id,username from users;
+---------+----------+
| id      | username |
+---------+----------+
| 1739701 | admin    |
| 1739702 | 69       |
+---------+----------+
2 rows in set (0.00 sec)

只要field1,field2任何一个字段有不同就会被选择,一般使用distinct,只筛选一个字段。

2>条件查询
注:条件字段比较符号:
=,<,>,>=,<=,!=等比较运算符
多个条件之间可以使用or and等
where 后面接条件

select * from 表名 where 条件

3>排序和限制
排序:
asc:由低到高,也是默认值

select * from 表名 order by 字段名 asc; #按“字段名”由低到高排序

desc:由高到底

select * from 表名 order by 字段名 desc;#按“字段名”由高到低排序

例:

mysql> select * from users order by id desc;
+---------+----------+----------+
| Id      | username | password |
+---------+----------+----------+
| 1739702 | 69       | 69       |
| 1739701 | admin    | admin    |
+---------+----------+----------+
2 rows in set (0.00 sec)

多个字段排序

select * from 表名 order by 字段名1 desc,字段名2 desc;

限制:
在语句的最后面 加上limit 数字1,数字2 来进行查询数量的限制。
limit 数字1,数字2 数字1代表从第几条记录开启取(是从0开始的),数字2代表取几条

例:

mysql> select * from users order by id desc limit 0,1;
+---------+----------+----------+
| Id      | username | password |
+---------+----------+----------+
| 1739702 | 69       | 69       |
+---------+----------+----------+
1 row in set (0.00 sec)

4>聚合
①sum求和
select sum(字段名) from 表名;
②count记录总数
select count(|字段名) from 表名;
③max最大值
select max(字段名) from 表名;
④min最小值
select min(字段名) from 表名;
⑤GROUP BY分类聚合
select 字段2,sum(字段1) from 表名 group by 字段2; 按照字段2,分类聚合
⑥WITH ROLLUP分类聚合后的结果进行再汇总
select sum(字段1) from 表名 group by 字段2 with rollup;
⑦HAVING
注意:having和where的区别在于,having是对聚合后的结果进行条件过滤,而where是在聚合前就对记录进行过滤 ,应该尽可能的对记录进行先过滤.。
select sum(字段1) from 表名 group by 字段2 having sum(字段1)>1000;
可以在一起使用:select sum(id),max(id),min(id),count(
) from a1;

5>表连接
需求:显示多个表中的字段的时候即可使用表连接
连接分类:
内连接:选取两张表中相互匹配的记录
外连接:不仅仅选取两张相互匹配的记录,并且会选出其他不匹配的记录
举例:
内连接:

select 表.字段,....  from 表1名,表2名,...  where [匹配的条件比如 表1.字段=表2.字段];

例:

mysql> select*from user,student where user.id=student.id;
+----+-------+----------+----+------+------+
| Id | name  | password | Id | sex  | ming |
+----+-------+----------+----+------+------+
|  1 | ad    | ad       |  1 | wa   | wang |
|  2 | admin | admin    |  2 | me   | meng |
|  3 | root  | root     |  3 | ng   | meng |
+----+-------+----------+----+------+------+
3 rows in set (0.00 sec)
mysql> select user.id,user.name,student.sex from user,student where user.id=student.id;
+----+-------+------+
| id | name  | sex  |
+----+-------+------+
|  1 | ad    | wa   |
|  2 | admin | me   |
|  3 | root  | ng   |
+----+-------+------+
3 rows in set (0.00 sec)

select 语句可以给字段起别名!直接写在需要查询显示的字段的后面就ok
​ 给表起别名

例:

mysql> select user.id a,student.id b from user,student where user.id=student.id;
+---+---+
| a | b |
+---+---+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+---+---+
3 rows in set (0.00 sec)

外连接
​1)左连接(left):包含左边表中的所有记录(包括右表中没有和它匹配的记录)

select 表1,表2 from 表1 left join 表2 on 表1.字段名=表2.字段名;

2)右连接(right):包含右边表中的所有记录(包括左表中没有和它匹配的记录)
​ 左连接和右连接是可以相互转换的
6>子查询
需求:一个查询需要另外一个查询的结果参与的时候
​用于子查询的关键字:
​in
​语法:select * from 表1 where id in(select 字段名 from 表2);
​in 在..里面
​注意点 in后面的子语句必须只返回一个字段
​若查询结果唯一(只有一条)可以使用=代替in

not in
​与in相反
​exists
​语法:select语句 where exists(select 语句);
​exists:后面那个子语句有没有查询出记录来,如果查询出记录来返回true,否则就是false
​并且查询出来的记录的具体的值是NULL也是没有关系,也是返回true.
​not exits
​与exists相反
​ 1)select * from 表1 where 表2 in(select 表2 from 字段名);
​ 2)若查询结果唯一可以使用=代替in
​ select * from 表1 where 表2=(select 表2 from 字段名 limit 1);
7>记录联合
我们常常会碰到需要将两个表或者多个表的数据按照一定的查询条件查询出来后,将结果合并到一起显示这是就需要用到记录联合
多个select 语句用
UNION或者UNION ALL隔开即可实现

例:

mysql> select id,name from user union select id,sex from student;
+----+-------+
| id | name  |
+----+-------+
|  1 | ad    |
|  2 | admin |
|  3 | root  |
|  4 | wang  |
|  1 | wa    |
|  2 | me    |
|  3 | ng    |
+----+-------+
7 rows in set (0.00 sec)

区别: 前者 会将多个查询结果合并后并且进行去除重复后返回
​ 后者 则直接合并并不去除重复
联合的条件:查询的列个数要相等

四、MySQL数据库字符编码

1、字符编码概述

从本质上来说,计算机只能识别二进制代码,因此,不论是计算机程序还是其他被处理的数据,最终都必须转换成二进制,计算机才能认识。为了使计算机不仅能做科学计算,也能处理文字信息,人们想出了给每个文字符号编码以便于计算机识别处理,这就是计算机字符集的由来。

简单的说字符集就是一套文字符号及编码、比较规则的集合。

2、汉字常见字符集

1.GB2312-80:
即GB2312,是中华人民共和国国家标准简体中文字符集,全称《信息交换用汉字编码字符集 基本集》,1980年发布,1981年5月1日实施。
GB2312编码通行于中国大陆,中国大陆几乎所有的中文系统和国际化的软件都支持GB 2312
2.GBK:
汉字内码扩展规范,发布于1995年,在GB2312的基础上做了扩充,且对GB2312完全兼容,但是GBK并不是一个强制性的国家标准,只是一个行业指导规范,并没有强制力,但是由于得到了微软windows95的支持而大为流行

3、国际编码UTF-8

是一种针对Unicode的可变长度字符编码,通用性很好。

4、常用字符集比较

ACSII:单字节7位编码,最早的奠定性字符集
ISO-8859-1/latin1:单字节8位编码,西欧字符集
GB2312-80:双字节编码,早期标准
GBK:双字节编码,虽然不是国标但是支持的系统很多
UTF-32:4个字节编码,UCS-4原始编码,目前很少采用
UCS-2:2字节编码,windows2000内部用UCS-2
UTF-16:2字节或4字节编码,Java和Windows XP/NT等内部使用UTF-16
UTF-8:1~4字节编码,互联网和Unix/Linux广泛支持的Unicode字符集,UTF-8汉字编码需要使用3个字节

5、MySQL支持的字符集

1.查看所有可用的字符集
show character set;
或者查看information_schema.character_sets,也可以显示所有的字符集和该字符集默认的校队规则

2.MySQL的字符集包括字符集(character)和校对规则(collation)两个概念。
1)字符集用来定义MySQL存储字符串的方式
2)校对规则用来定义 字符串比较的方式
3)字符集和校对规则是一对多的关系,一个字符集有多个校对规则供你选择!
校对规则命名约定:它们以相关的字符集名开始,通常包括一个语言名,并且以 _ci(忽略大小写)、_cs(大小写敏感)或者 _bin(二元,即比较是基于字符编码的值而与language无关)结束。
查看字符集的校对规则:
show collation like ‘字符集前缀%’;

6、MySQL内部的字符集和校对规则设置

MySQL内部的字符集和校对规则有4个级别的默认设置:服务器级、数据库级、表级和字段级
1.服务器字符集和校对规则设置
1)在配置文件中设置

[mysqld]
character-set-server=utf8

2)或者在启动项中指定

mysqld --character-set-server=utf8

3)或者在编译的时候指定
2.数据库字符集和校对规则设置
数据库的字符集和校对规则在创建数据库的时候指定,也可以在创建完数据库后通过alter database命令修改.需要注意的是如果数据库里已经有数据存在,因为修改字符集并不能将
已有的数据按照新的字符集进行存放,所以不能通过修改数据库的字符集直接修改数据的内容,需要重新导出,然后修改字符编码再导入来解决!
设置数据库字符集的规则如下:
1)如果指定了字符集和校对规则,则使用指定的字符集和校对规则
2)如果指定了字符集没有指定校对规则,则使用指定字符集的默认校对规则
3)如果指定了校对规则但未指定字符集,则使用与该校对规则关联的字符集
4)如果没有指定字符集和校对规则,则使用服务器字符集和校对字符集和校对规则作为数据库的字符集和校对规则

CREATE DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
ALTER DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]

查看当前数据库的字符集和校对规则:

show variables like 'character_set_database';
show variables like 'collation_database';

3.表字符集和校对规则设置
表的字符集和校对规则在创建表的时候指定,也可以通过alter table 命令进行修改,同样的是如果表中已经有数据那么修改字符集对原来的记录并没有影响,不会按照新的字符集进行存放!
设置表字符集的规则如下:
1)如果指定了字符集和校对规则,则使用指定的字符集和校对规则
2)如果指定了字符集没有指定校对规则,则使用指定字符集的默认校对规则
3)如果指定了校对规则但未指定字符集,则使用与该校对规则关联的字符集
4)如果没有指定字符集和校对规则,则使用数据库字符集和校对字符集和校对规则作为表的字符集和校对规则

CREATE TABLE tbl_name (column_list)
[DEFAULT CHARACTER SET charset_name [COLLATE collation_name]]
ALTER TABLE tbl_name
[DEFAULT CHARACTER SET charset_name] [COLLATE collation_name]

4.字段(列)字符集和校对规则
遇到这种情况概率比较小,这只是MySQL提供给我们一个灵活设置的手段

7、MySQL连接字符集设置

连接字符集设置:客户端和服务器之间交互的字符集
对于客户端和服务器段的交互操作,MySQL提供了3个不同的参数:
1)character_set_client:客户端来源数据使用的字符集
2)character_set_connection:连接层字符集
3)character_set_results:返回结果字符集
知识拓展:数据在客户端和服务器之间交互的过程中字符集转换的大概过程

1) MySQL Server收到请求时将请求数据从character_set_client转换为character_set_connection;
2) 进行内部操作前将请求数据从character_set_connection转换为内部操作字符集,内部操作字符集的确定方法如下:
1>使用每个数据字段设定的字符集;
2>若上述值不存在,则使用对应数据表设定的字符集;
3>若上述值不存在,则使用对应数据库设定的字符集;
4>若上述值不存在,则使用服务器设定的字符集。
3) 将操作结果从内部操作字符集转换为character_set_results。
这3个参数设定的字符集应该相同,并且客户端使用的字符集确实是参数character_set_client的值,才可以确保用户的数据可以正确的返回且输出。
查看当前设置:show variables like 'character_set%';
修改:
set names 字符集,可以同时修改3个参数的值,对本次有效
也可以在配置文件中设置:
[mysql]
default-character-set=字符集
修改CMD命令行字符集:
chcp 65001 #换成utf-8代码页(设置为utf-8之后最好手动修改显示字体 )
chcp 936 #换成默认的gbk

在这里插入图片描述

五、MySQL中的常见运算符和常用函数

常见运算符

1.算数运算符

运算符 作用

+ 加法

- 减法

* 乘法

/,DIV 除法,返回商

%,MOD 取余数

2.比较运算符

运算符 作用

= 等于

<>或!= 不等于

<=> 可以用于null值的比较

< 小于

<= 小于等于

> 大于

>= 大于等于

BETWEEN 存在指定范围

IN 存在于指定集合

IS NULL 为NULL

IS NOT NULL 不为NULL

LIKE 通配符匹配

REGEXP或RLIKE 正则表达式匹配

3.逻辑运算符

逻辑运算符又称为布尔运算符,用来确认表达式的真和假

运算符 作用

NOT或! 逻辑非

AND或&& 逻辑与

OR或|| 逻辑或

XOR 逻辑异或

4.运算符的优先级

在实际运行的时候,实际上很少有人能够将运算符的优先级熟练记忆

很多情况下我们都是用“()”来将需要优先的操作括起来,这样既起到了优先的作用,又使得其他用户看起来更易于理解

常用函数

函数用于SQL语句中
1.字符串函数
CONCAT(S1,S2,…Sn) 连接S1,S2,…Sn为一个字符串
INSERT(str,x,y,instr) 将字符串str从第x位置开始,y个字符长的字符串换位字符串instr
LOWER(str) 将字符串str中所有字符变为小写
UPPER(str) 将字符串str中所有字符变为大写
LEFT(str,x) 返回字符串str最右边的x个字符
RIGHT(str,x) 返回字符串str最右边的x个字符
LPAD(str,n,pad) 用字符串pad对str最左边进行填充,直到长度为n个字符长度
RPAD(str,n,pad) 用字符串pad对str最右边进行填充,直到长度为n个字符长度
LTRIM(str) 去掉字符串str左侧的空格
RTRIM(str) 去掉字符串str行尾的空格
REPEAT(str,x) 返回str重复x次的结果
REPLACE(str,a,b) 用字符串b替换字符串str中所有出现的字符串a
STRCMP(s1,s2) 比较字符串s1和s2
TRIM(str) 去掉字符串行尾和行头的空格
SUBSTRING(str,x,y) 返回从字符串str x位置起y个字符长度的字符串
LENGTH(str) 返回字符串长度
2.数值函数
ABS(x) 返回x的绝对值
CEIL(x) 返回大于x的最小整数值
FLOOR(x) 返回小于x的最大整数值
MOD(x,y) 返回x/y的模
RAND() 返回0-1内的随机值
ROUND(x,y) 返回参数x的四舍五入的有y位小数的值
TRUNCATE(x,y) 返回数字x截断为y位小数的结果
3.日期和时间函数
CURDATE() 返回当前日期
CURTIME() 返回当前时间
NOW() 返回当前的日期和时间
UNIX_TIMESTAMP(date) 返回日期date的UNIX时间戳
FROM_UNIXTIME() 返回UNIX时间戳的日期值
WEEK(date) 返回日期date为一年中的第几周
YEAR(date) 返回日期date的年份
HOUR(time) 返回time的小时值
MINUTE(time) 返回time的分钟值
MONTHNAME(date) 返回date的月份名
DATE_FORMAT(date,fmt) 返回按字符串fmt格式化日期date值
DATE_ADD(add,INTERVAL expr type) 返回一个日期或时间值加上一个时间间隔的时间值
DATEDIFF(expr,expr2) 返回起始时间expr和结束时间expr2之间的天数
4.流程函数
1)IF(value,t,f) 如果value是真,返回t,否则返回f
select if(field1>1000,’高薪’,’低薪’);
2)IFNULL(value1,value2) 如果value1不为null,返回value1,否则value1该是什么还是什么
select ifnull(name,’无名’);
3)CASE WHEN [value1] THEN [result1]…ELSE[default]END 如果value1是真,返回result1,否则返回default
select case when 100>10 then ‘真’ else ‘假’ end;
和if语句比较像
4)CASE [expr] WHEN [value1] THEN[result1]…ELSE[default]END 如果expr等于value1,返回result1,否则返回default
select case 1 when 1 then ‘一’ when 2 then ‘二’ when 3 then ‘三’ else ‘未知数字’end;
和switch语句比较像
5.其他常用函数

用法:select 函数名;

DATABASE() 返回当前数据库名
VERSION() 返回当前数据库版本
USER() 返回当前登录用户名
INET_ATON(IP) 返回IP地址的数字表示
INET_NTOA(num) 返回数字代表的IP地址
PASSWORD(str) 返回字符串str的加密版本
MD5() 返回字符串str的MD5值

六、mysqli与MySQL交互

1.建立、关闭与MySQL服务器的连接

1)连接指定的mysql服务器

$mysqli_connect=@mysqli_connect($host, $user, $password,$database,$port);//$port端口,默认3306

2)连接错误时的提示

int mysqli_connect_errno ();//返回最后一次连接调用的错误代码
string mysqli_connect_error ();//返回一个字符串描述的最后一次连接调用的错误代码

3)设置默认字符编码

bool mysqli_set_charset ( mysqli $link , string $charset )

4)选择特定的数据库

bool mysqli_select_db ( mysqli $link , string $dbname);

5)关闭与mysql服务器的连接
bool mysqli_close ( mysqli $link );

<?php
header('Content-type:text/html;charset=utf-8');
//与MySQL建立连接
$link=@mysqli_connect('localhost','root','root');
//连接错误提示
if(mysqli_connect_errno()){
    exit(mysqli_connect_errno());
}
//设置默认字符编码
mysqli_set_charset($link,'utf8');
//选择数据库
mysqli_select_db($link,'myphp');
//关闭与mysql服务器的连接
mysqli_close($link);
?>

2.执行SQL语句

1)对数据库执行一条SQL语句
1>

mixed mysqli_query ( mysqli $link , string $query [, int $resultmode = MYSQLI_STORE_RESULT ] );

​ ①对于insert,update,delete等不会返回数据的SQL语句,在执行没有错误时将返回true。
​ ②对于返回数据的SQL语句执行成功的时候会返回结果集对象可以使用操作结果集对象的函数来从中获取数据
​ ③MYSQLI_STORE_RESULT和MYSQLI_USE_RESULT决定了mysqli client和server之间取结果集的方式。
​ MYSQLI_STORE_RESULT:执行SQL时提取结果集返回给client,并分配内存,存储到用户程序空间中,之后mysqli_fetch_array()
​ 相当于是从本地取数据;而MYSQLI_USE_RESULT方式下,mysqli_fetch_array()每次都要向server请求结果行。
​ MYSQLI_USE_RESULT:执行SQL的时候并没有从server将结果集取回
2>bool mysqli_real_query ( mysqli $link , string $query );
​ 也可以使用本函数对数据库执行一条SQL语句,返回结果为布尔值,不返回结果集。
​ 如果想获取结果集可以使用mysqli_store_result()获取结果集对象.
3>如果在执行SQL语句的时候发生错误,以上两个函数都将返回false,并且可以使用以下函数处理错误原因
int mysqli_errno ( mysqli $link );
string mysqli_error ( mysqli $link );

//对数据库执行一条SQL语句
//$query='insert into t1(info) values("xiaoming")';
$query='select*from t1';
$result=mysqli_query($link,$query);

2)操作结果集对象的函数
1>从结果集对象中解析数据的常见函数
①以索引数组的方式获取一条记录的数据
mixed mysqli_fetch_row ( mysqli_result $result );
重复使用以获取下一条记录的数据

//以索引数组的方式获取一条记录的数据
while ($data=mysqli_fetch_row($result)){
    var_dump($data);
}

②以关联数组的方式获取一条记录的数据
array mysqli_fetch_assoc ( mysqli_result $result );
重复使用以获取下一条记录的数据

//以关联数组的方式获取一条记录的数据
var_dump(mysqli_fetch_assoc($result));
var_dump(mysqli_fetch_assoc($result));
var_dump(mysqli_fetch_assoc($result));
var_dump(mysqli_fetch_assoc($result));
var_dump(mysqli_fetch_assoc($result));

③以索引数组或关联数组的方式获取一条记录的数据
mixed mysqli_fetch_array ( mysqli_result $result [, int $resulttype = MYSQLI_BOTH ] );
重复使用以获取下一条记录的数据

//以索引数组或关联数组的方式获取一条记录的数据
//第二个参数可选值:MYSQLI_ASSOC, MYSQLI_NUM, MYSQLI_BOTH(默认)
var_dump(mysqli_fetch_array($result,MYSQLI_NUM));

④以索引数组或关联数组的方式获取全部记录的数据
mixed mysqli_fetch_all ( mysqli_result $result [, int $resulttype = MYSQLI_NUM ] );

mysqli_fetch_all($result);

⑤返回结果集中的下一个字段信息
object mysqli_fetch_field ( mysqli_result $result );

//返回结果集中的下一个字段信息
$filed=mysqli_fetch_field($result);
var_dump($filed);
echo $filed->orgname;
//重复使用获取下一个字段
var_dump(mysqli_fetch_field($result));
var_dump(mysqli_fetch_field($result));

⑥返回一个代表结果集字段的对象数组
array mysqli_fetch_fields ( mysqli_result $result );

//返回一个代表结果集字段的对象数组
var_dump(mysqli_fetch_fields($result));
$fields=mysqli_fetch_fields($result);
echo $fields[0]->name;

⑦获取结果中行的数量
int mysqli_num_rows ( mysqli_result $result );

//获取结果中行的数量
var_dump(mysqli_num_rows($result));

注意:如果使用MYSQLI_USE_RESULT模式则必须在获取完所有的结果才可使用该函数。
2>释放与一个结果集相关的内存
返回的结果集在数据量很大的时候需要很多的内存支持,所以在操作完结果集的时候有必要立刻释放与一个结果集相关的内存, 释放之后,结果集就不可用了
void mysqli_free_result ( mysqli_result $result );

//释放与一个结果集相关的内存
mysqli_free_result($result);

3)其他常用函数
1>获取前一个Mysql操作的受影响行数
int mysqli_affected_rows ( mysqli $link );
2>返回最后一次操作自动生成并使用的id
mixed mysqli_insert_id ( mysqli $link );
3>转义用于SQL语句中的特殊字符防止SQL语句出错
string mysqli_real_escape_string ( mysqli $link , string $escapestr );
4)一次性执行多条SQL语句,多个SQL语句用分号隔开
bool mysqli_multi_query ( mysqli $link , string $query );

七、知识补充

1.include语句

当一个文件被包含时,其中所包含的代码继承了 include 所在行的变量范围。从该处开始,调用文件在该行处可用的任何变量在被调用的文件中也都可用。

2.include_once语句

唯一区别是如果该文件已经被包含过,则不会再次包含。可以用于在脚本执行期间同一个文件有可能被包含超过一次的情况下,想确保它只被包含一次以避免函数重定义,变量重新赋值等问题。

3.require语句

require 和 include 几乎完全一样,除了处理失败的方式不同之外。require 在出错时产生致命错误。换句话说将导致脚本终止而 include 只产生警告信息,脚本会继续运行。

4.require_once语句

require_once 语句和 require 语句完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 qwzf1024@qq.com

×

喜欢就点赞,疼爱就打赏