mysql分组取数量_MySQL命令,⼀篇⽂章替你全部搞定
MySQL的基本操作可以包括两个⽅⾯:MySQL常⽤语句如⾼频率使⽤的增删改查(CRUD)语句和MySQL⾼级功能,如存储过程,触发器,事务处理等。⽽这两个⽅⾯⼜可以细分如下:
MySQL常⽤语句
1. 表(或者数据库)的CRUD
2. 表数据的CRUD,其中表数据查询使⽤最多,也更复杂。查询可以按照单表还是多表可以分为:单
表SELECT查询和多表的联结查询
(INNER JOIN, LEFT JOIN, RIGHT JOIN和FULL JOIN)以及组合查询UNION和UNION ALL
3. SQL语句中各个关键字的执⾏顺序
MySQL的⾼级功能
1. 存储过程
2. 事务处理
3. 触发器
1. 表(或数据库)操作语句1.1. 查询表(或数据库)
1. 获取所有可⽤的数据库:SHOW DATABASES;
2. 选择数据库:USE customers;
3. ⽤于显⽰数据库服务器的状态信息:SHOW STATUS;
4. ⽤来显⽰授权⽤户的安全权限:SHOW GRANTS;
5. ⽤来显⽰数据库服务器或警告信息:SHOW ERRORS 或者 SHOW WARNINGS;
6. ⽤于显⽰创建数据库时的创建语句:SHOW CREATE DATABASE customers;
7. ⽤于显⽰创建表时的创建语句:SHOW CREATE TABLE customers;
8. 获取当前所选的数据库中所有可⽤的表:SHOW TABLES;
9. 获取表中所有列的信息:SHOW COLUMNS FROM tableName;同时DESCRIBE语句有相同的效果:DESCRIBE tableName;
1.2. 新建表(或)数据库
1. 新建数据库:CREATE DATABASE customers;
2. 创建表可以使⽤CREATE TABLE语句:
CREATE TABLE customers(  cust_id INT NOT NULL AUTO_INCREMENT,  cust_name CHAR(50) NOT NULL,  cust_age INT NULL DEFAULT 18,  PRI 有这样⼀些细节:
1. 允许NULL值,则说明在插⼊⾏数据时允许不给出该列的值,⽽NOT NULL则表⽰在插⼊或者更新该列数据,必须明确给出该列的
值;
2. DEFAULT表⽰该列的默认值,在插⼊⾏数据时,若没有给出该列的值就会使⽤其指定的默认值;
3. PRIMARY KEY⽤于指定主键,主键可以指定⼀列数据,⽽可以由多列数据组合构成,如PRIMARY KEY(cust_id,cust_name);
4. ENGINE⽤于指定引擎类型。常见的引擎类型有这些:(1)InnoDB是⼀个⽀持可靠的事务处理的引擎,但是不⽀持全⽂本搜索;
(2)MyISAM是⼀个性能极⾼的引擎,它⽀持全⽂本搜索,但是不⽀持事务处理;(3)MEMORY在功能上等同于MyISAM,但由于数
据存储在内存中,速度很快(特别适合于临时表);
在创建表的时候可以使⽤FOREIGN KEY来创建外键,即⼀个表中的FOREIGN KEY指向另⼀个表中PRIMARY KEY。外键FOREIGN KEY
⽤于约束破坏表的联结动作,保证两个表的数据完整性。同时也能防⽌⾮法数据插⼊外键列,因为该列值必须指向另⼀个表的主键。实例为:
CREATE TABLE Orders ( Id_O int NOT NULL, OrderNo int NOT NULL, Id_P int, PRIMARY KEY (Id_O), FOREIGN KEY (Id_P) REFERENCES Persons(Id_ 1.3 删除表(或数据库)
1. 删除数据库:DROP DATABASE customers;
2. 删除表,使⽤DROP TABLE⼦句:DROP TABLE customers。
1.4 更新表
1. 更新表结构信息可以使⽤ALTER TABLE⼦句,如为表增加⼀列:ALTER TABLE vendors ADD vend_name CHAR(20);另外经
常⽤于定义外键,如:
ALTER TABLE customers  ADD CONSTRAINT fk_custormer_orders FOREIGN KEY(cust_id) REFERENCES orders (order_cust)
1. 重命名表,使⽤RENAME⼦句。RENAME TABLE backup_customers TO customers, backup_vendors TO vendors;更改多
sort of trip
个表名,之间⽤逗号间隔
2 表数据操作语句
2.1 查询表数据
基本查询语句
1. 根据过滤条件查询表中的单列或者多列或者全部列的信息SELECT FROM WEHERE:SELECT cust_id,cust_name FROM
customers WHERE cust_id=10086;其中过滤条件操作符有:=,<>,!=,,>=,BETWEEN AND,IS NULL;
2. 为查询出的某⼀列信息去重DISTINCT:SELECT DISTINCT cust_name FROM customers;
3. 限制单列查询结果的⾏数:SELECT cust_name FROM customers LIMIT 5;LIMIT后跟⼀个数值,表⽰从第0⾏开始取,共取5⾏
数据;如果LIMIT 5,5表⽰从第5⾏(数据库中实际第6⾏记录)开始取,共取5⾏数据。注意:数据是从第0⾏开始计数的;
4. ORDER BY⼦句取⼀个或者多个列,据此对输出进⾏排序:SELECT cust_id,cust_name FROM customers ORDER BY cust_id
DESC, cust_name;
5. IN操作符⽤来指定条件范围,范围中的每个条件都可以进⾏匹配:SELECT cust_id, cust_name FROM customers WHERE
cust_id IN (1000,2000)。另外,NOT操作符可以和IN操作符配合使⽤,⽤于表⽰检索出不符合条件的所有数据;
6. LIKE操作符⽤来表明模糊查询,与之配合使⽤的通配符有**%**,%表⽰任何字符出现任何次数;_,_表⽰只能匹配⼀个字符:
SELECT cust_id,cust_name FROM customers WHERE cust_name LIKE '%happy%';
7. 使⽤分组查询并可以满⾜⼀定的分组过滤条件GROUP BY HAVING。如检索总计订单⾦额⼤于等于50的订单号和订单总⾦额,并按
总⾦额进⾏排序:SELECT order_num,SUM(quantity*item_price) AS order_total FROM orderitems GROUP BY order_num HAVING SUM(quantity*item_price)>=50 ORDER BY order_total
8. WHERE和HAVING的⽐较。WHERE是⾏级过滤,⽽HAVING是组级过滤。被WHERE过滤掉的数据不会出现在分组中。WHERE中
通配符以及多个WHERE⼦句的连接同样适⽤于HAVING⼦句;scripture是什么意思英语
9. GROUP BY的使⽤注意事项: (1)GROUP BY⼦句中可以嵌套分组(即通过多个列进⾏分组GROUP BY cust_id, cust_name),但是
进⾏数据汇总时,是在最后规定的分组上进⾏;(2)GROUP BY⼦句中列出的每个列都必须是检索列或者是有效的表达式。(3)如果有NULL值,将值NULL作为⼀个分组进⾏返回,如果有多⾏NULL值,它们将分为⼀组
10. 嵌套其他查询中的查询,称之为⼦查询。执⾏过程由⾥向外,⾥层查询结果作为外层查询的条件:SELECT cust_id FROM orders
WHERE order_num IN (SELECT order_num FROM orderitems WHERE prod_id = 'happy')。当然,多表的查询可以是⽤联结查询。
联结查询
mysql语句多表查询
1. 内联结⽤⼜称之为内部联结,是基于两个表 之间的的相等测试。如果不加过滤条件,会造成“笛卡尔积”。SELECT
vend_name,prod_name,prod_price FROM vendors INNER JOIN products ON vendors.vend_id=products.vend_id;同样可以使⽤WHERE进⾏多表联结查询,但是更推荐使⽤INNER JOIN等联结⽅式;
2. 外部联结包括左外联结LEFT JOIN和右外联结RIGHT JOIN和全连接FULL JOIN。例如查询每个客户的订单数:SELECT
customers.cust_ders_num FROM customers LEFT JOIN orders ON orders.cust_id =customers.cust_id;
LEFT JOIN 会全部返回左表数据,RIGHT JOIN会全部返回右表数据,FULL JOIN会将左右两个表的数据全部返回;
3. 联结查询与聚集函数⼀起使⽤。如查询每个客户的订单数:SELECT
customers.cust_name,customers.cust_id,der_num) AS num_ord FROM customers INNER JOIN orders ON customers.cust_id=orders.cust_id GROUP BY customers.cust_id;
组合查询
1. 多个查询(SELECT)可以使⽤UNION将多个查询结果进⾏合并成⼀个结果集返回,UNION必须包含两个及两个以上的SELECT查询,
并且每个传必须包含相同的列、表达式或聚集函数,数据类型不必完全相同,MySQL会进⾏隐式的类型转换。SELECT
vend_id,prod_id,prod_price FROM products WHERE prod_price>5 UINON SELECT vend_id,prod_id,prod_price FROM products WHERE vend_id IN (1001,1002);
borderlands 2价格2. UNION返回的是去重后的结果,如果不需要去重则可以使⽤UNION ALL;
3. 可以多组合查询使⽤ORDER BY进⾏排序,但是是针对的最终的结果集进⾏排序,⽽不是其中单个SELECT查询进⾏排序,因此对于
组合查询来说ORDER BY⼦句只有⼀个。SELECT vend_id,prod_id,prod_price FROM products WHE
RE prod_price>5 UINON SELECT vend_id,prod_id,prod_price FROM products WHERE vend_id IN (1001,1002) ORDER BY vend_id
使⽤函数对数据进⾏处理
1. 拼接列名:SELECT Concat (vendName,'(',vendCountry,')') FROM vendors ORDER BY vendName;
2. 执⾏算术表达式计算:SELECT prodId, quantity,price, quantity*price AS expandedPrice FROM orderItems;
3. ⽂本处理函数如Upper(),LTrim(),RTrim()等函数。⽐如使⽤Upper函数将⽂本转换成⼤写:SELECT vendName,
Upper(vendName) FROM vendors ORDER BY vendName;
4. 时间和⽇期处理函数,如Date(),Day()等。SELECT custId, orderNum FROM orders WHERE Date(orderDate)='2015-09-
01';
5. 数值处理函数,如Abs(),Cos()等;
6. 常⽤的聚集函数。如AVG(),COUNT(),MAX(),MIN()以及SUM()。SELECT COUNT(*) AS numbers, MIN(prod_price) AS
price_min, MAX(prod_price) AS price_max,AVG(prod_price) AS price_avg FROM products;
2.2 插⼊表数据
1. 向表中插⼊⾏数据可以使⽤INSERT INTO⼦句,更安全的⽅式是指定列名。INSERT INTO customers (cust_name, cust_email)
VALUES('happy','happy@gmail');在INSERT INTO⼦句中能够省略列名的前提条件是:该列可以允许定义为NULL值或者在定义该列时给出去了默认值;
2. 如果插⼊多⾏数据可以将多组值⽤逗号进⾏分隔即可。INSERT INTO customers (cust_name, cust_email)
VALUES('happy','happy@gmail'),('smart','smart@gmail');
3. 将查询出来的数据插⼊表中,可以使⽤INSERT SELECT语句。INSERT INTO customers(cust_id,cust_contact) SELECT
cust_id, cust_contact FROM customers WHERE cust_id>5;其中SELECT中可以带WHERE过滤条件;INSERT SELECT通常被⽤于复制表数据
2.3 更新表数据
1. 如果要更新表数据的话,使⽤UPDATE⼦句:UPDATE customers SET cust_name ='happy',cust_email='happy@gmail'
WHERE cust_id = 1001;
2. 注意:如果不加WHERE条件指定到某⼀⾏的话,会更新表中某⼀列全部的数据。
网上购物商城系统模板
2.4 删除表数据
1. 如果从表中删除数据的话,可以使⽤DELETE⼦句。DELETE FROM customers WHERE cust_id = 10086;删除的数据必定是表
中⾏数据,⽽不是某⼀列。因此,与UPDATE⼦句相⽐,DELETE⼦句并不需要指定是哪⼀列,⽽仅仅只需要指定具体的表名即可;
2. 注意:如果不添加WHERE指定条件的话,会将整个表中所有⾏数据全部删除。另外,DELETE只是删除表中的数据,⽽不会删除表结
构信息;
3. 如果想删除表中全部的数据,可以使⽤TRUNCATE,⽐DELETE删除效率更⾼;
3. SQL中关键字执⾏顺序
在SQL语句中每个关键字都会按照顺序往下执⾏,⽽每⼀步操作,会⽣成⼀个虚拟表,最后产⽣的虚拟表会作为执⾏的最终结果返回。下⾯的是常⽤的关键字的执⾏顺序:
(8)SELECT (9)DISTINCT(1)FROM (3) JOIN (2)            ON (4)WHERE (5)GROUP BY(6)WITH{CUBE|ROLLUP}(7)HAVING(10)ORDER BY(11)LIMIT
1. FROM:对FROM左边的表和右边的表计算笛卡尔积,产⽣虚表VT1;
2. ON:对虚拟表VT1进⾏ON筛选,只有那些符合条件的⾏才会被记录在虚拟表VT2中;
3. JOIN:如果是OUT JOIN,那么将保留表中(如左表或者右表)未匹配的⾏作为外部⾏添加到虚拟表VT2中,从⽽产⽣虚拟表VT3;
4. WHERE:对虚拟表VT3进⾏WHERE条件过滤,只有符合的记录才会被放⼊到虚拟表VT4;
5. GROUP BY:根据GROUP BY⼦句中的列,对虚拟表VT4进⾏分组操作,产⽣虚拟表VT5;
6. CUBE|ROLLUP:对虚拟表VT5进⾏CUBE或者ROLLUP操作,产⽣虚拟表VT6;
7. HAVING:对虚拟表VT6进⾏HAVING条件过滤,只有符合的记录才会被插⼊到虚拟表VT7中;
8. SELECT:执⾏SELECT操作,选择指定的列,插⼊到虚拟表VT8中;
9. DISTINCT:对虚拟表VT8中的记录进⾏去重,产⽣虚拟表VT9;
10. ORDER BY:将虚拟表VT9中的记录按照进⾏排序操作,产⽣虚拟表VT10
11. LIMIT:取出指定⾏的记录,产⽣虚拟表VT11,并将结果返回。
4. 索引
MySQL索引的建⽴对于MySQL的⾼效运⾏是很重要的,索引可以⼤⼤提⾼MySQL的检索速度。索引分单列索引和组合索引。单列索引,即⼀个索引只包含单个列,⽽组合索引,即⼀个索引包含多个列。
4.1 创建索引
创建索引有两种⽅式,⼀种是直接利⽤CREATE INDEX进⾏创建,另外⼀种则是通过修改表结构来进⾏添加,则是利⽤ALTER TABLE语句。
1. 使⽤CREATE INDEX
语法为:
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name  [USING index_type]  ON table_name (index_col_name,...)
大型门户网站
其中对应的语法变量信息如下:
[UNIQUE|FULLTEXT|SPATIAL]
其中括号中的这三个关键字表⽰创建的索引类型,它们分别表⽰唯⼀索引、全⽂索引、空间索引三种不同的索引类型。如果我们不指定任何关键字,则默认为普通索引。
index_name
index_name表⽰索引的名称,由⽤户⾃⾏定义,以便于以后对该索引进⾏修改等管理操作。
index_type
index_type表⽰索引的具体实现⽅式,在MySQL中,有两种不同形式的索引——BTREE索引和HASH索引。在存储引擎为MyISAM和InnoDB的表中只能使⽤BTREE,其默认值就是BTREE;在存储引擎为MEMORY或者HEAP的表中可以使⽤HASH和BTREE两种类型的索引,其默认值为HASH。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。