主頁 > 資料庫 > Mysql - 使用入門

Mysql - 使用入門

2021-04-29 09:29:46 資料庫

本文是學習 Mysql必知必會 后的筆記
學習之前需要創建一個資料庫,然后匯入下面兩個mysql腳本

create database db1 charset utf8;
########################################
# MySQL Crash Course
# Example table creation scripts
########################################


########################
# Create customers table
########################
CREATE TABLE customers
(
  cust_id      int       NOT NULL AUTO_INCREMENT,
  cust_name    char(50)  NOT NULL ,
  cust_address char(50)  NULL ,
  cust_city    char(50)  NULL ,
  cust_state   char(5)   NULL ,
  cust_zip     char(10)  NULL ,
  cust_country char(50)  NULL ,
  cust_contact char(50)  NULL ,
  cust_email   char(255) NULL ,
  PRIMARY KEY (cust_id)
) ENGINE=InnoDB;

#########################
# Create orderitems table
#########################
CREATE TABLE orderitems
(
  order_num  int          NOT NULL ,
  order_item int          NOT NULL ,
  prod_id    char(10)     NOT NULL ,
  quantity   int          NOT NULL ,
  item_price decimal(8,2) NOT NULL ,
  PRIMARY KEY (order_num, order_item)
) ENGINE=InnoDB;


#####################
# Create orders table
#####################
CREATE TABLE orders
(
  order_num  int      NOT NULL AUTO_INCREMENT,
  order_date datetime NOT NULL ,
  cust_id    int      NOT NULL ,
  PRIMARY KEY (order_num)
) ENGINE=InnoDB;

#######################
# Create products table
#######################
CREATE TABLE products
(
  prod_id    char(10)      NOT NULL,
  vend_id    int           NOT NULL ,
  prod_name  char(255)     NOT NULL ,
  prod_price decimal(8,2)  NOT NULL ,
  prod_desc  text          NULL ,
  PRIMARY KEY(prod_id)
) ENGINE=InnoDB;

######################
# Create vendors table
######################
CREATE TABLE vendors
(
  vend_id      int      NOT NULL AUTO_INCREMENT,
  vend_name    char(50) NOT NULL ,
  vend_address char(50) NULL ,
  vend_city    char(50) NULL ,
  vend_state   char(5)  NULL ,
  vend_zip     char(10) NULL ,
  vend_country char(50) NULL ,
  PRIMARY KEY (vend_id)
) ENGINE=InnoDB;

###########################
# Create productnotes table
###########################
CREATE TABLE productnotes
(
  note_id    int           NOT NULL AUTO_INCREMENT,
  prod_id    char(10)      NOT NULL,
  note_date datetime       NOT NULL,
  note_text  text          NULL ,
  PRIMARY KEY(note_id),
  FULLTEXT(note_text)
) ENGINE=MyISAM;


#####################
# Define foreign keys
#####################
ALTER TABLE orderitems ADD CONSTRAINT fk_orderitems_orders FOREIGN KEY (order_num) REFERENCES orders (order_num);
ALTER TABLE orderitems ADD CONSTRAINT fk_orderitems_products FOREIGN KEY (prod_id) REFERENCES products (prod_id);
ALTER TABLE orders ADD CONSTRAINT fk_orders_customers FOREIGN KEY (cust_id) REFERENCES customers (cust_id);
ALTER TABLE products ADD CONSTRAINT fk_products_vendors FOREIGN KEY (vend_id) REFERENCES vendors (vend_id);
########################################
# MySQL Crash Course
# Example table population scripts
########################################


##########################
# Populate customers table
##########################
INSERT INTO customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
VALUES(10001, 'Coyote Inc.', '200 Maple Lane', 'Detroit', 'MI', '44444', 'USA', 'Y Lee', '[email protected]');
INSERT INTO customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact)
VALUES(10002, 'Mouse House', '333 Fromage Lane', 'Columbus', 'OH', '43333', 'USA', 'Jerry Mouse');
INSERT INTO customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
VALUES(10003, 'Wascals', '1 Sunny Place', 'Muncie', 'IN', '42222', 'USA', 'Jim Jones', '[email protected]');
INSERT INTO customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
VALUES(10004, 'Yosemite Place', '829 Riverside Drive', 'Phoenix', 'AZ', '88888', 'USA', 'Y Sam', '[email protected]');
INSERT INTO customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact)
VALUES(10005, 'E Fudd', '4545 53rd Street', 'Chicago', 'IL', '54545', 'USA', 'E Fudd');


########################
# Populate vendors table
########################
INSERT INTO vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
VALUES(1001,'Anvils R Us','123 Main Street','Southfield','MI','48075', 'USA');
INSERT INTO vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
VALUES(1002,'LT Supplies','500 Park Street','Anytown','OH','44333', 'USA');
INSERT INTO vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
VALUES(1003,'ACME','555 High Street','Los Angeles','CA','90046', 'USA');
INSERT INTO vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
VALUES(1004,'Furball Inc.','1000 5th Avenue','New York','NY','11111', 'USA');
INSERT INTO vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
VALUES(1005,'Jet Set','42 Galaxy Road','London', NULL,'N16 6PS', 'England');
INSERT INTO vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
VALUES(1006,'Jouets Et Ours','1 Rue Amusement','Paris', NULL,'45678', 'France');


#########################
# Populate products table
#########################
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('ANV01', 1001, '.5 ton anvil', 5.99, '.5 ton anvil, black, complete with handy hook');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('ANV02', 1001, '1 ton anvil', 9.99, '1 ton anvil, black, complete with handy hook and carrying case');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('ANV03', 1001, '2 ton anvil', 14.99, '2 ton anvil, black, complete with handy hook and carrying case');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('OL1', 1002, 'Oil can', 8.99, 'Oil can, red');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('FU1', 1002, 'Fuses', 3.42, '1 dozen, extra long');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('SLING', 1003, 'Sling', 4.49, 'Sling, one size fits all');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('TNT1', 1003, 'TNT (1 stick)', 2.50, 'TNT, red, single stick');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('TNT2', 1003, 'TNT (5 sticks)', 10, 'TNT, red, pack of 10 sticks');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('FB', 1003, 'Bird seed', 10, 'Large bag (suitable for road runners)');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('FC', 1003, 'Carrots', 2.50, 'Carrots (rabbit hunting season only)');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('SAFE', 1003, 'Safe', 50, 'Safe with combination lock');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('DTNTR', 1003, 'Detonator', 13, 'Detonator (plunger powered), fuses not included');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('JP1000', 1005, 'JetPack 1000', 35, 'JetPack 1000, intended for single use');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('JP2000', 1005, 'JetPack 2000', 55, 'JetPack 2000, multi-use');



#######################
# Populate orders table
#######################
INSERT INTO orders(order_num, order_date, cust_id)
VALUES(20005, '2005-09-01', 10001);
INSERT INTO orders(order_num, order_date, cust_id)
VALUES(20006, '2005-09-12', 10003);
INSERT INTO orders(order_num, order_date, cust_id)
VALUES(20007, '2005-09-30', 10004);
INSERT INTO orders(order_num, order_date, cust_id)
VALUES(20008, '2005-10-03', 10005);
INSERT INTO orders(order_num, order_date, cust_id)
VALUES(20009, '2005-10-08', 10001);


###########################
# Populate orderitems table
###########################
INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20005, 1, 'ANV01', 10, 5.99);
INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20005, 2, 'ANV02', 3, 9.99);
INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20005, 3, 'TNT2', 5, 10);
INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20005, 4, 'FB', 1, 10);
INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20006, 1, 'JP2000', 1, 55);
INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20007, 1, 'TNT2', 100, 10);
INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20008, 1, 'FC', 50, 2.50);
INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20009, 1, 'FB', 1, 10);
INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20009, 2, 'OL1', 1, 8.99);
INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20009, 3, 'SLING', 1, 4.49);
INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20009, 4, 'ANV03', 1, 14.99);

#############################
# Populate productnotes table
#############################
INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(101, 'TNT2', '2005-08-17',
'Customer complaint:
Sticks not individually wrapped, too easy to mistakenly detonate all at once.
Recommend individual wrapping.'
);
INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(102, 'OL1', '2005-08-18',
'Can shipped full, refills not available.
Need to order new can if refill needed.'
);
INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(103, 'SAFE', '2005-08-18',
'Safe is combination locked, combination not provided with safe.
This is rarely a problem as safes are typically blown up or dropped by customers.'
);
INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(104, 'FC', '2005-08-19',
'Quantity varies, sold by the sack load.
All guaranteed to be bright and orange, and suitable for use as rabbit bait.'
);
INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(105, 'TNT2', '2005-08-20',
'Included fuses are short and have been known to detonate too quickly for some customers.
Longer fuses are available (item FU1) and should be recommended.'
);
INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(106, 'TNT2', '2005-08-22',
'Matches not included, recommend purchase of matches or detonator (item DTNTR).'
);
INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(107, 'SAFE', '2005-08-23',
'Please note that no returns will be accepted if safe opened using explosives.'
);
INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(108, 'ANV01', '2005-08-25',
'Multiple customer returns, anvils failing to drop fast enough or falling backwards on purchaser. Recommend that customer considers using heavier anvils.'
);
INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(109, 'ANV03', '2005-09-01',
'Item is extremely heavy. Designed for dropping, not recommended for use with slings, ropes, pulleys, or tightropes.'
);
INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(110, 'FC', '2005-09-01',
'Customer complaint: rabbit has been able to detect trap, food apparently less effective now.'
);
INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(111, 'SLING', '2005-09-02',
'Shipped unassembled, requires common tools (including oversized hammer).'
);
INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(112, 'SAFE', '2005-09-02',
'Customer complaint:
Circular hole in safe floor can apparently be easily cut with handsaw.'
);
INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(113, 'ANV01', '2005-09-05',
'Customer complaint:
Not heavy enough to generate flying stars around head of victim. If being purchased for dropping, recommend ANV02 or ANV03 instead.'
);
INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(114, 'SAFE', '2005-09-07',
'Call from individual trapped in safe plummeting to the ground, suggests an escape hatch be added.
Comment forwarded to vendor.'
);

1.0 初入Mysql

1.1 Mysql的連接

mysql -u 用戶名 -p -h 主機名 -P 埠號

-u 指名是誰來連接資料庫
-p 連接資料庫用戶的密碼
-h ip地址或主機名(也就是dns能決議到ip地址的網址)
-P 埠號,默認Mysql為 3306

1.2 成功連接資料后

當然了,連接上了,會顯示一大串的英語什么的,這里就說到幾個會用上的把

  • 命令用 ';' or '\g' 結束,換句話說,僅按下Enter后不執行任何命令
  • 輸入 'help' or '\h' 獲取幫助, 例如: '\h select' or 'help select' 注意這里結尾不需要加 ';'
  • 輸入 'quit' or 'exit' or '\q' 退出連接
1.2.1 Mysql了解資料庫與表

查看當前用戶或指定用戶的權限

show grants; --當前用戶
show grants for 用戶名; --特定用戶

mysql> show grants;
+-------------------------------------------------------------+
| Grants for root@%                                           |
+-------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION |
+-------------------------------------------------------------+
ALL PRIVILEGES : 表示那些權限,這里是所有權限
*.* : 中第一個*是哪個資料庫,如果為*指所有資料庫,第二個*指選中庫的哪個表,為*指所有表
root : 指用戶名
@后面的 % : 指授權地址,%指所有地址,localhost指本地,也可以為127.0.0.1
WITH GRANT OPTION : 這個選項表示該用戶可以將自己擁有的權限授權給別人

查看當前有那些資料庫

show databases;

查看用于創建資料庫的命令

show create database 資料庫名字;

查看服務器狀態資訊

show status \G;
--\G: 垂直顯示, 用于顯示得更加清洗,可不加

查看服務器錯誤或警告

show errors\G;
show warnings \G;

使用資料庫

use 資料庫名字;

查看資料庫內的表

show tables;

查看創建這個表的陳述句

show create table 表名\G;

查看表結構

show columns from 表名;
desc 表名;

2.0 簡單的 select 陳述句

查看單個列的資料

select 列名 from 表名;
use mysql;
select User from user;

查看多個列的資料

select 列名1,列名2,...,列名N from 表名;
select User, Host from user;

查看表內所有資料

select * from 表名;
select * from user\G;

注意:除非你確實是需要表中的所有資料,否則最好不要使用 * 通配符, 使用 * 會檢索出所有資料,這會降低檢索的性能,當然了,使用 * 通配符也可以檢索出來未知的列

2.1 去重 distinct

當然了去掉重復的資料可以使用下面的命令

-- distinct不能多列使用,除非多列檢測出來的一行或者多行的組合有重復,不然就都會顯示出來
select distinct 列名 from 表名;
select distinct Host from user;

2.2 限制顯示結果 limit

select 列名 from 表名 limit x,y\G;
x : 開始的位置
y : 開始位置后的行數

-- 這里x默認為0,即開始的 第0行 到即到它后面的 2行
select * from user limit 2\G;

-- 這里還有另外一種寫法
select * from user limit 2 offset 0 \G;

-- 即limit y offset x

2.3 完全限制表庫

這樣做的目的是限制唯一的列名

select 表名.列名 from 資料庫名.表名;
select user.User from mysql.user;

3.0 資料的排序

排序的資料在很多場合可能都會用上,可以下面下面的方式進行檢索排序

select 列名 from 表名 order by 列名;
select prod_name from products order by prod_name;
-- order by 同時也可以按照非檢索的列名進行排序,通常不這樣做

3.1 多個列排序

select 列1, 列2, 列3 from 表名 order by 列1, 列2;
select prod_id, prod_price,prod_name from products order by prod_price, prod_name;

3.2 指定排序方向 desc(降序) asc(默認升序)

select 列1, 列2, 列3 from 表名 order by 列1 desc, 列2 asc;
select prod_id, prod_price,prod_name from products order by prod_price desc, prod_name asc;

3.3 order by 于 limit的組合

select 列名 from products order by 列名 limit x,y;
select prod_price from products order by prod_price limit 5;

4.0 過濾行資料(where子句)

where 字句運算子號

運算子 說明
> 大于
!=(<>) 不等于
= 等于
< 小于
>= 大于等于
<= 小于等于
between 在兩者之間
and 兩種條件都要滿足
or 只要滿足其中的一種條件
in 指定檢索的范圍
not 否定后面跟的條件

基本使用方法

select 列1, 列2 from 表名 where 列資料 = 2.5;
select prod_name, prod_price from products where prod_price = 2.5;

4.1 檢索值范圍 between x and y 即(x <= value <= y)

select 列1, 列2 from products where 列1 between X and Y;

select prod_name, prod_price from products where prod_price between 5 and 10;

4.2 空值檢索

-- 應為空值具有特殊含義, 所以這里用的是 is

select 列名 from 表名 where 列名 is null;
select cust_id from customers where cust_email is null;

4.3 or運算子

select 列名, 列名 from 表名 where 列名 = 值 or 列名 = 值;
select prod_name, prod_price from products where vend_id = 1002 or vend_id = 1003;

4.4 or與and的組合

-- 這里需要的注意的是在進行組合運算的時候添加個 () 不會有錯的
-- 如果不添加 () ,下面的例子就會出現很奇怪的事
select prod_name, prod_price from products where  prod_price >=10 and (vend_id = 1002 or vend_id = 1003);

4.5 in運算子

上面的句子其實是可以這么化簡的

select 列名 from 表名 where 列名 in (值1, 值2, ..., 值n);
select prod_name, prod_price from products where  prod_price >=10 and vend_id in (1002, 1003);

4.6 not運算子

對上面的 vend_in 篩選的結果取反

select 列名 from 表名 where 列名 not in (值1, 值2, ..., 值n);
select prod_name, prod_price from products where  prod_price >=10 and vend_id not in (1002, 1003);

5.0 通配符的使用

通配符

  • % 表示任何字符出現任何次
  • _ 表示任何字符出現一次

5.1 like運算子

select 列名 from 表名 where 列名 like 帶有通配符的值;

-- 如果我只記得prod_name的值有je開頭的,我應該咋匹配呢?
select prod_id, prod_name from products where prod_name like 'je%';

或者我想搜索一個文本中包含什么的

select prod_id, prod_name from products where prod_name like '%se%';

......

5.2 通配符的使用技巧

通配符確實很好用,但是這個開銷會比前面的檢索方式慢太多

  • 通過其他方式能檢索到的,就完全沒比較使用通配符了
  • 在確實需要使用的時候,最好不用把通配符置于搜索模式的開始處,這樣搜索是最慢的

6.0 正則運算式進行檢索(盡量少用)

select 列名 from 表名 where 串列 regexp 正則運算式;

select prod_name from products where prod_name regexp '.000' order by prod_name;
mysql> select prod_name from products where prod_name regexp '1000' order by prod_name;
+--------------+
| prod_name    |
+--------------+
| JetPack 1000 |
+--------------+
1 row in set (0.00 sec)

mysql> 
mysql> select prod_name from products where prod_name like '1000' order by prod_name;
Empty set (0.00 sec)

由上面可以發現,like 是匹配整個列的,當列資料不一致,即不回傳資料,
而 regexp 是在列值內進行匹配,如果被匹配上了,當然就回傳資料了

6.1 正則運算式進行or匹配 ' | '

select prod_name from products where prod_name regexp '1000|2000' order by prod_name;

6.2 匹配幾個字符之一 ' [] '

select prod_name from products where prod_name regexp '[123] Ton' order by prod_name;

6.3 匹配范圍 ' [a-g] ' ... '[0-4]'

select prod_name from products where prod_name regexp '[1-5] Ton' order by prod_name;

6.4 匹配特殊字符

在mysql需要使用 '\\' 為前導的匹配方式,如匹配 '.' 則運算式為 '\\.'

元字符 說明
\\f 換頁
\\n 換行
\\r 回車
\\t 制表
\\v 縱向制表
-- 匹配 vend_name 列中含有小數點記錄
select vend_name from vendors where vend_name regexp '\\.';

6.5 匹配字符類

字符類

說明
[:alnum:] 匹配字符和數字(同 [a-zA-Z0-9])
[:alpha:] 任意字符(同[a-zA-Z])
[:blank:] 空格和制表(同[\\t])
[:cntrl:] ASCII控制字符(ASCII 0到31和127)
[:digit:] 任意數字(同[0-9])
[:graph:] 與[:print:]相同但不包括空格
[:lower:] 任意小寫字母(同[a-z])
[:print:] 任意可列印字符
[:punct:] 既不在[:alnum:]又不在[:cntrl:]中的任意字符
[:space:] 包括空格在內的任意空白字符(同[\\f\\n\\r\\t\v])
[:upper:] 任意大寫字母(同[A-Z])
[:xdigit:] 任意十六進制數字(同[a-fA-F0-9])

6.5 匹配多個示例

元字符 說明
* 0個或多個匹配
+ 1個或多個匹配(等于 {1,})
? 0個或1個匹配(等于 {0,1})
{n} n 是一個非負整數,匹配確定的 n 次
{n,m} 最少匹配 n 次且最多匹配 m 次 (m<=255)
select prod_name from products where prod_name regexp '\\([0-9] sticks?\\)';

select prod_name from products where prod_name regexp '[[:digit:]]{4}';

6.6 定位符

定位元字符

元字符 說明
^ 文本的開始( ^在[]內表示非 例如 [^a-z] 即非 a-z )
$ 文本的結尾
[[:<:]] 詞的開始
[[:>:]] 詞的結尾
select prod_name from products where prod_name regexp '^[0-9\\.]';

7.0 創建計算欄位

7.1 concat() 拼接欄位

使用 concat() 函式用于把多個列拼接起來

select concat(列1, 列2, ..., 列n) from 表名;
select concat(vend_name, '(', vend_country, ')') from vendors;

7.2 as 使用別名

上面輸出的表抬頭是不是感覺好丑,那么就可以使用 as

select concat(列1, 列2, ..., 列n) as 別名 from 表名;
select concat(vend_name, '(', vend_country, ')')  as vend_tittle from vendors;
7.2.1 trim() 洗掉左右兩邊的空格 rtrim(),ltrim()
select concat(trim(vend_name), '(', trim(vend_country), ')')  as vend_tittle from vendors;

7.3 算式計算

SELECT
	prod_id,
	quantity,
	item_price,
	quantity * item_price AS expanded_price 
FROM
	orderitems 
WHERE
	order_num = 20005;
運算子 說明
+
-
*
/

函式的測驗

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2021-03-23 18:15:02 |
+---------------------+
1 row in set (0.00 sec)

mysql> select trim('  aaa');
+---------------+
| trim('  aaa') |
+---------------+
| aaa           |
+---------------+
1 row in set (0.00 sec)

mysql> select 'hello' regexp '[a-z]';
+------------------------+
| 'hello' regexp '[a-z]' |
+------------------------+
|                      1 |
+------------------------+
1 row in set (0.00 sec)

mysql> select 'hello' regexp '[0-9]';
+------------------------+
| 'hello' regexp '[0-9]' |
+------------------------+
|                      0 |
+------------------------+
1 row in set (0.00 sec)

8.0 函式

8.1 常見文理處理函式

函式 說明
length(s) 回傳串s的長度
trim(s) 去掉字串 s 開始和結尾處的空格
upper(s) 將字串轉換為大寫
left(s,n) 回傳字串 s 的前 n 個字符
lower(s) 將字串 s 的所有字母變成小寫字母
locate(s1,s) 從字串 s 中獲取 s1 的開始位置
right(s,n) 回傳字串 s 的后 n 個字符
ltrim(s) 去掉字串 s 開始處的空格
rtrim(s) 去掉字串 s 結尾處的空格
substring(s, start, length) 從字串 s 的 start 位置截取長度為 length 的子字串

8.1 常見日期和時間處理函式

函式名 描述
addDate(d,n) 計算起始日期 d 加上 n 天的日期
addTime(t,n) n 是一個時間運算式,時間 t 加上時間運算式 n
curDate() 回傳當前日期
curTime() 回傳當前時間
date() 從日期或日期時間運算式中提取日期值
CURRENT_TIME 回傳當前時間
CURRENT_DATE() 回傳當前日期
CURRENT_TIMESTAMP() 回傳當前日期和時間
dateDiff(d1,d2) 計算日期 d1->d2 之間相隔的天數
date_add(d,INTERVAL expr type) 計算起始日期 d 加上一個時間段后的日期
date_format(d,f) 按運算式 f的要求顯示日期 d
day(d) 回傳日期值 d 的日期部分
dayOfMonth(d) 計算日期 d 是本月的第幾天
dayOfWeek(d) 日期 d 今天是星期幾,1 星期日,2 星期一,以此類推
dayOfYear(d) 計算日期 d 是本年的第幾天
hour(t) 回傳 t 中的小時值
minute(t) 回傳 t 中的分鐘值
month(d) 回傳日期d中的月份值,1 到 12
now() 回傳當前日期和時間
time(expression) 提取傳入運算式的時間部分
year(d) 回傳年份
select cust_id, order_num from orders where order_date = '2005-09-01';

select cust_id, order_num from orders where date(order_date) = '2005-09-01';

select cust_id, order_num from orders where year(order_date) = 2005 and month(order_date)=9;
SELECT
	cust_id,
	order_num 
FROM
	orders 
WHERE
	date( order_date ) BETWEEN '2005-09-01' 
	AND '2005-09-30';

8.2 常見數值處理函式

函式名 描述
ABS(x) 回傳 x 的絕對值
COS(x) 求余弦值(引數是弧度)
EXP(x) 回傳 e 的 x 次方
MOD(x,y) 回傳 x 除以 y 以后的余數
PI() 回傳圓周率(3.141593)
ROUND(x) 回傳離 x 最近的整數
SIN(x) 求正弦值(引數是弧度)
SQRT(x) 回傳x的平方根
TAN(x) 求正切值(引數是弧度)

9.0 聚合or集合函式

聚集函式(aggregate function)運行在行組上,計算和回傳單個值的函式

聚集函式 說明
AVG([distinct] expr) 求平均值
COUNT({* [distinct] } expr)
MAX([distinct] expr) 求最大值
MIN([distinct] expr) 求最小值
SUM([distinct] expr) 求累加和
select avg(列名) from 表名;
-- ......

-- avg() 僅僅用于單列,多列著多個 avg()函式
-- 忽略列值為 NULL 的行
select avg(prod_price) as avg_price from products;

-- count()
select count(*) from products; --所有行數
select count(prod_name) from products; --忽略NULL的所有行

-- max() 略NULL的行
select max(prod_price) as max_price from products;

-- min() 略NULL的行
select min(prod_price) min_price from products;

-- sum() 略NULL的行
select sum(prod_price) total_price from products;

9.1 聚合or集合不同的值,默認為all

嵌套的 distinc

select avg(distinct prod_price) as avg_price from products;

10.0 分組

10.1 創建分組 group by

select 列名 from 表名 group by 列名;

select vend_id, count(*) as nums_prods from products group by vend_id;

關于 group by 的使用說明

    1. group by 子句可以包含任意數目的列
    1. 如果在group by子句中嵌套了分組,資料將在最后規定的分組上進行分組
    1. group by 子句中列出的每個列都必須是檢索列或有效的運算式(但不能是聚合函式)
      可以這樣想即 select 列1 ... group by 列1 注意不能 group by 別名
    1. 如果列中含有 NULL 值,則分組單獨顯示出來,有多個Null,它們將分為一組
    1. group by 子句必須出現在 where 子句后,order by 子句之前

使用 with rollup 關鍵字,可以得到每個分組以及每個分組匯總級別的值

-- 回傳單獨的vend_id供貨總數
select count(vend_id)  from products where vend_id = '1001';
+----------------+
| count(vend_id) |
+----------------+
|              3 |
+----------------+
1 row in set (0.00 sec)


-- 回傳每個vend_id供貨總數
select vend_id, count(*) as nums_prods from products group by vend_id with rollup;
+---------+------------+
| vend_id | nums_prods |
+---------+------------+
|    1001 |          3 |
|    1002 |          2 |
|    1003 |          7 |
|    1005 |          2 |
|    NULL |         14 |
+---------+------------+
5 rows in set (0.00 sec)

10.1 過濾分組 having

  • 注意 where 為過濾行,但是 having 支持 where 的所有操作
select cust_id, count(*) as orders from orders group by cust_id having count(*) >= 2;
SELECT
	vend_id,
	COUNT(*) AS num_prods 
FROM
	products 
WHERE
	prod_price >= 10 
GROUP BY
	vend_id 
HAVING
	COUNT(*) >= 2;

10.2 分組和排序

檢索總訂單價格大于50的訂單號和總計訂單價格在按照總計訂單價格排序輸出

SELECT
	order_num,
	SUM( quantity * item_price ) AS order_total 
FROM
	orderitems 
GROUP BY
	order_num 
HAVING
	order_total >= 50 
ORDER BY
	order_total;
SELECT
	order_num,
	SUM( quantity * item_price ) AS order_total 
FROM
	orderitems 
GROUP BY
	order_num 
HAVING
	order_total >= 50 
ORDER BY
	order_total 
LIMIT 2;

11.0 使用子查詢

子查詢:即嵌套在其它查詢中的查詢

現在需要列出訂購物品TNT2的所有客戶

  1. 檢索包含物品TNT2的所有訂單的編號
  2. 檢索具有前一步驟列出的訂單編號的所有客戶ID
  3. 檢索前一步驟回傳的所有客戶ID的客戶資訊
-- 1)
select order_num from orderitems where prod_id = 'TNT2';
+-----------+
| order_num |
+-----------+
|     20005 |
|     20007 |
+-----------+
2 rows in set (0.00 sec)

-- 2)
select cust_id from orders where order_num in (20005, 20007);
+---------+
| cust_id |
+---------+
|   10001 |
|   10004 |
+---------+
2 rows in set (0.00 sec)

-- 3)
select cust_name, cust_contact from customers where cust_id in (10001, 10004);
+----------------+--------------+
| cust_name      | cust_contact |
+----------------+--------------+
| Coyote Inc.    | Y Lee        |
| Yosemite Place | Y Sam        |
+----------------+--------------+
2 rows in set (0.01 sec)

現在呢,我們就可以把這三個查詢合并為一個查詢

SELECT
	cust_name,
	cust_contact 
FROM
	customers 
WHERE
	cust_id IN (
	SELECT
		cust_id 
	FROM
		orders 
WHERE
	order_num IN ( SELECT order_num FROM orderitems WHERE prod_id = 'TNT2' ));

像上面的陳述句可能不是最有效率的方式,可以在后面參考(聯結表)

11.1 作為計算欄位使用子查詢

假如需要顯示customers表中每個客戶的總訂單數, 訂單與相應的客戶ID存盤在orders表中

  1. 從customers表中檢索客戶串列
  2. 對于檢索出來的每個客戶,統計其在orders表中的訂單數目
SELECT
	cust_name,
	cust_state,
	( SELECT COUNT(*) FROM orders WHERE orders.cust_id = customers.cust_id ) AS orders 
FROM
	customers 
ORDER BY
	cust_name;

12.0 聯結表

Mysql聯結的表越多會導致性能的下降

12.1 創建聯結表

-- 等值聯結
SELECT
	vend_name,
	prod_name,
	prod_price 
FROM
	vendors,
	products 
WHERE
	vendors.vend_id = products.vend_id 
ORDER BY
	vend_name,
	prod_name;

如果上面的句子洗掉掉 where 就會出現 笛卡爾積,這并非是我們需要的資料

-- 笛卡爾積
SELECT
	vend_name,
	prod_name,
	prod_price 
FROM
	vendors,
	products 
ORDER BY
	vend_name,
	prod_name;

12.2 內部聯結

此聯結與上面的等值接連一致,唯一不同的是這里使用關鍵子 inner join ... on 進行限定

SELECT
	vend_name,
	prod_name,
	prod_price 
FROM
	vendors
	INNER JOIN products ON vendors.vend_id = products.vend_id;

12.3 聯結多個表

SELECT
	vend_name,
	prod_name,
	quantity,
	prod_price 
FROM
	vendors,
	products,
	orderitems 
WHERE
	vendors.vend_id = products.vend_id 
	AND orderitems.prod_id = products.prod_id 
	AND order_num = 20005;

11.0 中出現的問題 現在需要列出訂購物品TNT2的所有客戶 即可以通過下面的方式處理

SELECT
	cust_name,
	cust_contact 
FROM
	customers 
WHERE
	cust_id IN (
	SELECT
		cust_id 
	FROM
		orders 
WHERE
	order_num IN ( SELECT order_num FROM orderitems WHERE prod_id = 'TNT2' ));
SELECT
	cust_name,
	cust_contact 
FROM
	orderitems,
	orders,
	customers 
WHERE
	customers.cust_id = orders.cust_id 
	AND orderitems.order_num = orders.order_num 
	AND prod_id = 'TNT2';

12.4 使用別名

這條陳述句和上面的查詢結果一致,但使用了 別名

SELECT
	cust_name,
	cust_contact 
FROM
	orderitems AS oi,
	orders AS o,
	customers AS c 
WHERE
	c.cust_id = o.cust_id 
	AND oi.order_num = o.order_num 
	AND prod_id = 'TNT2';

12.5 自聯結

自聯結: 同一張表的聯結

SELECT
	p1.prod_id, p1.prod_name 
FROM
	products AS p1,
	products AS p2 
WHERE
	p1.vend_id = p2.vend_id 
	AND p2.prod_id = 'DTNTR';

12.6 外聯結

許多聯結將一個表中的行與另外一個表中的行進行關聯,但有時會需要包含沒有關聯的那些行,這就用到了外聯結

LEFT OUTER JOIN : OUTER JOIN左邊的表
RIGHT OUTER JOIN : OUTER JOIN右邊的表

SELECT
	customers.cust_id, orders.order_num 
FROM
	customers
	LEFT OUTER JOIN orders ON customers.cust_id = orders.cust_id;

12.7 使用帶聚合函式的聯結

檢索所有客戶及客戶所下的訂單數

SELECT
	customers.cust_name,
	customers.cust_id,
	COUNT( orders.order_num ) AS num_ord 
FROM
	customers
	INNER JOIN orders ON customers.cust_id = orders.cust_id 
GROUP BY
	customers.cust_id;

檢索所有客戶及客戶所下的訂單數,使用左外聯結來包含所有客戶,甚至包含那些沒有下訂單的客戶

SELECT
	customers.cust_name,
	customers.cust_id,
	COUNT( orders.order_num ) AS num_ord 
FROM
	customers
	 LEFT OUTER JOIN orders ON customers.cust_id = orders.cust_id 
GROUP BY
	customers.cust_id;

13.0 組合查詢

13.1 創建組合查詢 union
SELECT
	vend_id,
	prod_id,
	prod_price 
FROM
	products 
WHERE
	prod_price > 5 UNION
SELECT
	vend_id,
	prod_id,
	prod_price 
FROM
	products 
WHERE
	vend_id IN ( 1001, 1002 );

union 規則

  1. union 必須由兩潭訓兩條以上的select陳述句組成
  2. union 中的每個查詢必須包含相同的列、運算式或聚集函式(順序可以不一致)
  3. 列資料型別必須兼容,及可以隱含轉換的型別
  4. union 可用于組合不同的表
13.2 包含或取消重復的行 union all

13.1 的例子中,如果兩條陳述句單獨查詢共計顯示9條資料,而使用union卻只顯示了8行,
這是因為union默認會去除掉重復的行,不然不祥去重,可以使用 union all

SELECT
	vend_id,
	prod_id,
	prod_price 
FROM
	products 
WHERE
	prod_price > 5 UNION ALL
SELECT
	vend_id,
	prod_id,
	prod_price 
FROM
	products 
WHERE
	vend_id IN ( 1001, 1002 );
13.3 對組合查詢結果排序

order by只能放在最后的select查詢上

SELECT
	vend_id,
	prod_id,
	prod_price 
FROM
	products 
WHERE
	prod_price > 5 UNION
SELECT
	vend_id,
	prod_id,
	prod_price 
FROM
	products 
WHERE
	vend_id IN ( 1001, 1002 ) 
ORDER BY
	vend_id,
	prod_price;

上面的查詢看似只對第二條select陳述句進行排序,實則是對所有的select陳述句進行排序,

14.0全文本搜索

并不是所有的引擎都支持全文索引,兩個最常使用的引擎為MyISAM和InnoDB,前者支持全文本索引,而后者不支持

前面所提到的 like 和 regexp 都能實作這個功能,但是會有如下的的限制

  • 性能 -- 通配符和正則運算式匹配通常要求mysql嘗試匹配表中所有行(而且這些搜索極少使用表索引),
    因此,由于被搜索行數不斷增加,這些搜索可能非常耗時
  • 明確控制
  • 智能化的結果 --

14.1啟用全文本搜索

-- FULLTEXT() 可指定多個列
CREATE TABLE `productnotes` (
  `note_id` int(11) NOT NULL AUTO_INCREMENT,
  `prod_id` char(10) NOT NULL,
  `note_date` datetime NOT NULL,
  `note_text` text,
  PRIMARY KEY (`note_id`),
  FULLTEXT (`note_text`)
) ENGINE=MyISAM;

注意:不要在匯入資料時使用 fulltext,可以先匯入資料后在修改表

14.2進行全文本搜索

  • Match() 指定被搜索的列
    傳遞給Match()的值必須與fulltext定義中的相同,如果指定多個列,則必須列出它們(且次序正確)

  • Against() 指定要使用的搜索運算式 - 不區分大小寫

select note_text from productnotes where Match(note_text) Against('rabbit')\G;
*************************** 1. row ***************************
note_text: Customer complaint: rabbit has been able to detect trap, food apparently less effective now.
*************************** 2. row ***************************
note_text: Quantity varies, sold by the sack load.
All guaranteed to be bright and orange, and suitable for use as rabbit bait.
2 rows in set (0.00 sec)

查看全文搜索的排序如何作業的

select note_text, Match(note_text) Against('rabbit') as rank from productnotes \G;
*************************** 1. row ***************************
note_text: Customer complaint:
Sticks not individually wrapped, too easy to mistakenly detonate all at once.
Recommend individual wrapping.
     rank: 0
*************************** 2. row ***************************
note_text: Can shipped full, refills not available.
Need to order new can if refill needed.
     rank: 0
*************************** 3. row ***************************
note_text: Safe is combination locked, combination not provided with safe.
This is rarely a problem as safes are typically blown up or dropped by customers.
     rank: 0
*************************** 4. row ***************************
note_text: Quantity varies, sold by the sack load.
All guaranteed to be bright and orange, and suitable for use as rabbit bait.
     rank: 1.5905543565750122
*************************** 5. row ***************************
note_text: Included fuses are short and have been known to detonate too quickly for some customers.
Longer fuses are available (item FU1) and should be recommended.
     rank: 0
*************************** 6. row ***************************
note_text: Matches not included, recommend purchase of matches or detonator (item DTNTR).
     rank: 0
*************************** 7. row ***************************
note_text: Please note that no returns will be accepted if safe opened using explosives.
     rank: 0
*************************** 8. row ***************************
note_text: Multiple customer returns, anvils failing to drop fast enough or falling backwards on purchaser. Recommend that customer considers using heavier anvils.
     rank: 0
*************************** 9. row ***************************
note_text: Item is extremely heavy. Designed for dropping, not recommended for use with slings, ropes, pulleys, or tightropes.
     rank: 0
*************************** 10. row ***************************
note_text: Customer complaint: rabbit has been able to detect trap, food apparently less effective now.
     rank: 1.6408053636550903
*************************** 11. row ***************************
note_text: Shipped unassembled, requires common tools (including oversized hammer).
     rank: 0
*************************** 12. row ***************************
note_text: Customer complaint:
Circular hole in safe floor can apparently be easily cut with handsaw.
     rank: 0
*************************** 13. row ***************************
note_text: Customer complaint:
Not heavy enough to generate flying stars around head of victim. If being purchased for dropping, recommend ANV02 or ANV03 instead.
     rank: 0
*************************** 14. row ***************************
note_text: Call from individual trapped in safe plummeting to the ground, suggests an escape hatch be added.
Comment forwarded to vendor.
     rank: 0
14 rows in set (0.00 sec)

14.3使用查詢擴展 with query expansion

查詢擴展用來放寬所回傳的文本搜索結果的范圍

在使用查詢擴展的時候Mysql對資料和索引進行兩邊掃描完成搜索

-- 在在上的例子中沒有使用查詢擴展的時候只能回傳兩行
-- 現在使用回傳了6行
select note_text from productnotes where Match(note_text) Against('rabbit' with query expansion)\G;
*************************** 1. row ***************************
note_text: Quantity varies, sold by the sack load.
All guaranteed to be bright and orange, and suitable for use as rabbit bait.
*************************** 2. row ***************************
note_text: Customer complaint: rabbit has been able to detect trap, food apparently less effective now.
*************************** 3. row ***************************
note_text: Customer complaint:
Circular hole in safe floor can apparently be easily cut with handsaw.
*************************** 4. row ***************************
note_text: Customer complaint:
Sticks not individually wrapped, too easy to mistakenly detonate all at once.
Recommend individual wrapping.
*************************** 5. row ***************************
note_text: Customer complaint:
Not heavy enough to generate flying stars around head of victim. If being purchased for dropping, recommend ANV02 or ANV03 instead.
*************************** 6. row ***************************
note_text: Multiple customer returns, anvils failing to drop fast enough or falling backwards on purchaser. Recommend that customer considers using heavier anvils.
6 rows in set (0.00 sec)

14.4布爾文本搜索 in boolean mode

即使沒有定義fulltext索引,也可以使用它喲

select note_text from productnotes where Match(note_text) Against('rabbit' in boolean mode) \G;
*************************** 1. row ***************************
note_text: Quantity varies, sold by the sack load.
All guaranteed to be bright and orange, and suitable for use as rabbit bait.
*************************** 2. row ***************************
note_text: Customer complaint: rabbit has been able to detect trap, food apparently less effective now.
2 rows in set (0.00 sec)
-- 匹配包含 heavy 但不包含任意一repo開始的詞
select note_text from productnotes where Match(note_text) Against('heavy -rope*' in boo
lean mode) \G;
*************************** 1. row ***************************
note_text: Customer complaint:
Not heavy enough to generate flying stars around head of victim. If being purchased for dropping, recommend ANV02 or ANV03 instead.
1 row in set (0.01 sec)

全文本布爾運算子

運算子 描述
+ 包括,這個詞必須存在
- 排除,這個詞不能存在
> 包括并增加排名值
< 包括并降低排名值
() 將詞分組成子運算式(允許將其包括,排除,排序等作為一個組)
~ 取消一個詞的排名值
* 在結尾的通配符
"" 定義一個短語(與單個單詞串列相反,整個短語匹配包含或排除)

下面是一些列子

-- 搜索匹配包含詞 rabbit和bait的行
select note_text from productnotes where Match(note_text) Against('+rabbit +bait' in boolean mod
e) \G;

-- 沒有指定運算子,這個搜索匹配包含詞 rabbit和bait 中的至少一個詞 
select note_text from productnotes where Match(note_text) Against('rabbit bait' in boolean mode) \G;

-- 匹配短語rabbit bait
select note_text from productnotes where Match(note_text) Against('"rabbit bait"' in boolean mode) \G;

-- 增加rabbit的等級,降低bait的等級
select note_text from productnotes where Match(note_text) Against('>rabbit <bait"' in boolean mode) \G;

-- 匹配詞safe和combination 降低combination的等級
select note_text from productnotes where Match(note_text) Against('+safe +(<combination)"' in boolean mode) \G;

15.0插入資料

15.1插入完整的行

使用關鍵字 low_priority 降低insert陳述句降低優先級,提升查詢性能

-- 不指定具體欄位,默認把欄位全部插一遍
insert low_priority into 表名 values(值1,值2, ..., 值n);

-- 一次插入一條資料, 推薦使用
insert low_priority into 表名(列1,列2) values(值1, 值2);

-- 一次插入多條資料, 推薦使用
insert low_priority into 表名(列1,列2) values(值1, 值2),(值3, 值4),(值5, 值6);

-- 可以具體指定某個欄位進行插入
insert low_priority into 表名(列名) values(值);

15.2插入檢索出的資料

INSERT INTO customers ( cust_id, cust_contact, cust_email, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country ) SELECT
cust_id,
cust_contact,
cust_email,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country 
FROM
	custnew;

16.0更新和洗掉資料

更新

-- 不加條件有風險,一改全改,一定加where
update 表名 set 列名=值 where 條件
update 表名 set 列名1=值, 列名2=值 where 條件

洗掉

-- 洗掉的時候,必須加上where
delete from 表名 where 列名 = 值;

-- 洗掉所有資料,一刪全刪,一定加where
delete from 表名;

-- 洗掉所有 (資料+重置id)
truncate table 表名;

17.0創建表和操作表

17.1創建表

創建表的約束

關鍵字 說明
unsigned 無符號數
not null 不為空
default 默認值
unique 唯一值,加入唯一索引(索引相當于字典目錄,索引的提出是為了加快速度,一味地亂加索引不會提高查詢效率)
primary key 主鍵
auto_increment 自增加一
zerofill 零填充
foreign key 外鍵

常見mysql資料型別
整數型別

型別名稱 說明 存盤需求
TINYINT -128?127 0 ?255(1個位元組)
SMALLINT -32768?32767 0?65535(2個位元組)
MEDIUMINT -8388608?8388607 0?16777215(三個位元組)
INT (INTEGER) -2147483648?2147483647 0?4294967295(四個位元組)
BIGINT -9223372036854775808?9223372036854775807 0?18446744073709551615(八個位元組)

浮點數型別

型別名稱 說明 存盤需求
FLOAT 單精度浮點數 4 個位元組
DOUBLE 雙精度浮點數 8 個位元組
DECIMAL (M, D),DEC 壓縮的“嚴格”定點數 M+2 個位元組

日期和時間型別

型別名稱 日期格式 日期范圍 存盤需求
YEAR YYYY 1901 ~ 2155 1 個位元組
TIME HH:MM:SS -838:59:59 ~ 838:59:59 3 個位元組
DATE YYYY-MM-DD 1000-01-01 ~ 9999-12-3 3 個位元組
DATETIME YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 8 個位元組
TIMESTAMP YYYY-MM-DD HH:MM:SS 1980-01-01 00:00:01 UTC ~ 2040-01-19 03:14:07 UTC 4 個位元組

字串型別

型別名稱 說明 存盤需求
CHAR(M) 固定長度非二進制字串 M 位元組,1<=M<=255
VARCHAR(M) 變長非二進制字串 L+1位元組,在此,L< = M和 1<=M<=255
TINYTEXT 非常小的非二進制字串 L+1位元組,在此,L<2^8
TEXT 小的非二進制字串 L+2位元組,在此,L<2^16
MEDIUMTEXT 中等大小的非二進制字串 L+3位元組,在此,L<2^24
LONGTEXT 大的非二進制字串 L+4位元組,在此,L<2^32
ENUM 列舉型別,只能有一個列舉字串值 1或2個位元組,取決于列舉值的數目 (最大值為65535)
SET 一個設定,字串物件可以有零個或 多個SET成員 1、2、3、4或8個位元組,取決于集合 成員的數量(最多64個成員)

二進制型別

型別名稱 說明 存盤需求
BIT(M) 位欄位型別 大約 (M+7)/8 位元組
BINARY(M) 固定長度二進制字串 M 位元組
VARBINARY (M) 可變長度二進制字串 M+1 位元組
TINYBLOB (M) 非常小的BLOB L+1 位元組,在此,L<2^8
BLOB (M) 小 BLOB L+2 位元組,在此,L<2^16
MEDIUMBLOB (M) 中等大小的BLOB L+3 位元組,在此,L<2^24
LONGBLOB (M) 非常大的BLOB L+4 位元組,在此,L<2^32
CREATE TABLE `customers` (
  `cust_id` int(11) NOT NULL AUTO_INCREMENT,
  `cust_name` char(50) NOT NULL,
  `cust_address` char(50) DEFAULT NULL,
  `cust_city` char(50) DEFAULT NULL,
  `cust_state` char(5) DEFAULT NULL,
  `cust_zip` char(10) DEFAULT NULL,
  `cust_country` char(50) DEFAULT NULL,
  `cust_contact` char(50) DEFAULT NULL,
  `cust_email` char(255) DEFAULT NULL,
  PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10011 DEFAULT CHARSET=utf8

17.2引擎型別

表級鎖 :  只要有一個執行緒執行修改表中的相關操作,就會上鎖,其他執行緒默認等待;
行級鎖 :  針對于當前表中的這條記錄,這一行進行上鎖,其他資料仍然可以被其他執行緒修改,實作高并發,高可用;
事務處理: 執行sql陳述句時,必須所有的操作全部成功,才最終提交資料,有一條失敗,直接回滾,恢復到先前狀態
begin     : 開啟事務
commit    : 提交資料
rollback  : 回滾資料

MyISAM: 表級鎖,全文索引
InnoDB: 事務處理,行級鎖,外鍵
MEMORY: 同MyISAM,唯一不同的是把資料放在記憶體中,臨時快取;
BLACKHOLE: anything you write to it disappears
		   一般用于同步主從資料庫;(放在主資料庫和從資料庫之間的一臺服務器;)

17.3操縱表

-- modify 只能改變資料型別
alter table 表名 modify 列名 新資料型別;

-- change 改變列名+資料型別
alter table 表名 change 列名 新列名 資料型別;

-- add 添加列
alter table 表名 add 列名 資料型別;

-- drop 洗掉欄位
alter table 表名 drop 列名;

-- rename 更改表明
alter table 表名 rename 新表名;

-- 刪表
drop table 表名;

18.0使用視圖

視圖用create view陳述句來創建

CREATE VIEW productcustomers AS SELECT
cust_name,
cust_contact,
prod_id 
FROM
	customers,
	orders,
	orderitems 
WHERE
	customers.cust_id = orders.cust_id 
	AND orderitems.order_num = orders.order_num;


select cust_name, cust_contact from productcustomers where prod_id = 'TNT2';

使用 show create view 視圖名稱; 來查看創建視圖的陳述句

show create view productcustomers\G;

用drop view 視圖名稱; 來洗掉視圖

drop view productcustomers\G;

更新可以先洗掉視圖再創建,也可以直接使用create or replace view 更新視圖

CREATE OR REPLACE VIEW productcustomers AS SELECT
cust_name,
prod_id 
FROM
	customers,
	orders,
	orderitems 
WHERE
	customers.cust_id = orders.cust_id 
	AND orderitems.order_num = orders.order_num;

18.1用視圖重新格式化檢索出的資料

CREATE VIEW vendorlocations AS SELECT
CONCAT( RTRIM( vend_name ), '(', RTRIM( vend_country ), ')' ) AS vend_title 
FROM
	vendors 
ORDER BY
	vend_name;
	

SELECT * from vendorlocations;

18.1用視圖過濾不需要的資料

CREATE VIEW customeremail AS SELECT
cust_id,
cust_name,
cust_email 
FROM
	customers 
WHERE
	cust_email IS NOT NULL;


SELECT	* FROM	customeremail;

18.1用視圖計算欄位

CREATE VIEW orderitemsexpanded AS SELECT
order_num,
prod_id,
quantity,
item_price,
quantity * item_price AS expanded_pricce 
FROM
	orderitems;

SELECT	* FROM	orderitemsexpanded;

19.0使用存盤程序

20.0使用游標

21.0使用觸發器

22.0管理事物處理

23.0安全管理

24.0資料庫維護

25.0優化性能

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/281189.html

標籤:其他

上一篇:樹形結構的選單表設計與查詢

下一篇:.NET 5/.NET Core使用EF Core 5連接MySQL資料庫寫入/讀取資料示例教程

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more