MySql基础总结(一)

1、创建一个表

[sql]  view plain  copy
  1. CREATE TABLE customers  
  2. (  
  3.   cust_id      INT       NOT NULL AUTO_INCREMENT,  
  4.   cust_name    CHAR(50)  NOT NULL ,  
  5.   cust_address CHAR(50)  NULL ,  
  6.   cust_city    CHAR(50)  NULL ,  
  7.   cust_state   CHAR(5)   NULL ,  
  8.   cust_zip     CHAR(10)  NULL ,  
  9.   cust_country CHAR(50)  NULL ,  
  10.   cust_contact CHAR(50)  NULL ,  
  11.   cust_email   CHAR(255) NULL ,  
  12.   PRIMARY KEY (cust_id)  
  13. ) ENGINE=INNODB;  

其中,AUTO_INCREMENT表示该列是自动增长的,char存放的是固定长度的字符串,CHAR(50)表示存放的字符长度为50,PRIMARY KEY (cust_id)表示将cust_id设置成为主键。ENGINE=InnoDB,表示将存储引擎设为InnoDB。

关于InnoDB:

InnoDB 是 MySQL 上第一个提供外键约束的数据存储引擎,除了提供事务处理外,InnoDB 还支持行锁,提供和 Oracle 一样的一致性的不加锁读取,能增加并发读的用户数量并提高性能,不会增加锁的数量。InnoDB 的设计目标是处理大容量数据时最大化性能,它的 CPU 利用率是其他所有基于磁盘的关系数据库引擎中最有效率的。

InnoDB 是一套放在 MySQL 后台的完整数据库系统,InnoDB 有它自己的缓冲池,能缓冲数据和索引,InnoDB 还把数据和索引存放在表空间里面,可能包含好几个文件,这和 MyISAM 表完全不同,在 MyISAM 中,表被存放在单独的文件中,InnoDB 表的大小只受限于操作系统文件的大小,一般为 2GB


同理可创建orderitems表(存放每个订单中的实际物品)、orders表(存放客户订单)、products表(存放产品目录,每行表示一个产品)、vendors表(存放生产产品的供应商)

[sql]  view plain  copy
  1. CREATE TABLE orderitems  
  2. (  
  3.   order_num  INT          NOT NULL ,  
  4.   order_item INT          NOT NULL ,  
  5.   prod_id    CHAR(10)     NOT NULL ,  
  6.   quantity   INT          NOT NULL ,  
  7.   item_price DECIMAL(8,2) NOT NULL ,  
  8.   PRIMARY KEY (order_num, order_item)  
  9. ) ENGINE=INNODB;  
  10.   
  11. CREATE TABLE orders  
  12. (  
  13.   order_num  INT      NOT NULL AUTO_INCREMENT,  
  14.   order_date DATETIME NOT NULL ,  
  15.   cust_id    INT      NOT NULL ,  
  16.   PRIMARY KEY (order_num)  
  17. ) ENGINE=INNODB;  
  18.   
  19. CREATE TABLE products  
  20. (  
  21.   prod_id    CHAR(10)      NOT NULL,  
  22.   vend_id    INT           NOT NULL ,  
  23.   prod_name  CHAR(255)     NOT NULL ,  
  24.   prod_price DECIMAL(8,2)  NOT NULL ,  
  25.   prod_desc  TEXT          NULL ,  
  26.   PRIMARY KEY(prod_id)  
  27. ) ENGINE=INNODB;  
  28.   
  29. CREATE TABLE vendors  
  30. (  
  31.   vend_id      INT      NOT NULL AUTO_INCREMENT,  
  32.   vend_name    CHAR(50) NOT NULL ,  
  33.   vend_address CHAR(50) NULL ,  
  34.   vend_city    CHAR(50) NULL ,  
  35.   vend_state   CHAR(5)  NULL ,  
  36.   vend_zip     CHAR(10) NULL ,  
  37.   vend_country CHAR(50) NULL ,  
  38.   PRIMARY KEY (vend_id)  
  39. ) ENGINE=INNODB;  
2、添加数据到customers表中,这里采用列=值的方式,这样可以保证当表中列的顺序改变时,插入数据也不会受到影响。

[sql]  view plain  copy
  1. INSERT INTO customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)  
  2. VALUES(10001, 'Coyote Inc.''200 Maple Lane''Detroit''MI''44444''USA''Y Lee''ylee@coyote.com');  
  3. INSERT INTO customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact)  
  4. VALUES(10002, 'Mouse House''333 Fromage Lane''Columbus''OH''43333''USA''Jerry Mouse');  
  5. INSERT INTO customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)  
  6. VALUES(10003, 'Wascals''1 Sunny Place''Muncie''IN''42222''USA''Jim Jones''rabbit@wascally.com');  
  7. INSERT INTO customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)  
  8. VALUES(10004, 'Yosemite Place''829 Riverside Drive''Phoenix''AZ''88888''USA''Y Sam''sam@yosemite.com');  
  9. INSERT INTO customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact)  
  10. VALUES(10005, 'E Fudd''4545 53rd Street''Chicago''IL''54545''USA''E Fudd');  



同理,可以给orderitems表、orders表、products表、vendors表插入数据。

3、显示所有数据库

[sql]  view plain  copy
  1. SHOW DATABASES;  

4、检索

(1)检索单列

如从products表中检索出一个名为prod_name的列。

[sql]  view plain  copy
  1. SELECT prod_name FROM products;  

输出:


(2)检索多列

[sql]  view plain  copy
  1. SELECT prod_id,prod_name,prod_price FROM products;  

输出


(3)检索所有列

[sql]  view plain  copy
  1. SELECT * FROM products;  

(4)排序检索

[sql]  view plain  copy
  1. SELECT prod_name FROM products ORDER BY prod_name;  

注意事项:

a.     在使用ORDER BY字句时,应保证它是SELECT语句的最后一条字句

b.     可以通过非选择的列来进行排序,如

SELECT prod_id FROM products ORDERBY prod_name;

Prod_id是选择的列,prod_name是非选择的列。

c.      可以按多个列进行排序,如

SELECTprod_id,prod_price,prod_name FROM products ORDER BY prod_price,prod_name;

d.     可以按照列的相对位置进行排序

SELECTprod_id,prod_price,prod_name FROM products ORDER BY 2,3;

此时,排序只能按照选择的列进行排序,而且增加了错用列名进行排序的可能性。

e.     默认排序为升序排序,降序排序需要指定DESC关键字,放在所选择的列后面。

SELECT prod_name FROM productsORDER BY prod_name DESC;

如果需要在多个列上进行降序排序,必须对每个列指定DESC。

(5) 过滤检索

a. 单条件过滤

WHERE通过特定的搜索条件对数据进行过滤,筛选出特定的行。

[sql]  view plain  copy
  1. SELECT prod_name,prod_price FROM products WHERE prod_price < 3.49;  

WHERE字句支持=, <>, !=, <, <=, >, >=,BETWEEN,IS NULL操作

注意,在WHERE字句中使用字符串进行过滤时,要用单引号限定字符串。如:

[sql]  view plain  copy
  1. SELECT vend_id,prod_name FROM products WHERE prod_id != 'FB';  
  2. SELECT vend_id,prod_name,prod_id FROM products WHERE prod_id != 'FB';  


b. 多条件过滤(组合过滤)

检索出满足所有条件的行,各条件用AND连接,等同于&&

[sql]  view plain  copy
  1. SELECT prod_id,prod_price,prod_name,vend_id FROM products WHERE vend_id = 1001 AND prod_price < 10;  

输出:



检索满足任一条件的行,各条件之间用OR来连接,等同于||

[sql]  view plain  copy
  1. SELECT prod_id,prod_price,prod_name,vend_id FROM products WHERE vend_id = 1001 OR prod_price < 10;  

注意:当同时使用AND和OR语句时,应当使用括号来规定计算次序,因为默认AND的优先级比OR高,SQL会先处理AND语句。如检索出价格在10美元以下的,由厂商1001或1002生产的所有产品。

[sql]  view plain  copy
  1. SELECT prod_id,prod_price,prod_name,vend_id FROM products   
[sql]  view plain  copy
  1. WHERE vend_id = 1001 OR vend_id = 1002 AND prod_price < 10;  

输出:


在该结果中,出现了价格在10美元以上的产品,这是因为在没加括号的情况下,SQL先处理了AND导致的。更改为

[sql]  view plain  copy
  1. SELECT prod_id,prod_price,prod_name,vend_id FROM products   
[sql]  view plain  copy
  1. WHERE (vend_id = 1001 OR vend_id = 1002) AND prod_price < 10;  
即可得到正确的结果




另一种多条件过滤-操作符IN(功能相当于OR),查询出符合IN中任一条件的数据。

[sql]  view plain  copy
  1. SELECT prod_id,prod_price,prod_name,vend_id FROM products WHERE vend_id IN(1001,1002);  

优点:

IN操作符一般比OR执行更快。

IN可以包含其他SELECT语句,使得能够更动态地创建WHERE字句。


否定查询-NOT

NOT可放在列名的前面,也可以放在列名的后面。如下:

[sql]  view plain  copy
  1. SELECT prod_id,prod_price,prod_name,vend_id FROM products WHERE vend_id NOT IN(1001,1002);  
  2. SELECT prod_id,prod_price,prod_name,vend_id FROM products WHERE NOT vend_id IN(1001,1002);  

使用LIKE进行模糊查询

“%”代表任意字符,”_”代表单个字符。

[sql]  view plain  copy
  1. SELECT prod_id,prod_price,prod_name,vend_id FROM products WHERE prod_id LIKE 'F%';  



 
[sql]  view plain  copy
  1. SELECT prod_id,prod_price,prod_name,vend_id FROM products WHERE prod_id LIKE 'F_';  

通配符搜索处理时间较长,所以能用其他操作符达到相同的目的,则不建议使用通配符。


去重复查询DISTINCT

[sql]  view plain  copy
  1. SELECT DISTINCT order_num FROM orderitems;  

(7) 计算字段查询

1、拼接:将多个值联结到一起构成单个值

如将vend_name和vend_country拼接。

[sql]  view plain  copy
  1. SELECT CONCAT(vend_name,' (',vend_country,')'FROM vendors ORDER BY vend_name;  

使用别名AS

[sql]  view plain  copy
  1. SELECT CONCAT(vend_name,' (',vend_country,')'AS vend_title FROM vendors ORDER BY vend_name;  

使用别名的好处:1)给计算字段赋予别名,可以让客户机方便使用

                              2)使得列的含义更容易理解

(8) 使用函数进行查询

文本处理函数:

Left(str,len);

str为一个字符串,len表示从左边开始截取,截取字符串的长度。

Right(str,len)

同left(str,len),只是从右边开始截取。

SUBSTRING(str,pos); 

等同于SUBSTRING(str FROM pos),str为一个字符串,pos为从哪个位置开始截取,直到末尾,如果pos为负数,则表示从倒数开始截取。

SUBSTRING(str,pos,len);

等同于SUBSTRING(str FROM pos FOR len)表示从pos开始截取,截取长度为len。

SUBSTRING_INDEX(str,delim,count); 

delim为标识字符,若count为正数,表示截取第count个标识符之前的字符串,若count为负数,表示截取倒数第count个字符之后的字符串。

Length();计算字符串长度

Lower();大写转小写

SOUNDEX();返回串的发音比较像的串。


如输入:

[sql]  view plain  copy
  1. SELECT vend_name,UPPER(vend_name) AS vend_name_upcase FROM vendors ORDER BY vend_name;  


聚集函数:

AVG(),COUNT(),MAX(),MIN(),SUM()

如计算所有产品的价格的平均值:

[sql]  view plain  copy
  1. SELECT AVG(prod_price) AS avg_price FROM products;  

(9)分组查询GROUP BY

查询按某个字段分组后,各组的数量,如

[sql]  view plain  copy
  1. SELECT vend_id,COUNT(*) AS num_prods FROM products GROUP BY vend_id;  

查询出了产品中,每个厂商生产的产品数量。

输出:


与WITH ROLLUP一起使用

[sql]  view plain  copy
  1. SELECT vend_id,COUNT(*) AS num_prods FROM products GROUP BY vend_id WITH ROLLUP;-- 最后加入一个总和行  


与HAVING一起使用,过滤分组

WHERE过滤行,HAVING过滤分组,如查询订单数大于等于2的顾客。

[sql]  view plain  copy
  1. SELECT cust_id,COUNT(*) AS '订单数' FROM orders GROUP BY cust_id HAVING COUNT(*) >= 2;  

注意:1) Group by字句可以包含任意数目的列

           2) 如果在Group by中使用了嵌套分组,则数据将在最后规定的分组上进行汇总

           3) Group by字句中列出的列必须是select中的列或者是有效表达式,但不能是聚集函数。

           4) Select语句中的每个列都必须在group by字句中给出

           5) 如果分组列中具有null值,则null将作为一个分组返回,如果列中有多行null值,它们将被分为一组。

           6) Group by字句必须出现在where字句之后,order by字句之前


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值