1. 程式人生 > >Mysql命令列練習(1)

Mysql命令列練習(1)

注意:修改資料庫的字符集編碼,可以修改\Mysql server 5.0檔案下my,ini檔案,未修改此檔案,一般在81行,有一個設定charset的預設字符集,修改即可。

SQL語法地址

java和mysql的資料型別比較

String ------char(n) varchar(n) 255 65535
byte short int long float double ------ tinyint smallint int bigint float double
boolean ------bit 0/1
Date ------ Date、Time、DateTime、timestamp、
FileInputStream FileReader ------ Blob Text

一、資料庫

1.建立資料庫

create database [if not exists] db_name [character set xxx] [collate xxx];
*建立一個名稱為mydb1的資料庫
~>create database mydb1;
*建立一份使用utf8字符集的mydb2資料庫
~>create database mydb2 character set utf8;
*建立一個使用utf8字符集,並帶校對規則的mydb3資料庫
~>crete databse mydb3 character set utf8 collate utf8_bin;

2.檢視資料

*顯示資料庫
~>show databases;
*檢視資料庫的建立方式
~>show create database db_name;

3.修改資料庫

~>alter database db_name [character set xxx] [collate xxx]

4.刪除資料庫

~>drop database [if exists] db_name;

5.使用資料庫

*切換資料庫
~>use db_name;

二、表

1.建立表

create table tb_name(
        field1 type,
        field2 type,
        ...
        fieldn type
)[character set xx] [collate xxx];
約束:
primary key
unique
not null
auto increment 主鍵欄位必須是數字型別
外來鍵約束

*示例1:建立一個員工表employee
~>create table employee(
    id int primary key auto_increment,
    name varchar(20) not null,
    identity_card_id varchar(30),
    gender bit default 1,
    birthday date,
    entry_date date,
    job varchar(20),
    salary double,
    bonus double,
    pay_date date,
    other_salary double,
    resume text
    UNIQUE(identity_card_id)
);
*示例2:建立考試成績表
~>create table exam(
    id int primary key auto increment,
    name varchar(20) not null,
    chinese double,
    math double,
    english double
);

2.查看錶資訊

*查看錶結構
~>desc tab_name;
*檢視當前資料庫中的所有表
~>show tables;
*檢視當前資料庫表建表語句
~>show create table tab_name;

3.修改表結構

(1) 增加一列
~>alter table tab_name add [column] 列名 型別;
示例:
a.在表employee最後一列新增一列
~>alter table employee add column addr varchar(20) not null;
b.在表employee第一列新增一列
~>alter table employee add column addr varchar(20) not null first;
c.在表employee列名為:birthday的後邊新增一列
~>alter table employee add column addr varchar(20) not null after birthday;

(2)修改一列型別
~>alter table tab_name modify 列名 型別;

(3)修改列名
~>alter table tab_name change [column] 列名 新列名;

(4)刪除一列
~>alter table tab_name drop [column] 列名;

(5)修改表名
~>rename table 表名 to 新表名;

(6)修改表所用的字符集
~>alter table ta_name character set utf8;

4.刪除表

~>drop table tab_name;

三、表記錄

1.增加記錄 insert

~>insert into tab_name (field1,field2,......) values (value1,value2,......);
要點:
*插入的資料應與欄位的資料型別相同
*資料的大小應在列的規定範圍內,例如:不能將一個長度為80的字串加入到長度為40的列中
*字元和日期型別資料應包含在單引號中'zhang' '2013-04-20'
*插入空值:不指定某列的值或insert into table value(null),則該列取空值
*如果要插入所有欄位可以省略列表,直接按表中欄位順序寫值 insert into tab_name values(value1,value2,......);

*示例:使用insert語句向表中插入三個員工的資訊。
a.單條資料插入
~>inser into employee (name,birthday,entry_date,job,salary) values ('張三','1990-01-01','2000-09-01','碼農',999);
b.多條資料插入
~>inser into employee (name,birthday,entry_date,job,salary) values ('李四','1990-01-01','2000-09-01','碼農',999),('王五','1990-01-01','2000-09-01','碼農',999);

2.修改表記錄update

update tab_name set field1=value1,field2=value2,......[where 語句]
要點:
*update語法可以用新值更新原有表中的各列
*set子句指示要修改哪些列和要給予哪些值
*where子句指示應更新哪些行。如果沒有shere子句,則更新子句

示例:
a.將所有員工的薪水更改為5000元
~>update employee set salary=9999;
b.將姓名為'張三'的員工薪水修改為8888
~>update employee set salary=8888 where name='張三';
c.將姓名為'張三'的員工薪水修改為19999,job改為PM
~>update employee set salary=19999,job='PM' where name='張三';
d.將姓名為'張三'的薪水在原有的基礎上增加1000元
~>update employee set salary=salary+1000 where name='張三';

3.刪除表操作

delete from tab_name [where ......]
要點:
*如果不跟shere語句則刪除整張表的資料
*delete只能用刪除一行記錄,不能刪除一行記錄中的某一列
*delete語句只能刪除表中的內容,不能刪除表本身,要想刪除表,用drop
*同insert和update 一樣,從一個表中刪除記錄將引起其他表的參照完整性問題,在修改資料庫資料時,頭腦中應該始終不要忘記這個潛在的問題
*TRUNCATE TABLE 也可以刪除表中的所有資料,此語句先摧毀表,再新建表。此種方式刪除的資料不能在事物中恢復。
示例:
a.刪除表中名稱為'張三'的記錄;
~>delete from employee where name='張三';
b.刪除表中所有資料
~>delete from employee;
c.使用truncate刪除表中記錄
~>truncate table employee;

4.select操作

(1)
~>select [distinct] *|field1,field2...... from tab_name;
其中from指定從哪張表篩選,*標識查詢所有列,也可以指定一個列,表明指定要查詢的列,distinct 用來剔除重複行。
示例:
a.查詢表中所有員工的資訊
~>select * from employee;
b.查詢表中所有員工的姓名和對應的薪水
~>select name,salaryvfrom employee;
c.過濾重複資訊
~>select distinct name from employee;
(2)select 也可以使用表示式,並且可以使用 as 別名
a.在所有員工的薪水上加上1000專案獎金顯示
~>select name,salary+1000 from employee;
b.查詢所有員工除獎金之外的其餘薪水部分
~>select name,salary-bonus from employee;
c.查詢所有員工除獎金之外的其餘薪水部分,用別名base_salary
~>select name,salary-bonus as base_salary from employee;
(3)使用where子句,進行過濾查詢
示例:
a.查詢姓名為XXX的員工薪水
~>select salary from employee where name='張三';
b.查詢薪水大於999的員工姓名和薪水
~>select name,salary from employee where salary>999;
c.查詢基礎薪水大於3000的所有員工
~>select name,salary-bonus as base_salary from employee where salary-bonus>3000;

*where子句中可以使用,比較運算子:
> 大於
< 小於
>= 大於等於
<= 小於等於
<> 不等於

between 數值1 and 數值2 在數值1和數值2之間
例如:between 10 and 20  值在10到20之間

in
例如:in(10,30,20) 值是10或20或30
pattern pattern可以使%或者_,如果是%則表示任意多字元,
舉例:
張三,張三三,張一一,如果表示一個字元 張_,張三符合

*邏輯運算子 and or in not
有多個條件直接可以使用以上邏輯運算子
*is null
舉例:
a.查詢薪水在999-9999之間的員工
~>select name,salary from employee where salary between 999 and 9999;
b.查詢薪水為7777,8888,8080的員工姓名
~>select name from employee where salary in(7777,8888,8080);
c.查詢所有姓張的員工的姓名和生日
~>select name,birthday from employee where name like '張%';
d.查詢薪水大於9999,專案獎金大於6666的員工姓名
~>select name from employee where salary>9999 and bonus>6666;
e.查詢沒有獎金的員工姓名
~>select name from employee where bonus is null;
(4)
(1)order by 指定排序的列,排序的列即是表中的列,也可以是select 語句後指定的列
(2)Asc 升序、Desc 降序、其中Asc為預設值
(3)order by 子句應位於select語句的結尾

示例:
a.對薪水排序後顯示
~>select * from employee ORDER BY salary;  
b.對基礎薪水排序,按從高到低的順序輸出
~>select name,(ifnull(salary,0)+ifnull(bonus,0)) as base_salary from employee ORDER BY base_salary DESC;
c.對姓張的員工基礎薪水排序輸出
~>select name,(ifnull(salary,0)+ifnull(bonus,0)) as base_salary from employee like '張%' ORDER BY base_salary DESC;
(5) 聚合函式
技巧:先不要管聚合函式要幹嘛,先把要求的內容查出來再包上聚合函式即可。

(1)count(列名)
示例:
a.統計一個公司共有多少員工?先查出所有員工,再用count包上。
~>select count(*) from employee;
b.統計員工薪水大於6666的員工人數。
~>select count(salary) from employee where salary>6666;
c.統計基礎工資大於4000的員工數量
~>select count(name) from employee where (ifnull(salary,0)-ifnull(bonus,0))>4000;

(2)sum(列名)
示例:
a.統計一個公司員工薪水總和,先查出基礎工資,再包上sum
~>select sum(salary) from employee;
b.分別統計一個公司薪水、獎金的總和
~>select sum(salary),sum(bonus) from employee;
c.統計一個公司員工的平均薪水
~>select sum(salary)/count(*) from employee;

注意:
sum僅對數值起作用,否則會報錯。

(3)AVG(列名)
a.求一個公司員工的平均工資
~>select avg(ifnull(salary,0)) from employee;
b.求一個公司員工包含正常薪水和額外收入在內的薪水總額的平均薪水
~>select avg(ifnull(salary,0)+ifnull(other_salary,0)) from employee;

(4)Max 、Min
示例:
a.求公司最工薪水和最低薪水
~>select Max(ifnull(salary,0)) from employee;
~>select Min(ifnull(salary,0)) from employee;

(5)group by字句,其後可以接多個列名,也可以跟having子句對group by的結果進行篩選。
示例:
a.對員工的薪水按姓名歸類,顯示員工的姓名、薪水,和發放日期
~>select name,salary,pay_date from employee group by pay_date;
b.對員工的薪水按姓名歸類,最近發放的日期排列,顯示員工的姓名、薪水,和發放日期
~>select name,salary,pay_date from employee group by pay_date order by DESC;
c.除'張三'外,對員工的薪水按姓名歸類,顯示員工的姓名、薪水,和發放日期,且發放日期在'2016.01.01'到'2017-01-01'之間的薪水
~>select name,salary,pay_date from employee where name <> '張三' group by name having Date(pay_date) between '2016.01.01' and '2017.01.01';
(6)重點:Select from where froup by having order by
執行順序:from where select group by having order by
示例分析:
a.查詢失敗的語句
~>select math+english+chiese as total_score from exam where total_score>270;
b.查詢成功的語句
~>select math+english+chiese as total_score from exam having total_score>270;
c.查詢成功的語句
~>select math+english+chiese as total_score from exam group by total_score having total_score>270;
d.查詢成功的語句
~>select math+english+chiese as total_score from exam order by total_score;
e.查詢成功的語句
~>select * from exam as score where score.math>90;

四約束

1.建立表時指定約束

create table tb(
    id int primary key auto_increment,
    name varchar(20) unique not null,
    ref_id int,
    foreign key(ref_id) references tb2(id)
);
create table tb2(
    id int primary key auto_increment
);

2.外檢約束

(1)增加外來鍵:
可以明確指定外來鍵的名稱,如果不指定外來鍵的名稱,mysql會自定為你建立一個外來鍵名稱。
RESTRICT:只要本表格裡面右指向主表的資料,在主表裡面就無法刪除相關記錄。
CASCADE:如果在foreign key 所指向的那個表裡面刪除一條記錄,那麼在此表裡面的跟那個key一樣的所有記錄都會一同刪掉。
~>alter table book add [consstraint FK_BOOK] foreign key (pubid) reference pub_com(id) [on delete restrict] [on update restrict];
(2)刪除外來鍵:
~>alter table 表名 drop foreign key 外來鍵(區分大小寫、外來鍵名可以desc 表名檢視);
(3)主鍵約束:
<1>增加外來鍵(自動增長,只有主鍵可以自動增長)
~>alter table tb add primary key(id) [auto_increment];
<2>刪除主鍵
~>alter table 表名 frop primary key;
<3>增加自動增長
~>alter table employee modify id int auto_increment;
<4>刪除自動增長
~>alter table tb modify id int;

五、多表設計

一對一(111教室和20170101班級,兩方都是一):在任意一方儲存另一方的主鍵
一對多、多對一(班級和學生,其中班級為1,學生為多):在多的一方儲存一對一的主鍵
多對多(教師和學生,兩方都是多):使用中間表,儲存對應關係

六多表查詢

~>create table tb(
id int primary key auto_increment,
name varchar(20)
);
~>create table ta(
id int primary key,
name varchar(20),
tb_in int
);
~>insert into tb values(1,'財務部');
~>insert into tb values(2,'人事部');
~>insert into tb values(3,'科技部');

~>insert into ta values(1,'財務部');
~>insert into ta values(2,'人事部');
~>insert into ta values(3,'科技部');

~>select * from ta;
+----+------+------+
| id |name  | tb_id|
+----+------+------+
| 1 |  aaa  |     1|
| 2 |  bbb  |     2|
| 3 |  ccc  |     4|
+----+------+------+

~>select * from tb;
+----+------+
| id |name  |
+----+------+
| 1 |  xxx  |
| 2 |  yyy  |
| 3 |  yyy  |
+----+------+

1.笛卡爾積查詢,兩張表中一條一條對應的記錄,m條記錄和n條記錄查詢,最後得到m*n條記錄 其中喝多錯誤資料
select * from ta,tb;
~>select * from ta,tb;
+----+------+-----+------+------+
|id  | name |tb_id|  id  | name |
+----+------+-----+------+------+
|1   |aaa   |1    |1     |xxx   |
|2   |bbb   |2    |1     |xxx   |
|3   |bbb   |4    |1     |xxx   |
|1   |aaa   |1    |2     |yyy   |
|2   |bbb   |2    |2     |yyy   |
|3   |bbb   |4    |2     |yyy   |
|1   |aaa   |1    |3     |yyy   |
|2   |bbb   |2    |3     |yyy   |
|3   |bbb   |4    |3     |yyy   |
+----+------+-----+------+------+

2.內連線:查詢兩張表中都有的相關資料,相當於利用條件從笛卡爾積結果中篩選出了正確的結果。
select * from ta,tb where ta.tb_id = tb.id;
select * from ta inner join tb on ta.ta_id = tb.id;
~>select * from ta inner join tb on ta.tb_id = tb.id;
+----+------+-----+------+------+
|id  | name |tb_id|  id  | name |
+----+------+-----+------+------+
|1   |aaa   |1    |1     |yyy   |
|2   |bbb   |2    |2     |yyy   |
+----+------+-----+------+------+

2.外連線
<1>左外連線:在內連線的基礎上增加左邊有右邊沒有的結果
select * from ta left join tb on ta.tb_id = tb.id;
~>select * from ta left join tb on ta.tb_id = tb.id;
+----+------+-----+------+------+
|id  | name |tb_id|  id  | name |
+----+------+-----+------+------+
|1   |aaa   |1    |1     |xxx   |
|2   |bbb   |2    |2     |yyy   |
|3   |bbb   |4    |NULL  |NULL  |
+----+------+-----+------+------+

<2>.右外連線:在內連線的基礎上增加右邊有左邊沒有的結果
select * from ta right join tb on tb on ta.tb_id = tb.id;
~>select * from ta right join tb on ta.tb_id = tb.id;
+----+------+-----+------+------+
|id  | name |tb_id|  id  | name |
+----+------+-----+------+------+
|1   |aaa   |1    |1     |xxx   |
|2   |bbb   |2    |2     |yyy   |
|NULL|NULL  |NULL |3     |yyy   |
+----+------+-----+------+------+

<3>全外連線:在內連線的基礎上增加左邊有右邊沒有和右邊有左邊沒有的結果
select * from ta full join tb on ta.tb_id = tb.id;
---mysql不支援全外連線
select * from tb_left join tb on ta.tb_id = tb.id
union
select * from ta right join tb on ta.tb_id = tb.id;

~>select * from ta left join tb on ta.tb_id = ta.id
~>union
~>select * from ta right join tb on ta.tb_id = tb.id;
---mysql可以使用此種方式間接實現全外連線
+----+------+-----+------+------+
|id  | name |tb_id|  id  | name |
+----+------+-----+------+------+
|1   |aaa   |1    |1     |xxx   |
|2   |bbb   |2    |2     |yyy   |
|3   |bbb   |4    |NULL  |NULL  |
|NULL|NULL  |NULL |3     |yyy   |
+----+------+-----+------+------+