mysql快速入门

数据库基本概念

之前了解过一点点数据库的概念,所以到这里学习这一小节会比较轻松。

一、数据库的基本概念

数据库:信息存储的仓库,包括一系列的关系措施

:一个数据库中可以有若干张表(形势上你可以看出我们日常生活中建立的表)

字段:表里面的信息会分成若干个栏目来存,这些栏目在数据库技术中的名称叫做“字段”,栏目里面存的具体信息叫字段值

记录:一条信息叫做一条记录

一个数据库管理系统中可以建立若干个数据库,每个数据库中又可以建立若干张表,每张表中可以有若干条记录。

MySQL支持的数据类型

为了对不同性质的数据进行区分,以提高数据查询和操作的效率,数据库系统将可以存入的数据分为多种类型。MySQL数据库中的数据类型分为三大类:数值类型、日期类型、字符串类型。

1.数值类型

在整数类型中,按照取值范围和存储方式不同,分为tinyint、smallint、mediumint、int和bigint这5个类型。

2.日期类型

日期和时间类型

date、datetime、timestamp、time、year。

datetime是常用的日期类型。如:

create table j4y(dt datetime);
insert into j4y values(now());

3.字符串类型

字符串类型 描述

CHAR(M) M为0~255之间的整数,表示可以存M个字符

VARCHAR(M) M为0~65535之间的整数,表示可以存M个字符

TINYTEXT 允许长度0~255字符

TEXT 允许长度0~65535字符

MEDIUMTEXT 允许长度0~167772150字符

LONGTEXT 允许长度0~42949667295字符

BINARY(M) 允许长度0~M个字节的定长字节字符串(类似于CHAR类型,但保存二进制字节字符串而不是非二进制字符串)

VARBINARY(M) 允许长度0~M个字节的变长字节字符串类型类似于VARCHAR类型,但保存二进制字节字 符串而不是非二进制字符串。

TINYBLOB 允许长度0~255字节的BLOB列(保存二进制字节字符串)

BLOB 允许长度0~65535字节的BLOB列(保存二进制字节字符串)

MEDIUMBLOB 允许长度0~167772150字节的BLOB列(保存二进制字节字符串)

LONGBLOB允许长度0~4294967295字节的BLOB列(保存二进制字节字符串)

ENUM 枚举类型

SET SET类型

字符串类型详细说明:

1)char和varchar类型

​ char与varchar很类似,都用来保存MySQL中较短字符串。

​ 区别:char列的长度固定位创建表时声明的长度,长度可以为0~255的任何值;

​ varchar列中的值为可变长字符串,长度可以指定为065535(MySQL5.0.3版本以前为0255)之间的值。

​ 在检索时,char列删除尾部的空格,而varchar则保留这些空格。

​ create table j4y(v varchar(4),c char(4));

​ insert into j4y values(‘ab ‘,’ab ‘);

​ select length(v),length(c) from t1;

​ select concat(v,’+’),concat(c,’+’) from vc;

​ 选择:由于char是固定长度,所以它的处理速度比varchar快,但是缺点是浪费存储空间。所以对于那些长度变化不大的数据可以选择此列

2)text类型

​ 保存少量字符串的时候,我们会选择char或者varchar,保存大文本的时候通常会选择使用text。

3)blob类型

​ blob类型也是用来保存比较大量的字符串的名单是blob类型是用来保存二进制数据的比如照片。

2)ENUM类型

​ 枚举类型,它的值范围需要在创建表时通过枚举方式显式指定,对1255个成员的枚举需要1个字节存储;对于25565535个成员,需要2个

​ 字节存储。最多有65535个成员。

​ create table j4y(flag enum(‘a’,’b’,’c’,’d’));

​ insert into j4y values(‘a’),(‘a’),(‘f’);

​ 往enum类型里存储数据是忽略大小写的,对于插入不在enum指定范围内的值时,并没有返回警告,而是插入了enum的第一个值。

​ 另外enum类型只允许从值集合中选取单个值,而不能一次取多个值

3)SET类型

​ set和enum类型非常类似,也是一个字符串对象,里面可以包含0~64个成员。根据成员的不同,存储上也有所不同。

​ 1~8成员的集合,占1个字节

​ 9~16成员的集合,占2个字节

​ 17~24成员的集合,占3个字节

​ 25~32成员的集合,占4个字节

​ 33~64成员的集合,占8个字节

​ create table t1(flag set(‘a’,’b’,’c’,’d’));

​ insert into t1 values(‘a,b’),(‘a,d,a’);

​ SET类型可以从允许值集合中选择任意1个或多元素进行组合,所以对于输出的值只要在允许的组合范围内,都可以正确地注入到set类型的

​ 列中。

​ 对于超出允许值范围的值,将不允许注入,对于包含重复的成员的集合将只取一次进行注入

​ 使用FIND_IN_SET函数对set类型的数据进行查询是比较好的选择!

MySQL使用入门

SQL分类

DDL语句

操作之前首先登录mysql。

mysql -u 用户名 -p回车然后输入密码登录。(有密码输密码,无密码直接回车)

1)DDL(Data Definition Languages)语句

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

登录mysql,对数据库进行操作。

1>show databases;查看所有数据库

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| challenges         |
| dvwa               |
| mysql              |
| performance_schema |
| security           |
| test               |
+--------------------+

2>create database 数据库名;创建一个数据库(数据库名自定义)

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

3>drop database 数据库名;删除数据库

4>创建表、字段。删除表、字段。等等这些基本操作就不在叙述,之前总结过了。只添加一些补充内容。

5>查看表:desc 表名

mysql> desc j4y;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id1   | int(11) | YES  |     | NULL    |       |
| id2   | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

第二种方式:show create table 表名 \G最后无分号。

mysql> show create table j4y \G
*************************** 1. row ***************************
       Table: j4y
Create Table: CREATE TABLE `j4y` (
  `id1` int(11) DEFAULT NULL,
  `id2` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

说明:\G选项使得记录能够按照字段竖向排列,以便更好地显示内容较长的记录。

6> 修改表

1)修改表的字段类型

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

举个栗子

2)增加表字段

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

3)删除表字段

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

4)字段改名

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

举个例子:

mysql> alter table j4y add column id3 int;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> alter table j4y change column id2 Augenstern int;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc j4y;
+------------+------------+------+-----+---------+-------+
| Field      | Type       | Null | Key | Default | Extra |
+------------+------------+------+-----+---------+-------+
| id1        | tinyint(4) | YES  |     | NULL    |       |
| Augenstern | int(11)    | YES  |     | NULL    |       |
| id3        | int(11)    | YES  |     | NULL    |       |
+------------+------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
  1. 修改字段排列顺序
alter table j4y modify id1 tinyint first;//移动到第一位
alter table j4y modify id3 int after id1;//移动到指定位置后面

6)更改表名

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

DML语句

DML操作是指对数据库中表记录的操作,主要包括表记录的插入、更新、删除、和查询。

  1. 插入记录
insert into 表名(字段1,字段2,字段3,....,字段n) values(相对应的内容)

栗子:

mysql> insert into admin(id,lxj,j4y) values(01,456,789);
Query OK, 1 row affected (0.00 sec)

mysql> select * from admin;
+------+------+------+
| id   | lxj  | j4y  |
+------+------+------+
|    1 |  456 |  789 |
+------+------+------+
1 row in set (0.00 sec)

字段名可不写。

一次性插入多条记录,:

mysql> insert into admin(id,lxj,j4y) values
    -> (2,564,446),
    -> (3,580,541),
    -> (4,965,315);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from admin;
+------+------+------+
| id   | lxj  | j4y  |
+------+------+------+
|    1 |  456 |  789 |
|    2 |  564 |  446 |
|    3 |  580 |  541 |
|    4 |  965 |  315 |
+------+------+------+
4 rows in set (0.00 sec)
  1. 更新记录

更新一个表

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

更新多个表

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

删除一个表中的数据

delete from 表名 [where 条件];

输出多个表中的数据

delete 表1,表2,...表n from 表1,表2,...表n [where 条件];
  1. 查询记录

一、查询不重复的记录

SELECT distinct field1,field2 FROM 表名;
只要field1,field2任何一个字段有不同就会被选择!
一般使用distinct,只筛选一个字段!

二、

=,<,>,>=,<=,!=等比较运算符
多个条件之间可以使用or andwhere 后面接条件
select * from 表名 where 条件

三、排序

asc:由低到高,也是默认值

select * from 表名 order by 字段名 asc;

如:

mysql> select * from admin order by id asc;
+------+------+------+
| id   | lxj  | j4y  |
+------+------+------+
|    1 |  456 |  789 |
|    2 |  564 |  446 |
|    3 |  580 |  541 |
|    4 |  965 |  315 |
+------+------+------+
4 rows in set (0.00 sec)

desc:由高到底

select * from 表名 order by 字段名 desc;

多个字段排序

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

四、聚合

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

五、表连接

需求:显示多个表中的字段的时候即可使用表连接

连接分类

内连接:选取两张表中相互匹配的记录

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

外连接:不仅仅选取两张相互匹配的记录,并且会选出其他不匹配的记录

  • 左连接

概念:包含左边表中的所有记录(包括右表中没有和它匹配的记录)

  • 右连接

概念:包含右边表中的所有记录(包括左表中没有和它匹配的记录)
左连接和右连接是可以相互转换的!

六、子查询

需求:一个查询需要另外一个查询的结果参与的时候

用于子查询的关键字:

①: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 exists

与exists相反

select * from 表名1 where 表名2 in(select 表名2 from 字段名);

若查询结果唯一可以使用=代替in

select * from 表明1 where 表名2=(select 表名2 from 字段名 limit 1);

七、记录联合

我们常常会碰到需要将两个表或者多个表的数据按照一定的查询条件查询出来后,将结果合并到一起显示这是就需要用到记录联合
多个select 语句用
UNION或者UNION ALL隔开即可实现
区别: 前者 会将多个查询结果合并后并且进行去除重复后返回
后者 则直接合并并不去除重复
联合的条件:查询的列个数要相等

MySQL中的常用函数

  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)			返回字符串长度
  1. 数值函数
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位小数的结果
  1. 日期和时间函数
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之间的天数
  1. 流程函数
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语句比较像
  1. 其他常用函数
DATABASE()		返回当前数据库名
		VERSION()		返回当前数据库版本
		USER()			返回当前登录用户名
		INET_ATON(IP)	返回IP地址的数字表示
		INET_NTOA(num)	返回数字代表的IP地址
		PASSWORD(str)	返回字符串str的加密版本
		MD5()			返回字符串str的MD5值

知识补充:数据库字符编码

一、MySQL支持的字符集

1.查看所有可用的字符集

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

2.MySQL的字符集包括字符集(character)和校对规则(collation)两个概念。

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

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

  1. 数据库字符集和校对规则设置
CREATE DATABASE db_name
		[[DEFAULT] CHARACTER SET charset_name]
		[[DEFAULT] COLLATE collation_name]
		查看当前数据库的字符集和校对规则:
			show variables like 'character_set_database';
			show variables like 'collation_database';
		ALTER DATABASE db_name
		[[DEFAULT] CHARACTER SET charset_name]
		[[DEFAULT] COLLATE collation_name]
  1. 表字符集和校对规则设置
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]

连接字符集设置:客户端和服务器之间交互的字符集

在PHP中使用mysql与mysqli交互

一、使用mysqli

在PHP中可以使用mysqli扩展与mysql数据库进行信息交流,i表示改进,增强,它执行速度更快,是一种面向对象的技术。

  1. 建立、关闭与MySQL服务器的连接
    ①:连接指定的MySQL服务器
    $mysql_connect=@mysqli_connect($host,$user,$password,$database,$port);
    默认端口3306,可不填。
    ②:连接错误时提示
    ③:设置默认字符编码
    ④:选择特定的数据库
    ⑤:关闭与mysql服务器的连接
    下面一个栗子:
<?php
header('Content-type:text/html;charset=utf-8');
$link=@mysqli_connect('localhost','root','root','','3306');
if (mysqli_connect_errno()){
    exit(mysqli_connect_errno());
}
mysqli_set_charset($link,'utf-8');//设置默认字符编码
mysqli_select_db($link,'test');//选择特定的数据库
mysqli_close($link);//关闭与mysql服务器的连接
?>

跑一下,如果没有报错,就是连接成功了。

二、执行SQL语句

  1. 对数据库执行一条SQL语句
mixed mysqli_query ( mysqli $link , string $query [, int $resultmode = MYSQLI_STORE_RESULT ] );

①对于insert,update,delete等不会返回数据的SQL语句,在执行没有错误时将返回true。
②对于返回数据的SQL语句执行成功的时候会返回结果集对象可以使用操作结果集对象的函数来从中获取数据

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

                        重复使用以获取下一条记录的数据

    ②以关联数组的方式获取一条记录的数据

                        `array mysqli_fetch_assoc ( mysqli_result $result );`
                        重复使用以获取下一条记录的数据
          ③以索引数组或关联数组的方式获取一条记录的数据
                     `   mixed mysqli_fetch_array ( mysqli_result $result [, int $resulttype = MYSQLI_BOTH ] );`
                        重复使用以获取下一条记录的数据
          ④以索引数组或关联数组的方式获取全部记录的数据
                       ` mixed mysqli_fetch_all ( mysqli_result $result [, int $resulttype = MYSQLI_NUM ] );`
          ⑤返回结果集中的下一个字段信息
                 `       object mysqli_fetch_field ( mysqli_result $result );`
          ⑥返回一个代表结果集字段的对象数组
                     `   array mysqli_fetch_fields ( mysqli_result $result );`
          ⑦获取结果中行的数量
                     `   int mysqli_num_rows ( mysqli_result $result );`
                        注意:如果使用MYSQLI_USE_RESULT模式则必须在获取完结果集才可使用该函数。
  2. 释放与一个结果集相关的内存
    返回的结果集在数据量很大的时候需要很多的内存支持,所以在操作完结果集的时候有必要立刻释放与一个结果集相关的内

          存, 释放之后,结果集就不可用了
          `void mysqli_free_result ( mysqli_result $result );`

    知识补充

  3. include语句

    <?php
    header('Content-type:text/html;charset=utf-8');
    echo dirname(__FILE__).'/login.php';
    include 'login.php';//include后面接上一个空格然后接上一个字符串,字符串里面是要包含进来并执行的一个php文件的路径
    ?>

    这个就好像是C++中分开写代码那样(跟继承差不多),可以用#include "xxxx.h"来使用这个类。相当于原本一个代码将它拆分成两个,逻辑更加清晰。(实际上还是一个代码。)

  4. include_once语句
    如果文件被包含,则不会再次包含,可以用在脚本执行期间同一个文件有可能被包含超过一次的情况下,想确保文件只被包含一次以避免函数重定义,变量赋值等问题。

  5. require语句
    和include语句差不多,处理失败的方式不同,include是出错了还会接着执行,但是require语句是出错了就会停止执行。

  6. require_once语句
    与require语句基本相同,唯一区别就是php会检查这个文件是否已经被包含过了,如果包含过,那么就不会再次包含。

终于到此结束,但是感觉这是边学边忘,这样肯定不行,接下来找时间学习开发小论坛,最起码不能学了跟没有学一样吧,如果这样就是在浪费时间。

文末寄语:

一个远行的人要寻找什么呢?可能他自己也不知道,他只是寻找,张望,直到最后,寻找成了他的命运。就像我在你身上,寻找我的命运,那不能把握没法参透的一部分,就是我们的真爱。 —— 田艺苗《旅人》