欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PHP学习总结(数据库概念、DDL语句、DML语句)

程序员文章站 2022-05-07 14:22:31
...

自从做完一个简单的登陆注册页面,发现数据库知识真的很重要,所以要详细的学习一下数据库的知识。

一、数据库基本概念
数据库可以理解为用来存储信息的仓库

表:表是数据的矩阵,在一个数据库中的表看起来像一个简单的电子表格。
列: 一列(数据元素) 包含了相同的数据, 例如邮政编码的数据。
行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
主键:主键是唯一的。一个数据表中只能包含一个主键,可以使用主键来查询据。
表头(header): 每一列的名称;
基本概念可以在菜鸟教程中学习
菜鸟教程
PHP学习总结(数据库概念、DDL语句、DML语句)

二、DDL语句
对数据库的操作

1).创建数据库

create database 数据库名;

例如:

mysql> use bss;/使用这个名为bss的数据库
Database changed

2)选择要操作的数据库

use 数据库名;

3)查看数据库中所有的数据表

show tables;

4)删除数据库

drop database 数据库名称;

例如:

mysql> create database xiao;
Query OK, 1 row affected (0.00 sec)/这样就新建一个数据库,我们也可以在查看一下。
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| bss                |
| myhtml             |
| mysql              |
| performance_schema |
| score              |
| test               |
| xiao               |
+--------------------+
8 rows in set (0.00 sec)/这样数据库中便有了这个xiao数据库,接下来再删除它。
mysql> drop database xiao;
Query OK, 0 rows affected (1.85 sec)
/这样xiao数据库就被删除了。

对表的操作
1)创建表

create table 表名(
					字段1名 字段1类型  列的约束条件(可加可不加),
					字段2名 字段2类型  列的约束条件,
					);

例如:

create table Q(id1 int,id2 int);
/这样就创建好一个名为Q的表

2)查看表

show tables;
//查看表数据
desc 表名;
//查看表结构

例如:

mysql> desc user;/查看表结构
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| pass  | varchar(30) | YES  |     | NULL    |       |
| name  | varchar(30) | YES  |     | NULL    |       |
| ttt   | varchar(40) | YES  |     | NULL    |       |
| sss   | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
5 rows in set (0.01 sec)
mysql> show tables;/查看表数据
+---------------+
| Tables_in_bss |
+---------------+
| user          |
| zzh           |
+---------------+
2 rows in set (0.00 sec)

3)查看创建表的SQL语句

show create table 表名 \G
show create table 表名;
//第一种相较于第二种更直观一些

例如:

mysql> show create table user;//查看建表命令
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                     |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| user  | CREATE TABLE `user` (
  `id` int(11) DEFAULT NULL,
  `pass` varchar(30) DEFAULT NULL,
  `name` varchar(30) DEFAULT NULL,
  `ttt` varchar(40) DEFAULT NULL,
  `sss` varchar(20) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

4)删除表

drop table 表名;

例如:

mysql> create table hello(id int,you varchar(30),me varchar(30));
Query OK, 0 rows affected (1.78 sec)/接下来我们查看一下
mysql> show tables;
+---------------+
| Tables_in_bss |
+---------------+
| hello         |
| user          |
| zzh           |
+---------------+
3 rows in set (0.00 sec)/这样bbs数据库中便有这个hello的数据表了
mysql> drop table hello;
Query OK, 0 rows affected (0.00 sec)
mysql> show tables;
+---------------+
| Tables_in_bss |
+---------------+
| user          |
| zzh           |
+---------------+
2 rows in set (0.00 sec)
/这样就删除了刚才所创建的数据表

5)修改表的字段类型

alter table 表名 modify 字段名 字段类型;

例如:

alter table Q modify id1 varchar;

6)增加表字段

alter table 表名 add 字段名 字段类型;

例如:

alter table Q add id3 int;

7)删除表字段

alter table 表名 drop 字段名;

例如:

mysql> alter table user drop pass;
Query OK, 3 rows affected (1.81 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> desc user;/再次查询
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| Id       | int(11)      | NO   | PRI | NULL    | auto_increment |
| username | varchar(255) | YES  |     | NULL    |                |
| password | varchar(255) | YES  |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)
/这样的话就将新建的pass字段给删除了

8)字段改名

alter table 表名 change 旧字段名 新字段名 字段类型;

例如:

mysql> desc zzh;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| he    | varchar(20) | YES  |     | NULL    |       |
| me    | varchar(40) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
/这里我们想把字段he改为you
mysql> alter table zzh change he you varchar(20);
Query OK, 0 rows affected (0.37 sec)
Records: 0  Duplicates: 0  Warnings: 0
/再次进行查询
mysql> desc zzh;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| you   | varchar(20) | YES  |     | NULL    |       |
| me    | varchar(40) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
/可以看到he已经改为了you

9)修改字段排列排序
例如:

		 alter table Q modify id2 tinyint first;
		 alter table Q modify id2 tinyint after id1;

10)更改表名

alter table 表名 rename 新的表名;

例如:

mysql> use bss;
Database changed
mysql> show tables;
+---------------+
| Tables_in_bss |
+---------------+
| user          |
| zzh           |
+---------------+
2 rows in set (0.00 sec)
/接下来我们把数据表user的名字改为username
mysql> alter table user rename username;
Query OK, 0 rows affected (1.75 sec)
/这些便实现了改表名称
mysql> show tables;
+---------------+
| Tables_in_bss |
+---------------+
| username      |
| zzh           |
+---------------+
2 rows in set (0.00 sec)

DML语句
这里我使用test数据库中的welcome表来进行练习
1)查询语句

select * from 表名;

2)插入记录

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

注意:values后面的顺序应该和字段的排序一致
例如:

mysql> insert into welcome(username,password) values('WMM',123);
		Query OK, 1 row affected (0.00 sec)
/注意values中有字符的话,用单引号括起来。
mysql>  insert into welcome(username,password) values(2,123);
		Query OK, 1 row affected (0.31 sec)
/这里插入两条数据
mysql> select * from welcome;/查询语句
		+----------+----------+
		| username | password |
		+----------+----------+
		| QTFY     | 123      |
		| 2        | 123      |
		| WMM      | 123      |
		+----------+----------+
		3 rows in set (0.00 sec)

3)一次插入多条记录

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

例如:

	mysql> insert into welcome(username,password) values
			-> (1,123),
			-> (2,123),
			-> (3,123),
			-> (4,123);
			Query OK, 4 rows affected (0.00 sec)
			Records: 4  Duplicates: 0  Warnings: 0
			mysql> select * from welcome;
			+----------+----------+
			| username | password |
			+----------+----------+
			| QTFY     | 123      |
			| 2        | 123      |
			| WMM      | 123      |
			| 1        | 123      |
			| 2        | 123      |
			| 3        | 123      |
			| 4        | 123      |
			+----------+----------+
			7 rows in set (0.00 sec)

4)更新记录
1.更新一个表

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

例如:

mysql>  update welcome set password=1234 where username='QTFY';
			Query OK, 1 row affected (0.00 sec)
			Rows matched: 1  Changed: 1  Warnings: 0
			mysql> select * from welcome;
			+----------+----------+
			| username | password |
			+----------+----------+
			| QTFY     | 1234     |
			| 2        | 123      |
			| WMM      | 123      |
			| 1        | 123      |
			| 2        | 123      |
			| 3        | 123      |
			| 4        | 123      |
			+----------+----------+
			7 rows in set (0.00 sec)
			/可以看到QTFY的密码已经从123改为1234

2.更新多个表中数据

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

例如:

			/首先再创建一个表Q
			mysql> create table Q(id int,age int);
			Query OK, 0 rows affected (0.08 sec)

			mysql> desc Q;
			+-------+---------+------+-----+---------+-------+
			| Field | Type    | Null | Key | Default | Extra |
			+-------+---------+------+-----+---------+-------+
			| id    | int(11) | YES  |     | NULL    |       |
			| age   | int(11) | YES  |     | NULL    |       |
			+-------+---------+------+-----+---------+-------+
			2 rows in set (0.02 sec)

			mysql> insert into Q(id,age) values(1,20);
			Query OK, 1 row affected (0.00 sec)

			mysql> select * from Q;
			+------+------+
			| id   | age  |
			+------+------+
			|    1 |   20 |
			+------+------+
			1 row in set (0.00 sec)
			/更新语句
			mysql> update welcome,Q set welcome.password=2000,Q.age=2000 where welcome.username='QTFY' and Q.age=20;
			Query OK, 2 rows affected (0.00 sec)
			Rows matched: 2  Changed: 2  Warnings: 0
			/更新结果:
			| QTFY     | 2000
			1 | 2000 |

5)删除记录
1.删除单表中的数据

delete from 表名 [where 条件];

例如:

mysql> select * from welcome;
			+----------+----------+
			| username | password |
			+----------+----------+
			| QTFY     | 2000     |
			| 2        | 123      |
			| WMM      | 123      |
			| 1        | 123      |
			| 2        | 123      |
			| 3        | 123      |
			| 4        | 123      |
			+----------+----------+
			7 rows in set (0.00 sec)
			/这里删除WMM记录
			mysql> delete from welcome where username='WMM';
			Query OK, 1 row affected (0.00 sec)
			/删除成功了
			mysql> select * from welcome;
			+----------+----------+
			| username | password |
			+----------+----------+
			| QTFY     | 2000     |
			| 2        | 123      |
			| 1        | 123      |
			| 2        | 123      |
			| 3        | 123      |
			| 4        | 123      |
			+----------+----------+
			6 rows in set (0.00 sec)

2.删除多个表中的数据、
delete 表1,表2,…表n from 表1,表2,…表n [where 条件];
不管是单表还是多表,不加where条件将会把表中的所有记录删除,所以操作时一定要小心。
这里的操作和更新多表大致一样。

6)查询记录

select * from 表名;
// 查询所有纪录
select  字段名 from 表名;
		//查询某个字段的记录

例如:

mysql> desc welcome;
		+----------+--------------+------+-----+---------+-------+
		| Field    | Type         | Null | Key | Default | Extra |
		+----------+--------------+------+-----+---------+-------+
		| username | varchar(255) | YES  |     | NULL    |       |
		| password | varchar(255) | YES  |     | NULL    |       |
		+----------+--------------+------+-----+---------+-------+
		2 rows in set (1.75 sec)
		/这里查username字段的记录
		mysql> select username from welcome;
		+----------+
		| username |
		+----------+
		| QTFY     |
		| 2        |
		| 1        |
		| 2        |
		| 3        |
		| 4        |
		+----------+
		6 rows in set (0.00 sec)

7)查询不重复的记录

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

例如:

mysql> select username from welcome;
			+----------+
			| username |
			+----------+
			| QTFY     |
			| 2        |
			| 1        |
			| 2        |
			| 3        |
			| 4        |
			+----------+
			6 rows in set (0.00 sec)
			/采用查询不重复记录语句
			mysql> select distinct username from welcome;
			+----------+
			| username |
			+----------+
			| QTFY     |
			| 2        |
			| 1        |
			| 3        |
			| 4        |
			+----------+
			5 rows in set (1.63 sec)

8)条件查询

= < > >= <= != 比较运算符
//多个条件之间可以使用or and等
//select * from 表名 where 条件

例如:

mysql> select * from welcome where username=4;
			+----------+----------+
			| username | password |
			+----------+----------+
			| 4        | 123      |
			+----------+----------+
			1 row in set, 1 warning (0.00 sec)
			/ or的用法
			mysql>  select * from welcome where username=4 or username=3;
			+----------+----------+
			| username | password |
			+----------+----------+
			| 3        | 123      |
			| 4        | 123      |
			+----------+----------+
			2 rows in set, 2 warnings (0.00 sec)
			/and的用法
			mysql> select * from welcome where username>1 and username<4 ;
			+----------+----------+
			| username | password |
			+----------+----------+
			| 2        | 123      |
			| 2        | 123      |
			| 3        | 123      |
			+----------+----------+
			3 rows in set, 1 warning (0.00 sec)
			mysql> select * from welcome where username>=1 and username<=4 ;
			+----------+----------+
			| username | password |
			+----------+----------+
			| 2        | 123      |
			| 1        | 123      |
			| 2        | 123      |
			| 3        | 123      |
			| 4        | 123      |
			+----------+----------+
			5 rows in set, 1 warning (0.00 sec)

9)排序和限制

排序:
				asc:由低到高
					select * from 表名 order by 字段名 asc;	
				desc:由高到底
					select * from 表名 order by 字段名 desc;
				多个字段排序
					select * from 表名 order by 字段名 desc,字段名 desc;

例如:

					/asc:由低到高
					mysql> select * from welcome order by username asc;
					+----------+----------+
					| username | password |
					+----------+----------+
					| 1        | 123      |
					| 2        | 123      |
					| 2        | 123      |
					| 3        | 123      |
					| 4        | 123      |
					| QTFY     | 2000     |
					+----------+----------+
					6 rows in set (1.69 sec)
					/desc:由高到底
					mysql> select * from welcome order by username desc;
					+----------+----------+
					| username | password |
					+----------+----------+
					| QTFY     | 2000     |
					| 4        | 123      |
					| 3        | 123      |
					| 2        | 123      |
					| 2        | 123      |
					| 1        | 123      |
					+----------+----------+
					6 rows in set (0.00 sec)
					/多个字段排序
					mysql> select * from welcome order by username desc,password desc;
					+----------+----------+
					| username | password |
					+----------+----------+
					| QTFY     | 2000     |
					| 4        | 123      |
					| 3        | 123      |
					| 2        | 123      |
					| 2        | 123      |
					| 1        | 123      |
					+----------+----------+
					6 rows in set (0.00 sec)

限制:

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

例如:

					/0条开始取一条
					mysql>  select * from welcome order by username desc limit 0,1
						-> ;
					+----------+----------+
					| username | password |
					+----------+----------+
					| QTFY     | 2000     |
					+----------+----------+
					1 row in set (0.00 sec)

10)聚合
sum求和

select sum(字段名) from 表名;

例如;

mysql> select sum(password) from welcome;
					+---------------+
					| sum(password) |
					+---------------+
					|          2615 |
					+---------------+
					1 row in set (1.66 sec)

count记录总数

select count(*|字段名) from 表名;

例如:

				mysql> select count(*) from welcome;
					+----------+
					| count(*) |
					+----------+
					|        6 |
					+----------+
					1 row in set (1.56 sec)

max最大值

select max(字段名) from 表名;

例如:

mysql> select max(password) from welcome;
					+---------------+
					| max(password) |
					+---------------+
					| 2000          |
					+---------------+
					1 row in set (0.00 sec)

min最小值

select min(字段名) from 表名;

GROUP BY分类聚合

select department,sum(字段名) from 表名 group by 字段名;

WITH ROLLUP分类聚合后的结果进行再汇总

select sum(字段名) from 表名 group by 字段名 with rollup;

HAVING

注意:having和where的区别在于,having是对聚合后的结果进行条件过滤,而where是在聚合前就对记录进行过滤 ,应该尽可能的对记录进行先过滤!
select sum(字段名) from 表名 group by 字段名 having sum(字段名)>1000;

11)表连接
显示多个表中的字段的时候即可使用表连接
内连接:选取两张表中相互匹配的记录
例如:

//这样的语句可以把两张表中互相匹配的记录放在一起
					mysql> select * from welcome,Q where welcome.username=Q.id;
					+----------+----------+------+------+
					| username | password | id   | age  |
					+----------+----------+------+------+
					| 1        | 6        |    1 |    6 |
					| 2        | 5        |    2 |    5 |
					| 3        | 4        |    3 |    4 |
					| 4        | 3        |    4 |    3 |
					| 5        | 2        |    5 |    2 |
					| 6        | 1        |    6 |    1 |
					+----------+----------+------+------+
					6 rows in set (1.65 sec)
					mysql> select welcome.username,Q.id from welcome,Q where welcome.username=Q.id;
					+----------+------+
					| username | id   |
					+----------+------+
					| 1        |    1 |
					| 2        |    2 |
					| 3        |    3 |
					| 4        |    4 |
					| 5        |    5 |
					| 6        |    6 |
					+----------+------+
					6 rows in set (0.00 sec)
内连接:select 表.字段名,....  from 表1名,表2名,...  where 表1.字段=表2.字段;

外连接:
仅仅选取两张相互匹配的记录,并且会选出其他不匹配的记录
左连接
概念:包含左边表中的所有记录(包括右表中没有和它匹配的记录)
例如:

mysql> select * from welcome left join Q on welcome.username=Q.id;
						+----------+----------+------+------+
						| username | password | id   | age  |
						+----------+----------+------+------+
						| 1        | 6        |    1 |    6 |
						| 6        | 1        |    6 |    1 |
						| 5        | 2        |    5 |    2 |
						| 2        | 5        |    2 |    5 |
						| 3        | 4        |    3 |    4 |
						| 4        | 3        |    4 |    3 |
						+----------+----------+------+------+
						6 rows in set (0.00 sec)
					/查出左边表的所有记录,不管右边有没有相匹配的

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

mysql> select * from Q right join welcome on welcome.username=Q.id;
					+------+------+----------+----------+
					| id   | age  | username | password |
					+------+------+----------+----------+
					|    1 |    6 | 1        | 6        |
					|    6 |    1 | 6        | 1        |
					|    5 |    2 | 5        | 2        |
					|    2 |    5 | 2        | 5        |
					|    3 |    4 | 3        | 4        |
					|    4 |    3 | 4        | 3        |
					+------+------+----------+----------+
					6 rows in set (0.00 sec)

12)子查询
一个查询需要另外一个查询的结果参与的时候
用于子查询的关键字:
in
语法:select * from 表名 where id in(select 字段名 from 表名);
in 在…里面
注意点 in后面的子语句必须只返回一个字段
若查询结果唯一(只有一条)可以使用=代替in
not in
与in相反
exists
语法:select语句 where exists(select 语句);
exists:后面那个子语句有没有查询出记录来,如果查询出记录来返回true,否则就是false
并且查询出来的记录的具体的值是NULL也是没有关系,也是返回true.
not exits
与exists相反
1)select * from 表名 where deptno in(select deptno from 表名);
2)若查询结果唯一可以使用=代替in
select * from 表名 where deptno=(select deptno from 表名 limit 限制条件);

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

//第一种去除了重复的
				mysql> select * from welcome union select * from Q;
				+----------+----------+
				| username | password |
				+----------+----------+
				| 1        | 6        |
				| 6        | 1        |
				| 5        | 2        |
				| 2        | 5        |
				| 3        | 4        |
				| 4        | 3        |
				+----------+----------+
				6 rows in set (0.00 sec)
				//第二种没有去掉重复的
				mysql> select * from welcome union all select * from Q;
					+----------+----------+
					| username | password |
					+----------+----------+
					| 1        | 6        |
					| 6        | 1        |
					| 5        | 2        |
					| 2        | 5        |
					| 3        | 4        |
					| 4        | 3        |
					| 1        | 6        |
					| 2        | 5        |
					| 3        | 4        |
					| 4        | 3        |
					| 5        | 2        |
					| 6        | 1        |
					+----------+----------+
					12 rows in set (0.00 sec)

mySQL中的DDL语句和DML语句都是常用的语句,总结下来,多回顾回顾。