Declarative vs imperative programming cannot always be distinguished on a syntactical level. To a large part, this is more about different programming styles: a declarative program will mostly describe the structure of the problem, whereas an imperative program will describe the steps of an algorithm that solves the problem. There is an interesting aspect we must get out of the way first, though: mutability: imperative programming inherently implies that data is modified. In declarative programming, we more often have descriptions of data flows without actual mutability. But while imperative/mutable vs declarative/immutable are correlated, this is not a hard and fast rule to distinguish them.
x = 3 Python example, we can’t tell what programming paradigm is being used, because that would depend on the wider context. Python as a whole is biased towards imperative programming. It is very statement-oriented. Every statement does something, usually by modifying some state. But an assignment
x = 3 could be interpreted as a declarative statement of fact: “in this context, x = 3”, or as an imperative command: “modify the x variable to have the new value 3”.
HTTP is a protocol, and I don’t think it makes sense to apply programming language categories to this protocol.
You SQL example is interesting: the
UPDATE statement modifies the state of the database, but SQL is widely considered to be a declarative language. In that SQL statement, you don’t describe how to update the database. You don’t look up indices, you don’t perform table scans, you don’t acquire locks, you don’t update indices. The SQL statement just expresses a problem in this notation for relational algebra. I think this illustrates nicely that you can’t always clearly separate these two concepts. A sequence of SQL statements might be imperative (especially when part of a stored procedure), but individual statements are a declarative description of database operations.