I have custom table where I store quotes and author:

    function quote_install(){
    global $wpdb;
    global $quote_db_version;
    $table_name = $wpdb->prefix . 'quote'; 

    // create sql your table             
    $sql = "CREATE TABLE " . $table_name . " (
      ID int(11) NOT NULL AUTO_INCREMENT,
      time datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,   
      quote text NOT NULL,
      author text NOT NULL,
      qtag ENUM('G', 'W', 'Z', 'H', 'M') NOT NULL default 'G',
      PRIMARY KEY  (ID)
    );";
    
    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql); }

Then I want to get single row with quote and author to display.

    function read_single_Quote( $id=NULL ) {
    global $wpdb;
     
     $table_name = $wpdb->prefix . 'quotes';
    // random select
     if($id ==NULL){
        $sql = $wpdb->prepare( "
            SELECT *
            FROM {$wpdb->prefix}'quotes'
            ORDER BY RAND()
            LIMIT 1
        ");
     } //get the row id = $id
    else {
        $sql = $wpdb->prepare( "
        SELECT *
        FROM {$wpdb->prefix}'quotes'
        WHERE ID = %d
        LIMIT 1
        ", $id );
     }

    $result = $wpdb->get_results( $sql );

    // databse error, return false
    if ( ! $result ) { return false; }

    // return first result
    return $result[0];
  }

What is wrong? 
What is the most efficient way to get random row from custom table?