当前位置:首页 > 问答 > 正文

PHP开发里经常用到的那些MySQL语句,写代码时总会碰上的各种查询和操作

在PHP开发中,和MySQL数据库打交道是家常便饭,以下这些SQL语句,几乎在每个项目中都会反复出现,为了方便理解,我们假设有一个名为users的用户表,它包含idusernameemailcreated_at等字段;还有一个名为articles的文章表,包含idtitlecontentuser_id(作者ID)和published_at等字段。

插入数据(INSERT INTO) 当用户注册时,我们需要将他的信息存入数据库,这时就用到了INSERT语句。 例子:INSERT INTO users (username, email, created_at) VALUES ('张三', 'zhangsan@example.com', NOW()) 这句SQL的意思是:向users表中的usernameemailcreated_at字段插入对应的值。NOW()是MySQL的函数,能自动获取当前时间,在PHP中,我们通常会使用预处理语句来安全地执行这个操作,防止SQL注入攻击。

查询数据(SELECT ... FROM ...) 这是使用频率最高的语句,用于从表中获取数据。

  • 查询所有数据SELECT * FROM users,这会获取users表里的所有记录的所有字段,星号代表所有字段,但在实际项目中,为了性能,建议明确写出需要的字段名,比如SELECT id, username FROM users
  • 带条件的查询(WHERE):几乎所有的查询都不会是获取全部数据,而是有特定条件的。
    • 根据ID查询用户:SELECT * FROM users WHERE id = 1
    • 根据用户名和邮箱查询(AND):SELECT * FROM users WHERE username = '李四' AND email = 'lisi@example.com'
    • 模糊查询(LIKE):搜索用户名中包含“张”的用户:SELECT * FROM users WHERE username LIKE '%张%',百分号是通配符,代表任意字符。
  • 限制查询条数(LIMIT):在分页或者只需要获取前几条记录时非常有用,获取最新的10篇文章:SELECT * FROM articles ORDER BY published_at DESC LIMIT 10ORDER BY published_at DESC表示按发布时间降序排列,即最新的排在前面。

更新数据(UPDATE ... SET ... WHERE) 当用户修改自己的个人信息时,就需要用到UPDATE语句。 例子:UPDATE users SET email = 'new_email@example.com' WHERE id = 5 这句SQL将id为5的用户的邮箱更新为新邮箱。这里要极其小心,WHERE条件绝对不能省略,否则会将表中所有用户的邮箱都更新掉,造成严重事故。

删除数据(DELETE FROM ... WHERE) 当需要删除一条记录时使用。 例子:DELETE FROM articles WHERE id = 15 这句SQL会删除id为15的文章,和UPDATE一样,WHERE条件至关重要,没有条件会清空整个表。

表连接查询(JOIN) 这是关系型数据库的核心操作之一,当我们需要的信息分布在多个表时,就需要连接。 我们要显示文章列表,并同时显示每篇文章的作者名,文章存在articles表,作者名存在users表,它们通过articles.user_idusers.id关联。 SELECT articles.title, articles.published_at, users.username FROM articles INNER JOIN users ON articles.user_id = users.id ORDER BY articles.published_at DESC 这里使用了INNER JOIN(内连接),意思是只选择那些在articles表中有user_id并且在users表中能找到对应id的记录,这是一种非常常见的“一对多”关系查询。

统计数量(COUNT) 用于计算满足条件的记录有多少条,常用于分页计算总页数,或者统计数量。 例子:统计用户总数:SELECT COUNT(*) AS total_users FROM users 统计某个分类下的文章数:SELECT COUNT(*) FROM articles WHERE user_id = 3AS total_users是给统计结果起一个别名,在PHP中可以通过这个别名来获取值。

排序(ORDER BY) 让查询结果按某个字段排序。

  • 升序(默认,ASC):SELECT * FROM users ORDER BY created_at ASC (按注册时间从早到晚排序)
  • 降序(DESC):SELECT * FROM articles ORDER BY published_at DESC (按发布时间从新到旧排序)

数据分组(GROUP BY) 通常与COUNT、SUM、AVG等聚合函数一起使用,我们想统计每个用户发表了多少篇文章: SELECT user_id, COUNT(*) AS article_count FROM articles GROUP BY user_id 这句SQL会先按user_id将文章分组,同一個user_id的文章被分到一组,然后计算每组的文章数量。

在PHP中如何使用这些语句: 通常的步骤是:连接数据库 -> 准备SQL语句 -> 执行查询 -> 处理结果 -> 关闭连接。 对于INSERT、UPDATE、DELETE这种不返回数据行的操作,使用mysqli_query或PDO的exec方法,然后检查影响的行数。 对于SELECT这种返回数据集的查询,执行后需要使用循环(如while循环)来遍历结果集(mysqli_fetch_assoc或PDO的fetch方法),将每行数据转换为数组供PHP使用。

特别重要的安全提醒: 在PHP中拼接SQL语句时,绝对不能直接将用户输入的数据(如$_POST$_GET)拼接到SQL字符串中,这会导致致命的SQL注入漏洞,必须使用预处理语句(Prepared Statements),这是防止SQL注入的唯一正确方式,无论是MySQLi还是PDO扩展都支持预处理。

这些操作构成了PHP与MySQL交互的基础,几乎所有的业务逻辑,如用户注册登录、新闻列表展示、数据管理后台,都是通过这些基本语句的组合来实现的。

PHP开发里经常用到的那些MySQL语句,写代码时总会碰上的各种查询和操作