MySQL単体でやるのはちょっと冗長なSQLになりそうなので、プログラムをかませた方が良いと思います。
プログラムでは、以下のような流れで取得できるはずです。
1.市外局番の一覧を配列に持つなどして管理する
2.電話番号の先頭2~5桁までで、1で持っている市外局番に一致する値を抜き出す
3.残った番号の末尾4ケタを抜き出す
4.2で取得したのがTel1、最後まで残った番号がTel2、3で取得したのがTel3となる
市外局番の一覧は総務省がPDFで提供しているので、コレが一番確実かと思います。
以下、PHPでやった場合の処理となります。
PHP
1//市外局番を配列で管理。あとで照合するときに全件で照合させると効率が悪いので、先頭2桁をキーにして分割(DBから取得でも良い)
2$shigaiKyokubanList = array(
3 '01' => array('011', '0123', '0124', '0125'・・・),
4 '02' => array('0220', '0223', '0224'・・・),
5 '03' => array('03'),
6 '04' => array('0422', '0428', '042'・・・
7 ・・・
8);
9$telList = getTelList(); //ここで、DBから電話番号の全件をselectしてきたモノとします。
10
11$separatedTelList = array();//tel1, tel2, tel3に分割された電話番号を格納する配列
12
13//電話番号リストをループ
14foreach($telList as $tel) {
15 //市外局番の配列のうち、先頭2桁をキーとして2階層目の配列を取り出し、ループ
16 foreach($shigaiKyokubanList[substr($tel, 0, 2)] as $shigaiKyokuban) {
17 //候補の市外局番から始まる前提で正規表現マッチング
18 if(!preg_match('/^('.$shigaiKyokuban.')([0-9]+)([0-9]{4})$/', $matches) || count($matches) < 4) {
19 //マッチしない場合、次の市外局番と照合する
20 continue;
21 } else {
22 //マッチした場合、tel1, tel2, tel3をキーとする配列に格納する
23 $separatedTelList[] = array('tel1' => $matches[1], 'tel2' => $matches[2], 'tel3' => $matches[3]);
24 }
25}