You can do that with a command in your database:

<!-- language: lang-sql -->

    UPDATE `wp_posts` /* Adjust the prefix! */
    SET `post_title` = CONCAT(
        UCASE( /* First letter uppercase */
            SUBSTRING(
                `post_title`, 1, 1
            )
        ),
        '',
        LCASE( /* The rest in lowercase */
            SUBSTRING(
                `post_title`, 2, LENGTH(`post_title`)
            )
        )
    );

If your author has a habit of posting uppercase titles, you can add a filter per plugin to change titles whenever a new post is added:

<!-- language: lang-php -->

    add_filter( 'wp_insert_post_data', function( array $data ) {
    
    	// list of words not to change
    	$protected_words = [
    		'SQL',
    		'CSS',
    		'BBC'
    	];
    
    	if ( empty( $data['post_title'] ) )
    		return $data;
    
    	$words = explode( ' ', $data['post_title'] );
    
    	array_map( function( $word ) use ( $protected_words ) {
    		return in_array( $word, $protected_words )
    			? $word
    			: mb_strtolower( $word, 'UTF-8' );
    	}, $words );
    
    	// There is no mb_ucfirst()
    	$words[0] = mb_convert_case( $words[0], MB_CASE_TITLE, "UTF-8");
    
    	$data['post_title'] = join( ' ', $words );
    
    	return $data;
    });