I've been working with relational databases for a long time. In fact, my very first job as a software engineer waaaaay back when was converting an MS Access database from one very old version to another very old version (I think it was the shiny new Access 2000). I can rattle off the difference between an inner, right, left and full join, I can write stored procedures and functions and triggers and constraints, and on a good day I can even (maybe) remember the difference between first, second and third normalized form.
Here's part 2 in the series explaining our "full stack" at a high level. If you missed part 1, make sure to give it a read first. If you prefer, you can read the long-form post with all the content in one. Again, feel free to call me on any technicalities or suggest changes/additions in the comments!