1、创建一个表

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;

其中,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表(存放生产产品的供应商)

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 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 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 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;

2、添加数据到customers表中,这里采用列=值的方式,这样可以保证当表中列的顺序改变时,插入数据也不会受到影响。

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', 'ylee@coyote.com');
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', 'rabbit@wascally.com');
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', 'sam@yosemite.com');
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');

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

3、显示所有数据库

SHOW DATABASES;

4、检索

(1)检索单列

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

SELECT prod_name FROM products;

输出:

(2)检索多列

SELECT prod_id,prod_name,prod_price FROM products;

输出

(3)检索所有列

SELECT * FROM products;

(4)排序检索

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通过特定的搜索条件对数据进行过滤,筛选出特定的行。

SELECT prod_name,prod_price FROM products WHERE prod_price < 3.49;

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

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

SELECT vend_id,prod_name FROM products WHERE prod_id != 'FB';
SELECT vend_id,prod_name,prod_id FROM products WHERE prod_id != 'FB';

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

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

SELECT prod_id,prod_price,prod_name,vend_id FROM products WHERE vend_id = 1001 AND prod_price < 10;

输出:

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

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生产的所有产品。

SELECT prod_id,prod_price,prod_name,vend_id FROM products 
WHERE vend_id = 1001 OR vend_id = 1002 AND prod_price < 10;

输出:

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

SELECT prod_id,prod_price,prod_name,vend_id FROM products 
WHERE (vend_id = 1001 OR vend_id = 1002) AND prod_price < 10;

即可得到正确的结果

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

SELECT prod_id,prod_price,prod_name,vend_id FROM products WHERE vend_id IN(1001,1002);

优点:

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

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

否定查询-NOT

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

SELECT prod_id,prod_price,prod_name,vend_id FROM products WHERE vend_id NOT IN(1001,1002);
SELECT prod_id,prod_price,prod_name,vend_id FROM products WHERE NOT vend_id IN(1001,1002);

使用LIKE进行模糊查询

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

SELECT prod_id,prod_price,prod_name,vend_id FROM products WHERE prod_id LIKE 'F%';

SELECT prod_id,prod_price,prod_name,vend_id FROM products WHERE prod_id LIKE 'F_';

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

去重复查询DISTINCT

SELECT DISTINCT order_num FROM orderitems;

(7) 计算字段查询

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

如将vend_name和vend_country拼接。

SELECT CONCAT(vend_name,' (',vend_country,')') FROM vendors ORDER BY vend_name;

使用别名AS

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();返回串的发音比较像的串。

如输入:

SELECT vend_name,UPPER(vend_name) AS vend_name_upcase FROM vendors ORDER BY vend_name;

聚集函数:

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

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

SELECT AVG(prod_price) AS avg_price FROM products;

(9)分组查询GROUP BY

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

SELECT vend_id,COUNT(*) AS num_prods FROM products GROUP BY vend_id;

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

输出:

与WITH ROLLUP一起使用

SELECT vend_id,COUNT(*) AS num_prods FROM products GROUP BY vend_id WITH ROLLUP;-- 最后加入一个总和行

与HAVING一起使用,过滤分组

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

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字句之前

MySql基础总结的更多相关文章

  1. Mysql基础代码(不断完善中)

    Mysql基础代码,不断完善中~ /* 启动MySQL */ net start mysql /* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限 ...

  2. MYSQL基础操作

    MYSQL基础操作 [TOC] 1.基本定义 1.1.关系型数据库系统 关系型数据库系统是建立在关系模型上的数据库系统 什么是关系模型呢? 1.数据结构可以规定,同类数据结构一致,就是一个二维的表格 ...

  3. 【夯实Mysql基础】记一次mysql语句的优化过程

    1. [事件起因] 今天在做项目的时候,发现提供给客户端的接口时间很慢,达到了2秒多,我第一时间,抓了接口,看了运行的sql,发现就是 2个sql慢,分别占了1秒多. 一个sql是 链接了5个表同时使 ...

  4. MySQL基础(非常全)

    MySQL基础 一.MySQL概述 1.什么是数据库 ? 答:数据的仓库,如:在ATM的示例中我们创建了一个 db 目录,称其为数据库 2.什么是 MySQL.Oracle.SQLite.Access ...

  5. mysql 基础篇5(mysql语法---数据)

    6 增删改数据 -- ********一.增删改数据********* --- -- 1.1 增加数据 -- 插入所有字段.一定依次按顺序插入 INSERT INTO student VALUES(1 ...

  6. MySQL 基础语句

    MySQL 基础语句 多个知识点 ----------------------------------------------------------------------------------- ...

  7. MySQL:基础—数据分组

    MySQL:基础-数据分组 1.为什么要分组: 比如一个表中有多条订单记录,如上图,每条记录对应着一个商品,现在我要查询 每个商品被订购的单数 准备出货?也就是找到每个商品被订购的数量. 如果只找一个 ...

  8. MySQL基础学习总结

    1.MySQL基础概念 mysql逻辑架构如下: 每个客户端连接都会在服务器中拥有一个线程,这个连接的查询只会在这个单独的线程中执行. MySQL是分层的架构.上层是服务器层的服务和查询执行引擎,下层 ...

  9. MySQL基础(五)——视图

    MySQL基础(五)--视图

  10. MySQL基础(四)——索引

    MySQL基础(四)--索引

随机推荐

  1. ajax事件请求

    首先,ajax是什么? ajax是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. ajax是一种用于创建的快速动态网页的技术. 当async:true时,表示异步执行ajax代码:当as ...

  2. TextView SpannableString 使用之实现可点击超链接效果

    TextView SpannableString 使用之实现可点击超链接效果 如果看到这里说明你对 TextView 已经有了一定的了解,至少已经使用过该控件显示文字过.现在来实现一些复杂一点的效果. ...

  3. [转载] 网络IO模型

    转载自http://blog.csdn.net/zhoudaxia/article/details/8974779 同步(synchronous) IO和异步(asynchronous) IO,阻塞( ...

  4. DNS生效时间

    http://blog.itechol.com/space-33-do-blog-id-908.html http://www.madboa.com/geek/dig/ Dig简介 Dig是一个在类U ...

  5. C# WPF动点任意移动气泡画法(解决方案使用到数学勾股定理、正弦定理、向量知识)。

    许久没写博客了,最近在研究WPF下气泡的画法,研发过程还是比较艰辛的(主要是复习了高中的数学知识,MMP全忘光了),这篇博客主要是提供一个思路给大家参考,如果有大神还有更好的解决方案可以不吝您的言论尽 ...

  6. 关于Python在Linux、Mac和Windows上的安装方法总结

    一.Linux下安装python   1.python源码安装包下载地址:   https://www.python.org/downloads/source/   2.下载完tar.xz压缩包以后, ...

  7. webpack之前端性能优化(史上最全,不断更新中。。。)

    最近在用webpack优化首屏加载性能,通过几种插件之后我们上线前后的速度快了一倍,在此就简单的分享下吧,先上个优化前后首屏渲染的对比图. 可以看到总下载时间从3800ms缩短到1600ms. 我们在 ...

  8. JavaFx新手教程-布局-StackPane

    cmlanche: 您叫什么名字? StackPane cmlanche: 您好,StackPane君,可以问下您在JavaFX家族中是什么地位? stackpane君: 我可重要了,我是在JavaF ...

  9. nomad的简易集群

    启动服务器 第一步是为服务器创建配置文件.无论是从下载的文件github,或粘贴到一个名为server.hcl: vim server.hcl # Increase log verbosity log ...

  10. C++课程设计报告总结

          C++课程设计报告             学院:计算机学院 班级:计科141班 姓名:刘建伟 学号:201400814125 指导老师:王璐 C++课程设计实验报告 学号:2014008 ...