When you want to fetch the DBMS, you would need a client. A client could be a user interface application, or embed in programs written in JS, C++, JAVA, ect.

In earlier times, the DBMS is really simple. There is just a DBMS and a client on the same device. When a program want to connect and manipulate a DBMS, it could use functions or macro.

the code might look like:

macro sql

As you can see, EXEC SQL is the macro, and the program could call the DBMS.

This design is old-fashioned, but still could be seen at embedded device, which runs a local DBMS.

The more modern way of design would like:

String conUrl = "jdbc:sqlserver://portNumber:1234;serverName=test;databaseName=test_db;user=tester;password=12345;";
Connection connection = DriverManager.getConnection(conUrl);

try {
    String sql = "SELECT user_id FROM user_table";
    Statement stmt = connection.createStatement();

    ResultSet rs = stmt.executeQuery(sql); // query result
    ResultSetMetaData rsmd = rs.getMetaData(); // get data from query

    // ...
}

The biggest improvement is not the object-oriented design, but rather the concept of connection. In this design, the connection needs to set the ip, port, and the server name, which means there are more than one DBMS the program could reach for. In other words, there are more data and servers in the age of this design becoming to be used.

In the end, advance in technology, there will be more and more high level designs of DBMS and clients for big data and distributed system being being created and adopted.