日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

mysql基础操作(详细版)--增删改查

發(fā)布時(shí)間:2023/12/20 数据库 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql基础操作(详细版)--增删改查 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

        • 1.數(shù)據(jù)類型
        • 2.運(yùn)算符
        • 3.正則表達(dá)式
        • 4.多表關(guān)系
        • 5.常用的邏輯關(guān)鍵字
        • ——————————
        • 1.數(shù)據(jù)庫(kù)常用操作
        • 表常用操作
        • 2.創(chuàng)建表
        • 3.數(shù)據(jù)插入
        • 4.數(shù)據(jù)修改
        • 5.數(shù)據(jù)刪除
        • 6.數(shù)據(jù)約束
          • 6.1主鍵約束
          • 6.2自增長(zhǎng)約束
          • 6.3非空約束
          • 6.4唯一約束
          • 6.5默認(rèn)約束
          • 6.6零填充約束
          • 6.7外鍵約束
        • 7.DQL查詢
          • **7.1簡(jiǎn)單查詢示例**
          • **7.2條件查詢示例**
          • 7.3排序查詢
          • 7.4聚合查詢
          • 7.5分組查詢
          • 7.6分頁(yè)查詢
        • 8.數(shù)據(jù)復(fù)制
        • 9.多表聯(lián)合查詢
          • 9.1交叉連接查詢
          • 9.2內(nèi)連接查詢
          • 9.3外連接查詢
          • 9.4子查詢
          • 9.5自關(guān)聯(lián)查詢
          • 9.4子查詢
          • 9.5自關(guān)聯(lián)查詢

1.數(shù)據(jù)類型

數(shù)據(jù)類型:在創(chuàng)建表的時(shí)候?yàn)楸碇凶侄沃付〝?shù)據(jù)類型,只有數(shù)據(jù)符合類型要求才能存儲(chǔ)起來

**原則:**夠用就行,盡量使用取值范圍小的,而不用大的,這樣可以更多的節(jié)省存儲(chǔ)空間。

分類

  • 數(shù)值類型:
類型大小范圍(有符號(hào))范圍(無符號(hào))用途
TINYINT1 byte(-128,127)(0,255)小整數(shù)值
SMALLINT2 bytes(-32 768,32 767)(0,65 535)大整數(shù)值
MEDIUMINT3 bytes(-8 388 608,8 388 607)(0,16 777 215)大整數(shù)值
INT或INTEGER4 bytes(-2 147 483 648,2 147 483 647)(0,4 294 967 295)大整數(shù)值
BIGINT8 bytes(-9,223,372,036,854,775,808,9 223 372 036 854 775 807)(0,18 446 744 073 709 551 615)極大整數(shù)值
FLOAT4 bytes(-3.402 823 466 E+38,3.402 823 466 351 E+38)0,(1.175 494 351 E-38,3.402 823 466 E+38)單精度 浮點(diǎn)數(shù)值
DOUBLE8 bytes(-1.797 693 134 862 315 7 E+308,1.797 693 134 862 315 7 E+308)0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)雙精度 浮點(diǎn)數(shù)值
DECIMAL依賴于M和D的值依賴于M和D的值小數(shù)值
  • 字符串類型:
類型大小用途
CHAR0-255 bytes定長(zhǎng)字符串
VARCHAR0-65535 bytes變長(zhǎng)字符串
TINYBLOB0-255 bytes不超過 255 個(gè)字符的二進(jìn)制字符串
TINYTEXT0-255 bytes短文本字符串
BLOB0-65 535 bytes二進(jìn)制形式的長(zhǎng)文本數(shù)據(jù)
TEXT0-65 535 bytes長(zhǎng)文本數(shù)據(jù)
MEDIUMBLOB0-16 777 215 bytes二進(jìn)制形式的中等長(zhǎng)度文本數(shù)據(jù)
MEDIUMTEXT0-16 777 215 bytes中等長(zhǎng)度文本數(shù)據(jù)
LONGBLOB0-4 294 967 295 bytes二進(jìn)制形式的極大文本數(shù)據(jù)
LONGTEXT0-4 294 967 295 bytes極大文本數(shù)據(jù)
  • 日期類型:
類型大小 ( bytes)范圍格式用途
DATE31000-01-01/9999-12-31YYYY-MM-DD日期值
TIME3‘-838:59:59’/‘838:59:59’HH:MM:SS時(shí)間值或持續(xù)時(shí)間
YEAR11901/2155YYYY年份值
DATETIME81000-01-01 00:00:00/9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS混合日期和時(shí)間值
TIMESTAMP41970-01-01 00:00:00/2038 結(jié)束時(shí)間是第 2147483647 秒,北京時(shí)間 2038-1-19 11:14:07,格林尼治時(shí)間 2038年1月19日 凌晨 03:14:07YYYYMMDD HHMMSS混合日期和時(shí)間值,時(shí)間戳

2.運(yùn)算符

概述:數(shù)據(jù)庫(kù)中的表結(jié)構(gòu)確立后,表中的數(shù)據(jù)代表的意義就已經(jīng)確定。通過MySQL運(yùn)算符進(jìn)行運(yùn)算,就可以獲取到表結(jié)構(gòu)以外的另一種數(shù)據(jù)。例如,學(xué)生表中存在一個(gè)birth字段,這個(gè)字段表示學(xué)生的出生年份。而運(yùn)用MySQL的算術(shù)運(yùn)算符用當(dāng)前的年份減學(xué)生出生的年份,那么得到的就是這個(gè)學(xué)生的實(shí)際年齡數(shù)據(jù)。

分類

  • 算術(shù)運(yùn)算符:
算術(shù)運(yùn)算符說明
+加法運(yùn)算
-減法運(yùn)算
*乘法運(yùn)算
/ 或 DIV除法運(yùn)算,返回商
% 或 MOD求余運(yùn)算,返回余數(shù)
  • 比較運(yùn)算符:
比較運(yùn)算符說明
=等于
< 和 <=小于和小于等于
> 和 >=大于和大于等于
<=>安全的等于,兩個(gè)操作碼均為NULL時(shí),其所得值為1;而當(dāng)一個(gè)操作碼為NULL時(shí),其所得值為0
<> 或!=不等于
IS NULL 或 ISNULL判斷一個(gè)值是否為 NULL
IS NOT NULL判斷一個(gè)值是否不為 NULL
LEAST當(dāng)有兩個(gè)或多個(gè)參數(shù)時(shí),返回最小值
GREATEST當(dāng)有兩個(gè)或多個(gè)參數(shù)時(shí),返回最大值
BETWEEN AND判斷一個(gè)值是否落在兩個(gè)值之間
IN判斷一個(gè)值是IN列表中的任意一個(gè)值
NOT IN判斷一個(gè)值不是IN列表中的任意一個(gè)值
LIKE通配符匹配
REGEXP正則表達(dá)式匹配
  • 邏輯運(yùn)算符:
邏輯運(yùn)算符說明
NOT 或者 !邏輯非
AND 或者 &&邏輯與
OR 或者 ||邏輯或
XOR邏輯異或
  • 位運(yùn)算符:
位運(yùn)算符說明
|按位或
&按位與
^按位異或
<<按位左移
>>按位右移
~按位取反,反轉(zhuǎn)所有比特

3.正則表達(dá)式

概述:

  • 正則表達(dá)式(regularexpression)描述了一種字符串匹配的規(guī)則,正則表達(dá)式本身就是一個(gè)字符串,使用這個(gè)字符串來描述、用來定義匹配規(guī)則,匹配一系列符合某個(gè)句法規(guī)則的字符串。在開發(fā)中,正則表達(dá)式通常被用來檢索、替換那些符合某個(gè)規(guī)則的文本。
  • MySQL通過REGEXP關(guān)鍵字支持正則表達(dá)式進(jìn)行字符串匹配。
模式描述
^匹配輸入字符串的開始位置。
$匹配輸入字符串的結(jié)束位置。
.匹配除 “\n” 之外的任何單個(gè)字符。
[…]字符集合。匹配所包含的任意一個(gè)字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a(chǎn)’。
[^…]負(fù)值字符集合。匹配未包含的任意字符。例如, ‘**[^**abc]’ 可以匹配 “plain” 中的’p’。
p1|p2|p3匹配 p1 或 p2 或 p3。例如,‘z|food’ 能匹配 “z” 或 “food”。‘(z|f)ood’ 則匹配 “zood” 或 “food”。
*匹配前面的子表達(dá)式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等價(jià)于{0,}。
+匹配前面的子表達(dá)式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等價(jià)于 {1,}.
{n}n 是一個(gè)非負(fù)整數(shù)。匹配確定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的兩個(gè) o。
{n,m}m 和 n 均為非負(fù)整數(shù),其中n <= m。最少匹配 n 次且最多匹配 m 次。

正則表達(dá)式示例

  • ^ 在字符串開始處進(jìn)行匹配

SELECT ‘a(chǎn)bc’ REGEXP ‘^a’;

  • $ 在字符串末尾開始匹配

SELECT ‘a(chǎn)bc’ REGEXP ‘a(chǎn)$’;

SELECT ‘a(chǎn)bc’ REGEXP 'c$’;

  • . 匹配任意字符

SELECT ‘a(chǎn)bc’ REGEXP ‘.b’;

SELECT ‘a(chǎn)bc’ REGEXP ‘.c’;

SELECT ‘a(chǎn)bc’ REGEXP ‘a(chǎn).’;

  • […] 匹配括號(hào)內(nèi)的任意單個(gè)字符

SELECT ‘a(chǎn)bc’ REGEXP ‘[xyz]’;

SELECT ‘a(chǎn)bc’ REGEXP ‘[xaz]’;

  • [^…] 注意^符號(hào)只有在[]內(nèi)才是取反的意思,在別的地方都是表示開始處匹配

SELECT ‘a(chǎn)’ REGEXP ‘[^abc]’;

  • a* 匹配0個(gè)或多個(gè)a,包括空字符串。 可以作為占位符使用.有沒有指定字符都可以匹配到數(shù)據(jù)

SELECT 'stab’REGEXP ‘.ta*b’;

SELECT 'stb’REGEXP ‘.ta*b’;

SELECT ''REGEXP ‘a(chǎn)*’;

  • a+ 匹配1個(gè)或者多個(gè)a,但是不包括空字符

SELECT ‘stab’ REGEXP ‘.ta+b’;

SELECT ‘stb’ REGEXP ‘.ta+b’;

  • a? 匹配0個(gè)或者1個(gè)a

SELECT 'stb’REGEXP ‘.ta?b’;

SELECT 'stab’REGEXP ‘.ta?b’;

SELECT 'staab’REGEXP ‘.ta?b’;

  • a1|a2 匹配a1或者a2,

SELECT ‘a(chǎn)’ REGEXP ‘a(chǎn)|b’;

SELECT ‘b’ REGEXP ‘a(chǎn)|b’;

SELECT ‘b’ REGEXP ‘^(a|b)’;

SELECT ‘a(chǎn)’ REGEXP ‘^(a|b)’;

SELECT ‘c’ REGEXP ‘^(a|b)’;

  • a{m} 匹配m個(gè)a

SELECT ‘a(chǎn)uuuuc’ REGEXP ‘a(chǎn)u{4}c’;

SELECT ‘a(chǎn)uuuuc’ REGEXP ‘a(chǎn)u{3}c’;

  • a{m,n} 匹配m到n個(gè)a,包含m和n

SELECT ‘a(chǎn)uuuuc’ REGEXP ‘a(chǎn)u{3,5}c’;

SELECT ‘a(chǎn)uuuuc’ REGEXP ‘a(chǎn)u{4,5}c’;

SELECT ‘a(chǎn)uuuuc’ REGEXP ‘a(chǎn)u{5,10}c’;

  • (abc) abc作為一個(gè)序列匹配,不用括號(hào)括起來都是用單個(gè)字符去匹配,如果要把多個(gè)字符作為一個(gè)整體去匹配就需要用到括號(hào),所以括號(hào)適合上面的所有情況。

SELECT 'xababy’REGEXP ‘x(abab)y’;

SELECT 'xababy’REGEXP ‘x(ab)*y’;

SELECT 'xababy’REGEXP ‘x(ab){1,2}y’;

4.多表關(guān)系

分類

一對(duì)一關(guān)系

  • 一個(gè)學(xué)生只有一張身份證;一張身份證只能對(duì)應(yīng)一學(xué)生。
  • 在任一表中添加唯一外鍵,指向另一方主鍵,確保一對(duì)一關(guān)系。
  • 一般一對(duì)一關(guān)系很少見,遇到一對(duì)一關(guān)系的表最好是合并表。

一對(duì)多或多對(duì)一關(guān)系

  • 一個(gè)部門有多個(gè)員工,一個(gè)員工只能對(duì)應(yīng)一個(gè)部門
  • 實(shí)現(xiàn)原則:在多的一方建立外鍵,指向一的一方的主鍵

多對(duì)多關(guān)系

  • 一個(gè)學(xué)生可以選擇很多門課程,一個(gè)課程也可以被很多學(xué)生選擇
  • 實(shí)現(xiàn)原則:多對(duì)多關(guān)系實(shí)現(xiàn)需要借助第三張中間表。中間表至少包含兩個(gè)字段,將多對(duì)多的關(guān)系,拆成一對(duì)多的關(guān)系,中間表至少要有兩個(gè)外鍵,這兩個(gè)外鍵分別指向原來的那兩張表的主鍵

5.常用的邏輯關(guān)鍵字

  • ALL關(guān)鍵字

格式

select…from …wherec > all(查詢語(yǔ)句)

–等價(jià)于:

select…from … where c > result1 and c > result2 and c > result3

特點(diǎn)

  • ALL:與子查詢返回的所有值比較為true則返回true
  • ALL可以與=、>、>=、<、<=、<>結(jié)合是來使用,分別表示等于、大于、大于等于、小于、小于等于、不等于其中的其中的所有數(shù)據(jù)。
  • ALL表示指定列中的值必須要大于子查詢集的每一個(gè)值,即必須要大于子查詢集的最大值;如果是小于號(hào)即小于子查詢集的最小值。同理可以推出其它的比較運(yùn)算符的情況。
  • – 查詢年齡大于‘1003’部門所有年齡的員工信息

    select * from emp3 where age > all(select age from emp3 where dept_id = '1003’);

    –查詢不屬于任何一個(gè)部門的員工信息

    select* from emp3 where dept_id != all(selectdeptno from dept3);

    • ANY關(guān)鍵字SOME關(guān)鍵字

    格式

    select …from …where c > any(查詢語(yǔ)句)

    –等價(jià)于:

    select …from … where c > result1 or c > result2 or c > result3

    特點(diǎn)

  • ANY:與子查詢返回的任何值比較為true 則返回true
  • ANY可以與=、>、>=、<、<=、<>結(jié)合是來使用,分別表示等于、大于、大于等于、小于、小于等于、不等于其中的其中的任何一個(gè)數(shù)據(jù)。
  • 表示制定列中的值要大于子查詢中的任意一個(gè)值,即必須要大于子查詢集中的最小值。同理可以推出其它的比較運(yùn)算符的情況。
  • SOME和ANY的作用一樣,SOME可以理解為ANY的別名
  • – 查詢年齡大于‘1003’部門任意一個(gè)員工年齡的員工信息

    select * from emp3 where age > all(select age from emp3 where dept_id = '1003’);

    • IN關(guān)鍵字

    格式

    select …from …where c in(查詢語(yǔ)句)

    –等價(jià)于:

    select …from … where c = result1 or c = result2 or c =result3

    特點(diǎn)

  • IN關(guān)鍵字,用于判斷某個(gè)記錄的值,是否在指定的集合中
  • 在IN關(guān)鍵字前邊加上not可以將條件反過來
  • – 查詢研發(fā)部和銷售部的員工信息,包含員工號(hào)、員工名字

    select eid,ename,t.name from emp3 where dept_id in (select deptno from dept3 where name = ‘研發(fā)部’ or name = ‘銷售部’) ;

    • EXISTS關(guān)鍵字

    格式

    select …from …where exists(查詢語(yǔ)句)

    特點(diǎn)

  • 該子查詢?nèi)绻坝袛?shù)據(jù)結(jié)果”(至少返回一行數(shù)據(jù)), 則該EXISTS() 的結(jié)果為“true”,外層查詢執(zhí)行
  • 該子查詢?nèi)绻皼]有數(shù)據(jù)結(jié)果”(沒有任何數(shù)據(jù)返回),則該EXISTS()的結(jié)果為“false”,外層查詢不執(zhí)行
  • EXISTS后面的子查詢不返回任何實(shí)際數(shù)據(jù),只返回真或假,當(dāng)返回真時(shí)where條件成立
  • 注意,EXISTS關(guān)鍵字,比IN關(guān)鍵字的運(yùn)算效率高,因此,在實(shí)際開發(fā)中,特別是大數(shù)據(jù)量時(shí),推薦使用EXISTS關(guān)鍵字
  • – 查詢公司是否有大于60歲的員工,有則輸出

    select * from emp3 a where exists(select * from emp3 b where a.age > 60);

    – 查詢有所屬部門的員工信息

    select* from emp3 a where exists(select* from dept3 b where a.dept_id =b.deptno);

    ——————————

    1.數(shù)據(jù)庫(kù)常用操作

    • show databases; 查看所有數(shù)據(jù)庫(kù)

      create databases 數(shù)據(jù)庫(kù)名; 創(chuàng)建數(shù)據(jù)庫(kù)

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

    • 表常用操作

    功能SQL
    查看當(dāng)前數(shù)據(jù)庫(kù)的所有表名稱show tables;
    查看指定某個(gè)表的創(chuàng)建語(yǔ)句show create table 表名;
    查看表結(jié)構(gòu)desc 表名
    刪除表drop table 表名
    表添加列alter table 表名 add 列名 類型(長(zhǎng)度) [約束];
    修改列名和類型alter table 表名 change 舊列名新列名類型(長(zhǎng)度) 約束;
    表刪除列alter table 表名 drop 列名;
    修改表名rename table 表名 to 新表名;

    2.創(chuàng)建表

    普通創(chuàng)建表:

    create table [if not exists]表名(

    字段名1 類型【寬度】 【約束條件】 [comment ‘字段說明’],

    字段名2 類型【寬度】 【約束條件】 [comment ‘字段說明’],

    字段名3 類型【寬度】 【約束條件】 [comment ‘字段說明’]

    )[表的一些設(shè)置];

    3.數(shù)據(jù)插入

    • INSERT INTO 表名 values(屬性值,屬性值…);

    insert into student values(1001,‘男’,18,‘1996-12-23’,‘北京’,83.5);

    4.數(shù)據(jù)修改

    • update 表名 set 字段名=值,字段名=值…;

    updatestudent set address ='重慶’;

    • update 表名 set 字段名=值,字段名=值… where 條件;

    updatestudent set address ='北京’where id =1004

    5.數(shù)據(jù)刪除

    • delete from表名 [where條件];

    – 刪除sid為1004的學(xué)生數(shù)據(jù)

    delete from student where sid = 1004;

    – 刪除表所有數(shù)據(jù)

    delete from student;

    • truncate table 表名 或者 truncate表名

    – 清空表數(shù)據(jù)

    truncate table student;

    truncate student;

    區(qū)別:delete和truncate原理不同,delete只刪除內(nèi)容,而truncate類似于drop table ,可以理解為先將整個(gè)表刪除,然后再創(chuàng)建該表。

    6.數(shù)據(jù)約束

    概述:表中數(shù)據(jù)的限制條件

    目的:就是為了保證表中的記錄完整性和有效性,比如用戶表有些列的值(手機(jī)號(hào))不能為空,有些列的值(身份證號(hào))不能重復(fù)。

    分類

    • 主鍵約束(primary key) PK
    • 自增長(zhǎng)約束(auto_increment)
    • 非空約束(not null)
    • 唯一性約束(unique)
    • 默認(rèn)約束(default)
    • 零填充約束(zerofill)
    • 外鍵約束(foreign key) FK
    6.1主鍵約束

    概述

    • MySQL主鍵約束是一個(gè)列或者多個(gè)列的組合,其值能唯一地標(biāo)識(shí)表中的每一行,方便在RDBMS中盡快的找到某一行。
    • 主鍵約束相當(dāng)于唯一約束 + 非空約束的組合,主鍵約束列不允許重復(fù),也不允許出現(xiàn)空值。
    • 每個(gè)表最多只允許一個(gè)主鍵
    • 主鍵約束的關(guān)鍵字是:primary key
    • 當(dāng)創(chuàng)建主鍵的約束時(shí),系統(tǒng)默認(rèn)會(huì)在所在的列和列組合上建立對(duì)應(yīng)的唯一索引

    添加單列主鍵

    • 方式1:

    create table 表名(

    <字段名> <數(shù)據(jù)類型> primary key

    … );

    • 方式2:

    create table 表名(

    [constraint <約束名>] primary key [字段名] );

    添加多列主鍵(聯(lián)合主鍵)

    create table 表名(

    primary key (字段1,字段2,…,字段n)

    );

    除此之外,還可以在表創(chuàng)建之后對(duì)表結(jié)構(gòu)修改來對(duì)主鍵進(jìn)行操作

    • 添加主鍵:

    alter table <表名> add primary key(字段列表);

    • 刪除主鍵:

    alter table <數(shù)據(jù)表名> drop primary key;

    6.2自增長(zhǎng)約束

    概述

    • 在 MySQL中,當(dāng)主鍵定義為自增長(zhǎng)后,這個(gè)主鍵的值就不再需要用戶輸入數(shù)據(jù)了,而由數(shù)據(jù)庫(kù)系統(tǒng)根據(jù)定義自動(dòng)賦值。每增加一條記錄,主鍵會(huì)自動(dòng)以相同的步長(zhǎng)進(jìn)行增長(zhǎng)。
    • 通過給字段添加 auto_increment 屬性來實(shí)現(xiàn)主鍵自增長(zhǎng)

    特點(diǎn)

    • 默認(rèn)情況下,auto_increment的初始值是 1,每新增一條記錄,字段值自動(dòng)加 1。
    • 一個(gè)表中只能有一個(gè)字段使用 auto_increment約束,且該字段必須有唯一索引,以避免序號(hào)重復(fù)(即為主鍵或主鍵的一部分)。
    • auto_increment約束的字段必須具備 NOT NULL 屬性。
    • auto_increment約束的字段只能是整數(shù)類型(TINYINT、SMALLINT、INT、BIGINT 等)。
    • auto_increment約束字段的最大值受該字段的數(shù)據(jù)類型約束,如果達(dá)到上限,auto_increment就會(huì)失效。

    添加自定義約束

    create table t_user1(

    id int primary key auto_increment,

    name varchar(20) );

    自定義約束初始值設(shè)置

    • 方式1:

    – 方式1,創(chuàng)建表時(shí)指定

    create table t_user2 (

    id int primary key auto_increment,

    name varchar(20)

    )auto_increment=100;

    • 方式2:

    alter table t_user2 auto_increment=100;

    :delete和truncate在刪除后自增列的變化

    :delete數(shù)據(jù)之后自動(dòng)增長(zhǎng)從斷點(diǎn)開始,truncate數(shù)據(jù)之后自動(dòng)增長(zhǎng)從默認(rèn)起始值開始。

    6.3非空約束

    概述:非空約束(not null)指字段的值不能為空。對(duì)于使用了非空約束的字段,如果用戶在添加數(shù)據(jù)時(shí)沒有指定值,數(shù)據(jù)庫(kù)系統(tǒng)就會(huì)報(bào)錯(cuò)。

    添加非空約束

    • 方式1:<字段名><數(shù)據(jù)類型> not null;
    • 方式2:alter table 表名 modify 字段類型 not null;

    刪除非空約束

    • alter table 表名 modify 字段 類型;
    6.4唯一約束

    概述:唯一約束(Unique Key)是指所有記錄中字段的值不能重復(fù)出現(xiàn)。例如,為 id 字段加上唯一性約束后,每條記錄的 id 值都是唯一的,不能出現(xiàn)重復(fù)的情況

    添加唯一約束

    • 方式1:<字段名> <數(shù)據(jù)類型> unique
    • 方式2: altertable 表名add constraint 約束名 unique(列名);

    刪除唯一約束

    • alter table <表名> drop index <唯一約束名>;
    6.5默認(rèn)約束

    概述:MySQL 默認(rèn)值約束用來指定某列的默認(rèn)值。

    添加默認(rèn)約束

    • 方式1:<字段名> <數(shù)據(jù)類型> default <默認(rèn)值>;
    • 方式2:alter table 表名 modify 列名 類型 default 默認(rèn)值;

    刪除默認(rèn)約束

    alter table <表名> modify column <字段名> <類型> default null;

    6.6零填充約束

    概述

    • 插入數(shù)據(jù)時(shí),當(dāng)該字段的值的長(zhǎng)度小于定義的長(zhǎng)度時(shí),會(huì)在該值的前面補(bǔ)上相應(yīng)的0

    • zerofill默認(rèn)為int(10)

    • 當(dāng)使用zerofill時(shí),默認(rèn)會(huì)自動(dòng)加unsigned(無符號(hào))屬性,使用unsigned屬性后,數(shù)值范圍是原值的2倍,例如,有符號(hào)為-128+127,無符號(hào)為0256

    添加零填充約束

    <字段名> <數(shù)據(jù)類型> zerofill;

    6.7外鍵約束

    概述

    • MySQL外鍵約束(FOREIGN KEY)是表的一個(gè)特殊字段,經(jīng)常與主鍵約束一起使用。對(duì)于兩個(gè)具有關(guān)聯(lián)關(guān)系的表而言,相關(guān)聯(lián)字段中主鍵所在的表就是主表(父表),外鍵所在的表就是從表(子表)。
    • 外鍵用來建立主表與從表的關(guān)聯(lián)關(guān)系,為兩個(gè)表的數(shù)據(jù)建立連接,約束兩個(gè)表中數(shù)據(jù)的一致性和完整性。比如,一個(gè)水果攤,只有蘋果、桃子、李子、西瓜等4 種水果,那么,你來到水果攤要買水果就只能選擇蘋果、桃子、李子和西瓜,其它的水果都是不能購(gòu)買的。

    特點(diǎn)

    • 主表必須已經(jīng)存在于數(shù)據(jù)庫(kù)中,或者是當(dāng)前正在創(chuàng)建的表。
    • 必須為主表定義主鍵。
    • 主鍵不能包含空值,但允許在外鍵中出現(xiàn)空值。也就是說,只要外鍵的每個(gè)非空值出現(xiàn)在指定的主鍵中,這 個(gè)外鍵的內(nèi)容就是正確的。
    • 在主表的表名后面指定列名或列名的組合。這個(gè)列或列的組合必須是主表的主鍵或候選鍵。
    • 外鍵中列的數(shù)目必須和主表的主鍵中列的數(shù)目相同。
    • 外鍵中列的數(shù)據(jù)類型必須和主表主鍵中對(duì)應(yīng)列的數(shù)據(jù)類型相同

    創(chuàng)建外鍵約束

    • 方式1(在create table語(yǔ)句中定義):

    [constraint <外鍵名>] foreign key 字段名 [,字段名2,…] references <主表名> 主鍵列1 [,主鍵列2,…]

    • 方式2(修改表的結(jié)構(gòu)):

    alter table <數(shù)據(jù)表名> add constraint <外鍵名> foreign key(<列名>) references <主表名> (<列名>);

    外鍵約束下,添加數(shù)據(jù):必須先給主表添加數(shù)據(jù),不然由于外鍵約束,主表不存在該列的值,就無法給從表添加數(shù)據(jù)。

    外鍵約束下,刪除數(shù)據(jù):主表的數(shù)據(jù)被從表依賴時(shí),不能刪除,否則可以刪除;從表的數(shù)據(jù)可以隨便刪除。

    刪除外鍵約束

    alter table <表名> drop foreign key <外鍵約束名>;

    多對(duì)多關(guān)系下添加外鍵約束:在兩個(gè)表為多對(duì)多關(guān)系是需要一個(gè)中間表,將中間表作為從表,分別與其他兩個(gè)表建立外鍵約束。

    7.DQL查詢

    概述

    • 數(shù)據(jù)庫(kù)管理系統(tǒng)一個(gè)重要功能就是數(shù)據(jù)查詢,數(shù)據(jù)查詢不應(yīng)只是簡(jiǎn)單返回?cái)?shù)據(jù)庫(kù)中存儲(chǔ)的數(shù)據(jù),還應(yīng)該根據(jù)需要對(duì)數(shù)據(jù)進(jìn)行篩選以及確定數(shù)據(jù)以什么樣的格式顯示。
    • MySQL提供了功能強(qiáng)大、靈活的語(yǔ)句來實(shí)現(xiàn)這些操作。
    • MySQL數(shù)據(jù)庫(kù)使用select語(yǔ)句來查詢數(shù)據(jù)。

    語(yǔ)法格式:

    SELECT

    selection_list /要查詢的列名稱/

    FROM

    table_list /要查詢的表名稱/

    WHERE

    condition /行條件/

    GROUP BY

    grouping_columns /對(duì)結(jié)果分組/

    HAVING

    condition /分組后的行條件/

    ORDER BY

    sorting_columns /對(duì)結(jié)果分組/

    LIMIT

    offset_start, row_count /結(jié)果限定/

    7.1簡(jiǎn)單查詢示例
    • 查詢所有的商品.

    select * from product;

    • 查詢商品名和商品價(jià)格.

    select pname,price from product;

    • 別名查詢.使用的關(guān)鍵字是as(as可以省略的).

    – 表別名:

    select * from product as p;

    – 列別名:

    select pname as pn from product;

    • 去掉重復(fù)值.

    select distinct price from product;

    • 查詢結(jié)果是表達(dá)式(運(yùn)算查詢):將所有商品的價(jià)格+10元進(jìn)行顯示.

    select pname,price+10 from product;

    7.2條件查詢示例
    • 查詢商品名稱為“海爾洗衣機(jī)”的商品所有信息:

    select * from product where pname = ‘海爾洗衣機(jī)’;

    • 查詢價(jià)格為800商品

    select * from product where price = 800;

    • 查詢價(jià)格不是800的所有商品

    select * from product where price != 800;

    select * from product where price <> 800;

    select * from product where not(price = 800);

    • 查詢商品價(jià)格大于60元的所有商品信息

    select * from product where price > 60;

    • 查詢商品價(jià)格在200到1000之間所有商品

    select * from product where price >= 200 and price <=1000;

    select * from product where price between 200 and 1000;

    • 查詢商品價(jià)格是200或800的所有商品

    select * fromproduct where price = 200 or price = 800;

    select * fromproduct where price in (200,800);

    • 查詢含有‘褲’字的所有商品

    select * fromproduct where pname like ‘%褲%';

    • 查詢以’海’開頭的所有商品

    select * fromproduct where pname like ‘海%’;

    • 查詢第二個(gè)字為’蔻’的所有商品

    select * fromproduct where pname like ‘_蔻%’;

    • 查詢category_id為null的商品

    select * fromproduct where category_id is null;

    • 查詢category_id不為null分類的商品

    select * fromproduct where category_id is not null;

    • 使用least求最小值

    select least(10, 20, 30); – 10

    select least(10, null , 30); --null

    • 使用greatest求最大值

    select greatest(10, 20, 30);

    select greatest(10, null, 30); --null

    7.3排序查詢

    特點(diǎn)

    • asc代表升序,desc代表降序,如果不寫默認(rèn)升序
    • orderby用于子句中可以支持單個(gè)字段,多個(gè)字段,表達(dá)式,函數(shù),別名
    • orderby子句,放在查詢語(yǔ)句的最后面。LIMIT子句除外

    排序查詢示例

    • 使用價(jià)格排序(降序)

    select * from product order by price desc;

    • 在價(jià)格排序(降序)的基礎(chǔ)上,以分類排序(降序)

    select * from product order by price desc,category_id asc;

    • 顯示商品的價(jià)格(去重復(fù)),并排序(降序)

    select distinct price from product order by price desc;

    7.4聚合查詢

    概述:之前我們做的查詢都是橫向查詢,它們都是根據(jù)條件一行一行的進(jìn)行判斷,而使用聚合函數(shù)查詢是縱向查詢,它是對(duì)一列的值進(jìn)行計(jì)算,然后返回一個(gè)單一的值;另外聚合函數(shù)會(huì)忽略空值。

    聚合函數(shù)作用
    count()統(tǒng)計(jì)指定列不為NULL的記錄行數(shù);
    sum()計(jì)算指定列的數(shù)值和,如果指定列類型不是數(shù)值類型,那么計(jì)算結(jié)果為0
    max()計(jì)算指定列的最大值,如果指定列是字符串類型,那么使用字符串排序運(yùn)算;
    min()計(jì)算指定列的最小值,如果指定列是字符串類型,那么使用字符串排序運(yùn)算;
    avg()計(jì)算指定列的平均值,如果指定列類型不是數(shù)值類型,那么計(jì)算結(jié)果為0

    聚合查詢示例:

    • 查詢商品的總條數(shù)

    select count(*) from product;

    • 查詢價(jià)格大于200商品的總條數(shù)

    select count(*) from product where price > 200;

    • 查詢分類為’c001’的所有商品的總和

    select sum(price) from product where category_id = ‘c001’;

    • 查詢商品的最大價(jià)格

    select max(price) from product;

    • 查詢商品的最小價(jià)格

    select min(price) from product;

    • 查詢分類為’c002’所有商品的平均價(jià)格

    select avg(price) from product where category_id = ‘c002’;

    注意

    • count函數(shù)對(duì)null值的處理

    如果count函數(shù)的參數(shù)為星號(hào)(*),則統(tǒng)計(jì)所有記錄的個(gè)數(shù)。而如果參數(shù)為某字段,不統(tǒng)計(jì)含null值的記錄個(gè)數(shù)。

    • sum和avg函數(shù)對(duì)null值的處理

    這兩個(gè)函數(shù)忽略null值的存在,就好該條記錄不存在一樣。

    • max和min函數(shù)對(duì)null值的處理

    max和min兩個(gè)函數(shù)同樣忽略null值的存在。

    7.5分組查詢

    概述:分組查詢是指使用group by字句對(duì)查詢信息進(jìn)行分組

    格式:select 字段1,字段2… from 表名 group by 分組字段 having 分組條件;

    注意

    • 如果要進(jìn)行分組的話,則SELECT子句之后,只能出現(xiàn)分組的字段和統(tǒng)計(jì)函數(shù),其他的字段不能出現(xiàn)
    • 分組之后對(duì)統(tǒng)計(jì)結(jié)果進(jìn)行篩選的話必須使用having,不能使用where。因?yàn)閣here子句用來篩選FROM子句中指定的操作所產(chǎn)生的行
    • group by 子句用來分組WHERE子句的輸出
    • having子句用來從分組的結(jié)果中篩選行

    總結(jié):where不能在group by后面出現(xiàn),分組后篩選只能使用having。

    7.6分頁(yè)查詢

    概述:分頁(yè)查詢?cè)陧?xiàng)目開發(fā)中常見,由于數(shù)據(jù)量很大,顯示屏長(zhǎng)度有限,因此對(duì)數(shù)據(jù)需要采取分頁(yè)顯示方式。例如數(shù)據(jù)共有30條,每頁(yè)顯示5條,第一頁(yè)顯示1-5條,第二頁(yè)顯示6-10條。

    格式:

    • 方式1-顯示前n條

    select 字段1,字段2… from 表明 limit n

    • 方式2-分頁(yè)顯示

    select 字段1,字段2… from 表明 limit m,n

    m: 整數(shù),表示從第幾條索引開始

    n: 整數(shù),表示查詢多少條數(shù)據(jù)

    –從第4條開始顯示,顯示5條

    select* from product limit 3,5

    8.數(shù)據(jù)復(fù)制

    概述:將一張表的數(shù)據(jù)導(dǎo)入到另一張表中

    • 方式1:

    insert into Table2(field1,field2,…) select value1,value2,… from Table1

    insert into Table2 select *from Table1

    要求:目標(biāo)表(Table2)必須存在。

    • 方式2:

    SELECT value1, value2 into Table2 from Table1

    要求:目標(biāo)表Table2不存在,因?yàn)樵诓迦霑r(shí)會(huì)自動(dòng)創(chuàng)建表Table2,并將Table1中指定字段數(shù)據(jù)復(fù)制到Table2中。

    9.多表聯(lián)合查詢

    9.1交叉連接查詢

    概述

    • 交叉連接查詢返回被連接的兩個(gè)表所有數(shù)據(jù)行的笛卡爾積
    • 笛卡爾積可以理解為一張表的每一行去和另外一張表的任意一行進(jìn)行匹配
    • 假如A表有m行數(shù)據(jù),B表有n行數(shù)據(jù),則返回m*n行數(shù)據(jù)
    • 笛卡爾積會(huì)產(chǎn)生很多冗余的數(shù)據(jù),后期的其他查詢可以在該集合的基礎(chǔ)上進(jìn)行條件篩選

    格式

    select from 表1,表2,表3….;

    9.2內(nèi)連接查詢

    概述:內(nèi)連接查詢求多張表的交集

    隱式內(nèi)連接(SQL92標(biāo)準(zhǔn)):select * from A,B where 條件;

    顯示內(nèi)連接(SQL99標(biāo)準(zhǔn)):select * from A inner join B on 條件;

    – 查詢?nèi)藬?shù)大于等于3的部門,并按照人數(shù)降序排序

    select deptno,count(1) as total_cnt from dept3,emp3 where dept3.deptno= emp3.dept_id group by deptno having total_cnt >= 3 order by total_cnt desc;

    select deptno,count(1) as total_cnt from dept3 join emp3 on dept3.deptno= emp3.dept_id group by deptno having total_cnt >= 3 order by total_cnt desc;

    9.3外連接查詢

    概述:連接結(jié)果不僅包含符合連接條件的行,同時(shí)也包含自身不符合條件的行。

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-dUU5reKN-1666602441451)(D:\智慧筆囊\mysql\assets\1666428799461.png)]

    格式(outer可以省略):

    • 左外連接:left outer join

    select * from A left outer join Bon 條件;

    • 右外連接:right outer join

    select * from A right outer join Bon 條件;

    • 滿外連接: full outer join

    select * from A full outer join B on 條件;

    :內(nèi)連接和外連接的區(qū)別?

    :內(nèi)連接的結(jié)果是兩個(gè)表都符合條件的,但外連接是至少有一方是不符合條件的,通俗的來說,就是至少有一個(gè)表的值是都存在的。

    注意:注意:oracle里面有full join,可是在mysql對(duì)full join支持的不好。我們可以使用union來達(dá)到目的。

    9.4子查詢

    概述:子查詢就是指的在一個(gè)完整的查詢語(yǔ)句之中,嵌套若干個(gè)不同功能的小查詢,從而一起完成復(fù)雜查詢的一種編寫形式,通俗一點(diǎn)就是包含select嵌套的查詢。

    特點(diǎn)

    • 單行單列:返回的是一個(gè)具體列的內(nèi)容,可以理解為一個(gè)單值數(shù)據(jù);
    • 單行多列:返回一行數(shù)據(jù)中多個(gè)列的內(nèi)容;
    • 多行單列:返回多行記錄之中同一列的內(nèi)容,相當(dāng)于給出了一個(gè)操作范圍;
    • 多行多列:查詢返回的結(jié)果是一張臨時(shí)表

    – 查詢年齡最大的員工信息,顯示信息包含員工號(hào)、員工名字,員工年齡

    select eid,ename,age from emp3 where age = (select max(age) from emp3);

    – 查詢年研發(fā)部和銷售部的員工信息,包含員工號(hào)、員工名字

    select eid,ename,t.name from emp3 where dept_id in (select deptno,name from dept3 where name = ‘研發(fā)部’ or name = ‘銷售部’) ;

    – 查詢研發(fā)部20歲以下的員工信息,包括員工號(hào)、員工名字,部門名字

    select eid,age,ename,name from (select * from dept where name = '研發(fā)部 ')t1,(select * from emp3 where age <20)t2

    9.5自關(guān)聯(lián)查詢

    概述:MySQL有時(shí)在信息查詢時(shí)需要進(jìn)行對(duì)表自身進(jìn)行關(guān)聯(lián)查詢,即一張表自己和自己關(guān)聯(lián),一張表當(dāng)成多張表來用。

    注意:自關(guān)聯(lián)時(shí),表必須給表起別名。

    格式

    select字段列表 from 表1 a ,表1 b where 條件;

    或者

    select字段列表 from 表1 a [left] join 表1 b on 條件;

    注意:注意:oracle里面有full join,可是在mysql對(duì)full join支持的不好。我們可以使用union來達(dá)到目的。

    9.4子查詢

    概述:子查詢就是指的在一個(gè)完整的查詢語(yǔ)句之中,嵌套若干個(gè)不同功能的小查詢,從而一起完成復(fù)雜查詢的一種編寫形式,通俗一點(diǎn)就是包含select嵌套的查詢。

    特點(diǎn)

    • 單行單列:返回的是一個(gè)具體列的內(nèi)容,可以理解為一個(gè)單值數(shù)據(jù);
    • 單行多列:返回一行數(shù)據(jù)中多個(gè)列的內(nèi)容;
    • 多行單列:返回多行記錄之中同一列的內(nèi)容,相當(dāng)于給出了一個(gè)操作范圍;
    • 多行多列:查詢返回的結(jié)果是一張臨時(shí)表

    – 查詢年齡最大的員工信息,顯示信息包含員工號(hào)、員工名字,員工年齡

    select eid,ename,age from emp3 where age = (select max(age) from emp3);

    – 查詢年研發(fā)部和銷售部的員工信息,包含員工號(hào)、員工名字

    select eid,ename,t.name from emp3 where dept_id in (select deptno,name from dept3 where name = ‘研發(fā)部’ or name = ‘銷售部’) ;

    – 查詢研發(fā)部20歲以下的員工信息,包括員工號(hào)、員工名字,部門名字

    select eid,age,ename,name from (select * from dept where name = '研發(fā)部 ')t1,(select * from emp3 where age <20)t2

    9.5自關(guān)聯(lián)查詢

    概述:MySQL有時(shí)在信息查詢時(shí)需要進(jìn)行對(duì)表自身進(jìn)行關(guān)聯(lián)查詢,即一張表自己和自己關(guān)聯(lián),一張表當(dāng)成多張表來用。

    注意:自關(guān)聯(lián)時(shí),表必須給表起別名。

    格式

    select字段列表 from 表1 a ,表1 b where 條件;

    或者

    select字段列表 from 表1 a [left] join 表1 b on 條件;

    ----------根據(jù)黑馬程序員課程的學(xué)習(xí)總結(jié)

    總結(jié)

    以上是生活随笔為你收集整理的mysql基础操作(详细版)--增删改查的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。