說(shuō)明

上節(jié)內(nèi)容學(xué)習(xí)了數(shù)據(jù)庫(kù) MySQL 的安裝、驗(yàn)證、數(shù)據(jù)庫(kù)管理工具、數(shù)據(jù)庫(kù)的基本操作命令,還沒(méi)有學(xué)習(xí)的同學(xué)可以從主頁(yè)去看上一篇推送內(nèi)容

本節(jié)內(nèi)容就學(xué)習(xí)有關(guān)數(shù)據(jù)庫(kù)中表的操作,這其中包括 表內(nèi)表關(guān)聯(lián) 的:創(chuàng)建、列數(shù)據(jù)類型、數(shù)據(jù)查詢、篩選、刪除、添加、修改等等操作,這塊內(nèi)容極為重要,重點(diǎn)不但需要掌握基本的 SQL使用規(guī)則,還要掌握一些系統(tǒng)提供的SQL函數(shù)。

提示:你可以將sql理解為一種編程語(yǔ)言格式,那么這其中用到的所有標(biāo)點(diǎn)符號(hào)都是英文的,括號(hào)都是成對(duì)出現(xiàn)的,這種低級(jí)錯(cuò)誤千萬(wàn)別給自己養(yǎng)成"習(xí)慣"。

表(CRUD)

1,創(chuàng)建表

create table 表名(列名 列的類型(長(zhǎng)度) 列的約束,列名2 列的類型(長(zhǎng)度) 列的約束);
  • 列的類型

    int:和 Java中相同

    char:固定長(zhǎng)度(長(zhǎng)度指的是字符個(gè)數(shù))

    varchar:可變長(zhǎng)度(長(zhǎng)度指的是字符個(gè)數(shù))

    double

    float

    boolean

    date:YYYY-MM-DD

    time:hh:mm:ss

    datetime:YYYY-MM-DD hh:mm:ss,默認(rèn)值是 null

    timestamp:YYYY-MM-DD hh:mm:ss,默認(rèn)使用當(dāng)前時(shí)間

    text:主要用來(lái)存放文本。

    blob:存放二進(jìn)制。

  • 列的約束

    主鍵約束:primary key

    唯一約束:unique

    非空約束:not null

舉例,創(chuàng)建學(xué)生表

  1. 登錄MySql

    mysql -u root -p密碼
  2. 進(jìn)入指定數(shù)據(jù)庫(kù)(如果沒(méi)有數(shù)據(jù)庫(kù),則利用前面的創(chuàng)建數(shù)據(jù)庫(kù)語(yǔ)句進(jìn)行創(chuàng)建)

    use 數(shù)據(jù)庫(kù)名字;

這兩步是必須的,我們的表都是在庫(kù)的基礎(chǔ)上才有的,所以在創(chuàng)建表之前我們需要選對(duì)要使用的數(shù)據(jù)庫(kù)。

1,創(chuàng)建學(xué)生表

create table student(    sid int primary key,    sname varchar(30),    ssex int,    sage int);

2,查看表

show tables;

3,查看表的創(chuàng)建過(guò)程

show create table 表名;

4,查看表結(jié)構(gòu)

desc 表名;

5,修改表

  • 添加列(add)

    alter table 表名 add 列名 列的類型 列的約束alter table student add chengji int not null;
  • 修改列(modify)

    alter table 表名 modify 列名 列的類型(長(zhǎng)度);
  • 修改列名(change)

    alter table 表名 change 原列名 新列名 列名的類型(長(zhǎng)度);
  • 刪除列(drop)

    alter table 表名 drop chengji;
  • 修改表名(rename)

    rename table 原表名 to 新表名;
  • 修改表的字符集

    alter table 表名 character set 字符集名稱;

6,刪除表

drop table 表名;

表內(nèi)、表與表之間的 SQL

1,插入數(shù)據(jù)

insert into 表名(列名1,列名2,列名3...) values (列名1對(duì)應(yīng)的值,列名2對(duì)應(yīng)的值,列名3對(duì)應(yīng)的值);

批量插入

insert into student values(103,lunzima,1,18),(104,houyi,0,20),(105,hanbin,1,22);

批量插入效率高于單條插入,但是批量插入其中一條如果出錯(cuò),可能引起同批插入的其他條數(shù)據(jù)錯(cuò)誤。

  • 如果是全列名插入,則可以省略表名后的列名不寫(xiě),例如下面這樣:
insert into student values(100,yasuo,0,25);
  • 設(shè)置了主鍵的列,插入時(shí)要保證主鍵不重復(fù)。

  • 插入中文亂碼解決方法

    在 MySql 的安裝目錄(比如我的是:C:/Program Files/MySQL/MySQL Server 5.5)下,找到my.ini文件,打開(kāi)后編輯default-character-set=gbk這句代碼即可,默認(rèn)是utf8

    然后在命令行重新登錄賬戶,操作即可。

  • 部分列插入時(shí),列名不能省略。

    insert into 表名(要插入的列1,列2...) values(對(duì)應(yīng)列的值...);

2,查詢表中記錄

select * from 表名;
  • 查看表中指定列的數(shù)據(jù)
select 列名1,列名2 from 表名;
  • 別名as查詢

    select 表名的別名.列名1,表名的別名.列名2 from 表名 as 表名的別名;

    別名as是可以省略的。也可以給列名加別名,像下面這樣

    select 表名的別名.列名1 列名1的別名,表名的別名.列名2 列名2的別名 from 表名 表名的別名;
  • 去重查詢

    // 查詢表中某列數(shù)據(jù),并去掉重復(fù)值select distinct 列名 from 表名;
  • select 運(yùn)算查詢

    select *,列名*0.85 from 表名;

    這里的運(yùn)算符可以是+,-,*,/。增加的列也可以添加別名;增加的列僅僅是在查詢結(jié)果上顯示,不會(huì)真正改變表中的結(jié)構(gòu)。

  • where后的條件寫(xiě)法

    關(guān)系運(yùn)算符>,>=,<,<=,!=,<>

    select * from 表名 where 列名 關(guān)系運(yùn)算符 限定條件的值;// 比如這樣select * from product where price <> 500;

    其中,!=不是標(biāo)準(zhǔn)的 SQL 語(yǔ)法,<>才是標(biāo)準(zhǔn)的不等于。

    邏輯運(yùn)算符and,or,no

    // 舉例select * from product where price > 10 and price < 2000;// 上面這句和下面這句等價(jià)select * from product where price between 11 and 1999;

    模糊查詢:like

    • _:代表一個(gè)字符。
    • %:代表多個(gè)字符。
    // 查詢商品名字中帶有代碼兩個(gè)字的所有商品select * from product where pname like %代碼%;// 查詢商品名字中第二個(gè)字符是一的所有商品select * from product where panme like _一%;

    在某個(gè)范圍獲得值in

    // 查出商品編號(hào)為 3 和 5 的所有商品select * from product where cno in (3,5);
  • 排序查詢:order by

    最后執(zhí)行,對(duì)select的結(jié)果進(jìn)行操作。

    • asc:升序(默認(rèn)排序方式)
    • desc:降序
    // 按照某列進(jìn)行排序select * from 表名 order by 列名 desc/asc;// 結(jié)合 where 條件的結(jié)果,在進(jìn)行排序select * from 表名 where 列名 條件運(yùn)算符 條件值 order by desc/asc;
  • 聚合函數(shù)

    • sum():求和
    • avg():求平均值
    • max():最大值
    • min():最小值
    • count():統(tǒng)計(jì)數(shù)量
    // 求和select sum(要求和的列名) from 表名;// 求平均值select avg(要求平均值的列名) from 表名;// 求最大值select max(要求最大值的列名) from 表名;// 求最小值select min(要求最小值的列名) from 列名;// 統(tǒng)計(jì)數(shù)量select count(表中任意一列或者直接寫(xiě)`*`) from 表名;

    注意:聚合函數(shù)不能直接跟在where后面。

    // 比如:查出價(jià)格大于平均值的所有商品select * from product where price > (select avg(price) from product); 
  • 分組:group by

    將表中某列值相同的記錄放在一起,稱為一組。

    // 按照某列去分組,對(duì)于列名相同的記錄默認(rèn)會(huì)顯示排在前面的select * from 表名 group by 列名;// 按照某列排序,并統(tǒng)計(jì)該列的數(shù)量select 列名,count(列名) from 表名 group by 列名;
  • having

    條件篩選。出現(xiàn)在分組之后,其后可以接聚合函數(shù)。where關(guān)鍵字出現(xiàn)在分組之前,其后不可接聚合函數(shù)。

    // 比如:查詢商品表中,按照商品編號(hào)分組顯示每組的平均價(jià)格,并查詢平均價(jià)格大于 60元的所有商品。select *,avg(price) from product group by cno having avg(price) > 60;

3,刪除表中記錄

  • 刪除指定某條記錄

    delete from 表名 where 條件;// 例如delete from student where sid=105;

    :如果不指定條件,則會(huì)將表中的數(shù)據(jù)一條一條全部刪除。

  • truncatedelete from 表名; 刪除表中數(shù)據(jù)有何區(qū)別?

    前者是將表直接刪除,然后重新創(chuàng)建表,表中無(wú)數(shù)據(jù)。后者是一條一條刪除表中所有數(shù)據(jù)。

    在數(shù)據(jù)量較少的情況下,后者效率高;反之,前者高。

4,更新表中記錄

  • 更新某條記錄

    update 表名 set 要更新的列名1=列的值1,要更新的列名2=列的值2 where 條件;

    比如這樣:

    update student set sname=寒冰,sage=23 where sid=105;
  • 更新所有記錄的某些列

    update 表名 set 要更新的列1=值1,要更新的列2=值2;

總結(jié)

  • 表的操作,根據(jù)個(gè)人職位和功能需求來(lái)定,一個(gè)完整體系表的構(gòu)建是一個(gè)具體業(yè)務(wù)的邏輯體現(xiàn)。
  • 大多開(kāi)發(fā)者在表內(nèi)和表與表之間進(jìn)行操作的時(shí)候多,其中最主要也是用的做多的操作是查詢和篩選。

小編特意創(chuàng)建了一個(gè)公眾號(hào):推薦學(xué)java,分享與java相關(guān)的內(nèi)容,并且以原創(chuàng)為主,歡迎大家搜索關(guān)注(關(guān)注即送視頻教程),一起學(xué)Java!