MySql多表查詢及數據導入

MySQL高級

外鍵(foreign key)

  • 定義mysql

    讓當前表字段的值在另外一個表的範圍內選擇sql

  • 語法數據庫

    foreign key(參考字段名)
    references 主表(被參考字段名)
    on delete 級聯動做
    on update 級聯動做
  • 使用規則併發

一、主表、從表字段數據類型要一致
二、主表被參考字段 :KEY的一種,通常爲主鍵rest

  • 示例

表一、繳費信息表(財務)code

id   姓名     班級     繳費金額
1   唐伯虎   AID19     300
2   點秋香   AID19     300
3   祝枝山   AID19     300
create table master(
    -> id int primary key,
    -> name varchar(20),
    -> class char(5),
    -> money decimal(6,2)
    -> )charset=utf8;

表二、學生信息表(班主任) -- 作外鍵關聯ci

stu_id   姓名   繳費金額
  1     唐伯虎    300
  2     點秋香    300
create table slave(
    -> stu_id int,
    -> name varchar(20),
    -> money decimal(6,2),
    -> foreign key(stu_id) references master(id) on delete cascade on update cascade)
    -> charset=utf8;
  • 刪除外鍵**
alter table 表名 drop foreign key 外鍵名;
​外鍵名 :show create table 表名;
  • 級聯動做
cascade
​數據級聯刪除、更新(參考字段)
create table slave(
    -> stu_id int,
    -> name varchar(20),
    -> money decimal(6,2),
    -> foreign key(stu_id) references master(id) on delete cascade on update cascade)
    -> charset=utf8;

restrict(默認)
​從表有相關聯記錄,不容許主表操做
create table slave_2 (stu_id int,
    -> name varchar(20),
    -> money decimal(6,2),
    -> foreign key(stu_id) references master(id) on delete restrict on update restrict)
    -> charset = utf8;

set null
​主表刪除、更新,從表相關聯記錄字段值爲NULL
create table slave_3(stu_id int,
    name varchar(20),
    money decimal(6,2),
    foreign key (stu_id) references master(id) on delete set null on update set null)
    charset=utf8;
  • 已有表添加外鍵
alter table 表名 add foreign key(參考字段) references 主表(被參考字段) on delete 級聯動做 on update 級聯動做

嵌套查詢(子查詢)

定義rem

把內層的查詢結果做爲外層的查詢條件it

語法格式innodb

select ... from 表名 where 條件(select ....);

示例

一、把攻擊值小於平均攻擊值的英雄名字和攻擊值顯示出來
        select name,attack from sanguo where attack <(select avg(attack)from country);
二、找出每一個國家攻擊力最高的英雄的名字和攻擊值(子查詢)
        select name,attack from sanguo where (attack,country) in (select country ,max(attack)from sanguo group by country);

多表查詢

sql腳本資料:join_query.sql,或者複製下面代碼

mysql -uroot -p123456
mysql>source /home/tarena/join_query.sql
create database if not exists db1 character set utf8;
use db1;

create table if not exists province(
id int primary key auto_increment,
pid int,
pname varchar(15)
)default charset=utf8;

insert into province values
(1, 130000, '河北省'),
(2, 140000, '陝西省'),
(3, 150000, '四川省'),
(4, 160000, '廣東省'),
(5, 170000, '山東省'),
(6, 180000, '湖北省'),
(7, 190000, '河南省'),
(8, 200000, '海南省'),
(9, 200001, '雲南省'),
(10,200002,'山西省');

create table if not exists city(
id int primary key auto_increment,
cid int,
cname varchar(15),
cp_id int
)default charset=utf8;

insert into city values
(1, 131100, '石家莊市', 130000),
(2, 131101, '滄州市', 130000),
(3, 131102, '廊坊市', 130000),
(4, 131103, '西安市', 140000),
(5, 131104, '成都市', 150000),
(6, 131105, '重慶市', 150000),
(7, 131106, '廣州市', 160000),
(8, 131107, '濟南市', 170000),
(9, 131108, '武漢市', 180000),
(10,131109, '鄭州市', 190000),
(11,131110, '北京市', 320000),
(12,131111, '天津市', 320000),
(13,131112, '上海市', 320000),
(14,131113, '哈爾濱', 320001),
(15,131114, '雄安新區', 320002);

create table if not exists county(
id int primary key auto_increment,
coid int,
coname varchar(15),
copid int
)default charset=utf8;

insert into county values
(1, 132100, '正定縣', 131100),
(2, 132102, '浦東新區', 131112),
(3, 132103, '武昌區', 131108),
(4, 132104, '哈哈', 131115),
(5, 132105, '安新縣', 131114),
(6, 132106, '容城縣', 131114),
(7, 132107, '雄縣', 131114),
(8, 132108, '嘎嘎', 131115);
  • 笛卡爾積(交叉鏈接)
select 字段名列表 from 表名列表;
  • 多表查詢
select 字段名列表 from 表名列表 where 條件;
  • 示例
一、顯示省和市的詳細信息
   河北省  石家莊市
   河北省  廊坊市
   湖北省  武漢市
    select province.pname,city.cname from province,city where province.pid=city.cp_id;
二、顯示 省 市 縣 詳細信息
        select province.pname,city.cname,county.coname from province,city,county 
        where province.pid=city.cp_id and city.cp_id=county.copid;

鏈接查詢

  • 內鏈接(結果同多表查詢,顯示匹配到的記錄)
select 字段名 from  表1 inner join 表2 on 條件 inner join 表3 on 條件;
eg1 : 顯示省市詳細信息
            select province.pname,city.cname from province inner join city on province.pid=city.cp_id;

eg2 : 顯示 省 市 縣 詳細信息
            select province.pname,city.cname,county.coname from 
            province inner join city on province.pid=city.cp_id inner join county on city.cp_id=county.copid;
  • 左外鏈接

以 左表 爲主顯示查詢結果

select 字段名 from 表1 left join 表2 on 條件 left join 表3 on 條件;
eg1 : 顯示 省 市 詳細信息(要求省所有顯示)
            select province.pname,city.cname from province left join city on province.pid=city.cp_id;
  • 右外鏈接

用法同左鏈接,以右表爲主顯示查詢結果

select 字段名 from 表1 right join 表2 on 條件 right join 表3 on 條件;
        select province.pname,city.cname from province right join city on province.pid=city.cp_id;

數據導入

==掌握大致步驟==

==source 文件名.sql==

做用

把文件系統的內容導入到數據庫中
語法(方式一)

load data infile "文件名"
into table 表名
fields terminated by "分隔符"
lines terminated by "\n"
示例
scoretable.csv文件導入到數據庫db2的表

一、將scoretable.csv放到數據庫搜索路徑中
   mysql>show variables like 'secure_file_priv';
         /var/lib/mysql-files/
   Linux: sudo cp /home/tarena/scoreTable.csv /var/lib/mysql-files/
二、在數據庫中建立對應的表
  create table scoretab(
  rank int,
  name varchar(20),
  score float(5,2),
  phone char(11),
  class char(7)
  )charset=utf8;
三、執行數據導入語句
load data infile '/var/lib/mysql-files/scoreTable.csv'
into table scoretab
fields terminated by ','
lines terminated by '\n'
四、練習
  添加id字段,要求主鍵自增加,顯示寬度爲3,位數不夠用0填充
  alter table scoretab add id int(3) zerofill primary key auto_increment first;

語法(方式二)

source 文件名.sql

數據導出

做用

將數據庫中表的記錄保存到系統文件裏

語法格式

select ... from 表名
into outfile "文件名"
fields terminated by "分隔符"
lines terminated by "分隔符";

練習

一、把sanguo表中英雄的姓名、攻擊值和國家三個字段導出來,放到 sanguo.csv中
        select name,attack,country from sanguo 
        into outfile '/var/lib/mysql-files/sanguo.csv' 
        fields terminated by ',' 
        lines terminated by '\n';
二、將mysql庫下的user表中的 user、host兩個字段的值導出到 user2.txt,將其存放在數據庫目錄下
        select user,host from country 
        into outfile '/var/lib/mysql-files/user2.txt' 
        fields terminated by ',' 
        lines terminated by '\n';

注意

一、導出的內容由SQL查詢語句決定
二、執行導出命令時路徑必須指定在對應的數據庫目錄下

表的複製

==一、表能根據實際需求複製數據==

==二、複製表時不會把KEY屬性複製過來==

語法

create table 表名 select 查詢命令;

練習

一、複製sanguo表的所有記錄和字段,sanguo2
        create table sanguo2 select * from country.sanguo
        
二、複製sanguo表的 id,name,country 三個字段的前3條記錄,sanguo4
        create table sanguo4 select id,name,country from country.sanguo limit 3;

注意

擴展分享

常規分表套路:

用戶ID:int %表數量

用戶名:ASCII % 表數量

經典案例:用戶表分表

複製表的時候不會把原有表的 KEY 屬性複製過來

複製表結構
create table 表名 select 查詢命令 where false;

鎖(自動加鎖和釋放鎖)

==全程重點,理論和鎖分類及特色==

目的

解決客戶端併發訪問的衝突問題

鎖類型分類

讀鎖(共享鎖):select 加讀鎖以後別人不能更改表記錄,但能夠進行查詢
寫鎖(互斥鎖、排他鎖):加寫鎖以後別人不能查、不能改

鎖粒度分類

表級鎖 :myisam 行級鎖 :innodb

相關文章
相關標籤/搜索