目录
0.1 检索不同的行,即:要求查询的数据不同,关键字:distinct
0.7 sql中实现计算,依据截图的例子,可以实现:+ - * /
0.8 WITH ROLLUP,在group by分组+聚合计算时,使用该关键字,汇总所有分组项的值;
二:DDL:就是对数据库内部的对象进行创建、删除、修改的操作语言
0 : sql语句常用关键字说明
0.1 检索不同的行,即:要求查询的数据不同,关键字:distinct
SELECT DISTINCT vend_id,prod_price FROM products;
值得注意的是:distinct 必须直接放在列名的前面,不能用于*,在聚合函数中,distinct只可用于count,格式:count(distinct 列),distinct关键字应用于所有列而不仅是前置它的列。如果给出SELECT DISTINCT vend_id, prod_price,除非指定的两个列都不同,否则所有行都将被检索出来;
0.2 限制结果条数,关键字:limit
#从第一行开始,查5行
SELECT DISTINCT vend_id,prod_price FROM products
LIMIT 5;
#从第3行开始,查5行
SELECT DISTINCT vend_id,prod_price FROM products
LIMIT 3,5;
值得注意的是:1.带一个值的LIMIT总是从第一行开始,给出的数为返回的行数;2. 带两个值的LIMIT可以指定从行号为第一个值的位置开始,获取条数为第二个数值;
0.3 结果排序,关键字 order by
SELECT prod_id,prod_price,prod_name
FROM products
ORDER BY prod_price DESC,prod_name;
#prod_price列指定DESC,对prod_name列不指定。因此,prod_price列以降序排序,而prod_name列(在每个价格内)仍然按标准的升序排序
值得注意的是:根据上面sql, 多个行具有相同的prod_price 值时才对产品按prod_name进行排序。如果prod_price列中所有的值都是唯一的,则不会按prod_name排序;
默认:asc (升序), 可以指定 desc(降序)排序;
limit 和 order by 结合,可以查询某列最大或最小值(如:price);和max,min查询结果一致;
0.4 多条件过滤的连接,关键字:and / or
值得注意的是:在处理OR操作符前,优先处理AND操作符
0.5 模糊匹配,关键字:like,结合通配符:%,_
0.6 正则表达式实现模糊,关键字:REGEXP,结合正则
#匹配字段prod_name包含1000
SELECT prod_name FROM products WHERE prod_name REGEXP '1000'
ORDER BY prod_name;
#匹配字段prod_name包含000,注意:.是正则表达式语言中一个特殊的字符。它表示匹配任意一个字符
SELECT prod_name FROM products WHERE prod_name REGEXP '.000'
ORDER BY prod_name;
#为搜索两个串之一,使用|
SELECT prod_name FROM products WHERE prod_name REGEXP '1000|2000'
ORDER BY prod_name;
#匹配几个字符之一,[123]定义一组字符,它的意思是匹配1或2或3,事实上,正则表达式[123]Ton为[1|2|3]Ton的缩写
SELECT prod_name FROM products WHERE prod_name REGEXP '[123] ton'
ORDER BY prod_name;
#匹配范围:集合可用来定义要匹配的一个或多个字符,可使用-来定义一个范围,如:[a-z]匹配任意字母字符
SELECT prod_name FROM products WHERE prod_name REGEXP '[1-5] ton [a-z]'
ORDER BY prod_name;
[: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])
^ 文本的开始
$ 文本的结尾
[[:<:]] 词的开始
[[:>:]] 词的结尾
#另一个例子。这次我们打算匹配连在一起的4位数字
SELECT prod_name FROM products
WHERE prod_name REGEXP '[[:lower:]]{4}'
ORDER BY prod_name;
#例如,如果你想找出以一个数(包括以小数点开始的数)开始的所
#有产品,怎么办?简单搜索[0-9\\.](或[[:digit:]\\.])不行,因为
#它将在文本内任意位置查找匹配。解决办法是使用^定位符
SELECT prod_name FROM products WHERE prod_name REGEXP '^[0-9\\.]'
ORDER BY prod_name;
0.7 sql中实现计算,依据截图的例子,可以实现:+ - * /
0.8 WITH ROLLUP,在group by分组+聚合计算时,使用该关键字,汇总所有分组项的值;
一:sql规范
1.SQL语句不区分大小写;建议命令大写,表名库名小写;但字符串常量区分大小写,
课外知识:select now():查询出当前时间:格式:2019-04-27 10:18:10
2.SQL语句可单行或多行书写,已“;”结尾。关键字不可跨多行或简写;
3.用空格或者缩进来提高语句的可读性,子句通常位于独立行,便于编辑,提高可读性;
例如:
4.注释:单行注释:--
多行注释:/*……*/
5.DDL,DML,DCL;(定义语言,操作语言、控制语言)这三部分共同构成了sql语言;
二:DDL:就是对数据库内部的对象进行创建、删除、修改的操作语言
1.创建数据库:
CREATE DATABASE dbname;
2. 查看已有数据库:show databases,
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| cluster |
| mysql |
| test |
| test1 |
+--------------------+
5 rows in set (0.00 sec)
还有另外 4 个数据库,它们都是安装
MySQL 时系统自动创建的,其各自功能如下。
information_schema:主要存储了系统中的一些数据库对象信息。比如用户表信息、列信
息、权限信息、字符集信息、分区信息等。
cluster:存储了系统的集群信息。
mysql:存储了系统的用户权限信息。
test:系统自动创建的测试数据库,任何用户都可以使用
3.在查看了系统中已有的数据库后,可以用如下命令选择要操作的数据库:
USE dbname;
4.删除数据库:
drop database dbname;
5.创建表:
CREATE TABLE tablename (column_name_1 column_type_1 constraints,
column_name_2 column_type_2 constraints , ……column_name_n column_type_n
constraints);
因为 MySQL 的表名是以目录的形式存在于磁盘上,所以表名的字符可以用任何目录名允许的字符。
column_name 是列的名字,column_type 是列的数据类型,contraints 是这个列的约束条件‘;
例如,创建一个名称为 emp 的表。表中包括 3 个字段,ename(姓名),hiredate(雇用日期)、
sal(薪水),字段类型分别为 varchar(10)、date、int(2);
mysql> create table emp(ename varchar(10),hiredate date,sal decimal(10,2),deptno int(2));
6.删除表:
DROP TABLE tablename;
7.修改表:
(1)修改字段:ALTER TABLE tablename MODIFY [COLUMN] column_definition [FIRST | AFTER col_name];
如:修改表 emp 的 ename 字段定义,将 varchar(10)改为 varchar(20):
mysql> alter table emp modify ename varchar(20);
(2)新增字段:ALTER TABLE tablename ADD [COLUMN] column_definition [FIRST | AFTER col_name]
例如,表 emp 上新增加字段 age,类型为 int(3):
mysql> alter table emp add column age int(3);
(3)删除表字段:ALTER TABLE tablename DROP [COLUMN] col_name
例如,将字段 age 删除掉:
mysql> alter table emp drop column age;
(4)字段改名,语法如下:
ALTER TABLE tablename CHANGE [COLUMN] old_col_name column_definition [FIRST|AFTER col_name]
例如,将 age 改名为 age1,同时修改字段类型为 int(4):
mysql> alter table emp change age age1 int(4) ;
(5)修改表名,语法如下:
ALTER TABLE tablename RENAME [TO] new_tablename
例如,将表 emp 改名为 emp1,命令如下:
mysql> alter table emp rename emp1;
三、DML
主要包括表记录的插入(insert)、更新(update)、删除(delete)和查询(select),是开发人员日常使用最频繁的操作;
查询:子查询:
select * from emp where deptno in(select deptno from dept);
如果子查询记录数唯一,还可以用=代替 in
mysql> select * from emp where deptno = (select deptno from dept);
某些情况下,子查询可以转化为表连接,例如:
mysql> select emp.* from emp ,dept where emp.deptno=dept.deptno;
四、DCL
DCL 语句主要是 DBA 用来管理系统中的对象权限时所使用,一般的开发人员很少使用。