PHP入门 – SQL语句设计/数据表增删改查

在我们创建好数据库和数据表后,我们就需要往数据表里插入数据了。这也是我们经常听到的增删改查。

操作数据表中的数据记录

1.使用INSERT语句向数据表中添加数据

格式:

INSERT INTO 表名 [(字段名1,…字段名n)] VALUES(‘值1’,…,’值n’);

INSERT INTO 表名 [(字段名1,…字段名n)] VALUES(‘值1’,…,‘值n’),(‘值1’,…,’值n’);

2.使用UPDATE语句更新数据表中已存在的数据

SQL语句可以使用UPDATE语句对表中的一列或多列数据进行修改,必须指定需要修改的字段,并且需要赋予的新值。还要给出必要的WHERE子句指定要更新的数据行。

格式:

UPDATE 表名 SET 字段名=表达式 [,…][WHERE 条件]

示例

UPDATE `users` SET `username`='xiaoming', `tel`='123456789' WHERE `id`=3;

3.使用DELETE语句删除数据表中不需要的数据记录

DELETE语句用来删除数据表中的一条或多条数据记录。

格式:

DELETE FROM 表名 [WHERE 条件]

小提示:删除数据是风险较高的操作,通常在编程中不会使用DELETE删除数据,而是使用更新某列数据的状态。

查询一张表中的数据

1.最简单的查询语句是使用SELECT语句检索记录的特定字段,多个字段可以用逗号分隔,例如:

SELECT username,password FROM user;

也可以使用*从表中检索出所有字段,使用“SELECT *”主要是针对用户的书写方便而言的。如果一张表当中的数据多大几百万,就意味着资源的浪费和漫长的查询等待,所以实际应用时要尽量避免使用它,而把查询的列名准确地列出来,也可以按自己指定的列顺序输出。

 

如果想为返回的列取一个新的标题,以及经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。例如:在上例的输出结果中使用中文字段名,可以在MySQL控制台中输入的命令如下所示:

SELECT username as ‘用户名’ FROM user;

定义别名时一定要使用单引号引起来,其中AS关键字是可选的,在原字段名和别名之间使用一个空格即可。

SELECT username ‘用户名’ FROM user;

2. 如果在使用SELECT语句返回的记录结果中包含重复的记录,可以使用DISTINCT关键字取消重复的数据,只返回一个。另外,要注意DISTINCT关键字的作用是整个查询的列表,而不是单独的一列。DISTINCT会消耗一定的服务器资源,如果不指定,会默认使用ALL关键字作为检索模式。

SELECT DISTINCT gid FROM user_group;

3. 在SELECT语句中,可以使用WHERE子句指定搜索条件,实现从数据表中检索出符合条件的记录。其中,搜索条件可以由一个或多个逻辑表达式组成,这些表达式指定关于某一记录是真或假的条件。在WHERE子句中,可以通过逻辑操作符和比较操作符指定基本的表达式条件。

逻辑操作符

图片1

比较运算符

图片2
图片3

4.空值只能定义在允许NULL字段中出现,NULL值是特殊的值,代表“无值”,与零值(0)和空字符串('')都不相同。当在不支持默认值的字段中未输入值,或在字段中显式的设置为空,就会出现空值,但不能用处理已知值的方式来处理NULL。为了进行NULL值的搜索,必须采用特殊的语法。如果要检索NULL值,必须使用IS NULL和IS NOT NULL关键字。

5.使用SELECT语句获取数据表中的数据时,返回的记录一般是无规则排列的,有可能每次获取的查询记录截然不同。为了使用检索的结果方便阅读,可以在SELECT语句中使用ORDER BY子句,对检索的结果进行排序。

ORDER BY后面可以接一列或多列用于排序的字段,并且使用DESC或ASC关键字设计字段排序的方式。默认情况下按照升序排列,即使用ASC关键字。否则要按照降序排列,必须使用DESC关键字。ORDER BY子句可以和SELECT语句中的其他子句一起使用,但在子查询中不能有ORDER BY子句,因为ORDER BY子句只能对最终查询结果排序。

SELECT * FROM users ORDER BY id DESC;

以上可以实现对数据表内容按照字段 id 的降序排列

6. 如果在数据表中的记录数非常多,一次从表中返回大量的记录不仅检索的速度慢,用户阅读也很不方便。所以在通过SELECT语句检索时,使用LIMIT子句一次取少量的记录,而用分页的方式继续阅读后面的数据。

LIMIT子句也可以和其他的SELECT子句一起使用,它可以指定两个参数,分别用以设置返回记录的起始位置,和返回记录的数量。

LIMIT子句也可以只使用一个参数,表示从开头位置,即偏移量为0的位置返回指定数量的记录,在上例中使用的“LIMIT 0, 5”等价于“LIMIT 5”。

SELECT * FROM users ORDER BY id DESC LIMIT 2,2;

以上可以实现对数据表内容按照 id 的倒序排列并只读取从第 3条数据的两条数据。

7. 在数据库系统中提供了一系列的内置统计函数,在SQL查询中使用这些统计函数可以更有效地处理数据。这些统计函数把存储在数据库中的数据,描述为一个整体而不是一行行孤立的记录。

图片4

这些函数通常用在SELECT子句中,作为结果数据集的字段返回的结果。在SELECT语句的SELECT子句中使用函数的语法如下:

SELECT 函数名(列名1 或*),...函数名(列名n) FROM 表名; #使用统计函数

SELECT COUNT(*) AS count FROM users;

以上可以统计数据表中有多少列数据。

SELECT COUNT(DISTINCT username) as count from users;

以上可以实现统计数据表中 字段 username 值不重复的列数。

SELECT sex,COUNT(*) AS count FROM users GROUP BY sex;

以上可以实现统计数据表中以字段 sex 分类的各类的列数

8.前面使用统计函数返回的是所有记录的统计结果,如果要对数据进行分组统计,就需要使用GROUP BY子句。这将可以允许用户在对数据进行分类的基础上,进行再查询。GROUP BY子句将表按列值分组,列的值相同的分为一组。如果GROUP BY后面有多个列名,则先按第一个列名分组,再在每组中按第二个列名分组。

需要注意的是,在GROUP BY子句中不支持对字段分配别名,也不支持任何使用了统计函数的集合列。

在完成数据结果的分组查询和统计后,还可以使用HAVING子句来对查询的结果,进行进一步的筛选。

在SELECT语句的子句中:WHERE子句选择所需要的行;GROUP BY子句进行了必要的分组整理;而HAVING子句对最后的分组结果进行了重新筛选。

查询多张表中的数据

1.多表查询(连接查询)

前提条件:假设有两个表,一个是学生表,一个是学生成绩表。

内连接 inner jion :

最常见的连接查询可能是这样,查出学生的名字和成绩:

select s.name,m.mark from student s,mark m where s.id=m.studentid

上面就是我们最常见的inner join,即内连接,把符合student.id=mark.studentid 条件的元组才选出来,也可以写成:

select s.name,m.score from student s inner join mark m on s.id=m.studentid

左连接-left join:

左连接是把左边的表的数据全部选出来:

select s.name,m.score from student s left join mark m on s.id=m.studentid

上面语句就是把左边的表,即student表中的元组全部选出,尽管有些分数表是没数据的,也选了出来

右连接-right join:

右连接就是把右边表的数据全部取出,不管左边的表是否有匹配的数据:

select s.name,m.score from student s right join mark m on s.id=m.studentid

上面的语句就是把mark分数表的数据全部取出来,不管student表中是否有数据匹配

全连接-full join(貌似mysql不支持)

把左右两个表的数据都取出来,不管是否匹配:

select s.name,m.score from student s full join mark m on s.id=m.studentid

2.嵌套查询(子查询)

where型子查询(把内层查询结果当作外层查询的比较条件)

取出每个栏目下最新的产品(goods_id唯一)

select cat_id,goods_id,goods_name from goods where goods_id in(select max(goods_id) from goods group by cat_id);

from型子查询 (把内层的查询结果供外层再次查询)

用子查询查出挂科两门及以上的同学的平均成绩

思路:

先查出哪些同学挂科两门以上

select name,count(*) as gk from stu where score < 60 having gk >=2;

以上查询结果,我们只要名字就可以了,所以再取一次名字

select name from (select name,count(*) as gk from stu having gk >=2) as t;

找出这些同学了,那么再计算他们的平均分

select name,avg(score) from stu where name in (select name from (select name,count(*) as gk from stu having gk >=2) as t) group by name;

exists型子查询(把外层查询结果拿到内层,看内层的查询是否成立)

查询哪些栏目下有商品,栏目表category,商品表goods

select cat_id,cat_name from category where exists(select * from goods where goods.cat_id = category.cat_id);

 

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇