Это на самом деле преувеличивает разницу. Нет четкой точки, в которой говорится о том, как дела обстоят, а другое - только о том, что она сделала. Скорее, возможно, придется указать, что/как делаются на более высоком уровне детализации, чем другие. Типичная реализация SQL позволяет пользователю контролировать такие вещи, как то, какие индексы используются (или игнорируются), какие блокировки делать и т. Д.
Если вы должны были выполнить ту же работу на C, вы бы (в какой-то момент) должны указать намного больше деталей (если вы не использовали что-то вроде ODBC). Тем не менее, вы все еще говорите, что нужно делать, а не все детали того, как это должно быть сделано (например, несмотря на то, что он как минимум на низком уровне, чем язык ассемблера, C все равно сделает некоторые преобразования типов автоматически, поэтому вы не нужно рассказывать ему, как делать что-то вроде добавления целого числа в число с плавающей запятой, - просто скажите ему, чтобы добавить их, и он обрабатывает детали).
Итог: попытка говорить об одном как процедурное, а другое как непроцедурное - вводит в заблуждение. SQL не всегда требует столько деталей, но это разница в степени, а не «как» и «что».