赞
踩
目录
ROUND(column|expression, n) 函数
TRUNCATE(column|expression,n) 函数
唯一索引(当为一个表分配了唯一性约束时,这个表就自带唯一索引了)
CREATE TABLE 表名(列名 类型,列名 类型......);
show tables;
DROP TABLE 表名;
ALTER TABLE 旧表名 RENAME 新表名;
ALTER TABLE 表名 CHANGE COLUMN 旧列名 新列名 类型;
ALTER TABLE 表名 MODIFY 列名 新类型;
ALTER TABLE 表名 ADD COLUMN 新列名 类型;
ALTER TABLE 表名 DROP COLUMN 列名;
ALTER TABLE 表名 ADD PRIMARY KEY(列名)
ALTER TABLE 表名 DROP PRIMARY KEY;
注意: 删除主键时,如果主键列具备自动增长能力,需要先去掉自动增长,然后再删除主键。
- ALTER TABLE 表名 ADD CONSTRAINT 约束名FOREIGN KEY(列名)
- REFERENCES 参照的表名(参照的列名);
ALTER TABLE 表名 DROP FOREIGN KEY 约束名;
ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE(列名);
ALTER TABLE 表名 DROP KEY 约束名;
ALTER TABLE 表名 MODIFY 列名 类型 NOT NULL;
ALTER TABLE 表名 MODIFY 列名 类型 NULL;
SHOW KEYS FROM 表名;
示例:创建 depts 表包含 department_id 该列为主键且自动增长, department_name 列不 允许重复,location_id 列不允含有空值。
- create table depts(department_id int primary key auto_increment,
- department_name varchar(30) unique,
- location_id int not null);
INSERT INTO 表名(列名 1 ,列名 2 ,列名 3.....) VALUES(值 1 ,值 2 ,值 3......);
INSERT INTO 表名 VALUES(值 1 ,值 2 ,值 3......);
注意: 如果主键是自动增长,需要使用 default 或者 null 或者 0 占 位。
CREATE TABLE 表名(列名 类型 default 默认值,......);
在 MySQL 中可以使用 DEFAULT 为列设定一个默认值。如果在插入 数据时并未指定该列的值,那么 MySQL 会将默认值添加到该列 中。
ALTER TABLE 表名 ADD COLUMN 列名 类型 DEFAULT 默认值;
示例: 修改 emp3 表,添加job_id 该列默认值为 0。
如果在插入数据时并未指定该列的值,那么MySQL 会将默认值添加 到该列中。如果是 完全项插入需要使用 default 来占位。
UPDATE 表名 SET 列名=值,列名=值 WHERE 条件;
注意: 更新语句中一定要给定更新条件,否则表中的所有数据都会被 更新。
DELETE FROM 表名 WHERE 条件;
注意: 在DELETE语句中,如果没有给定删除条件则会删除表中的所有 数据。
TRUNCATE TABLE 表名;
用 SELECT 语句来显示表的指定列,指定列名之间用逗号分隔。
如果算术表达式包含有一个以上的运算,乘法和除法先计算。如果 在一个表达式中的运算符优先级相同,计算从左到右进行。可以用圆括号强制其中 的表达式先计算。
0 是一个数字,而空格是一个字符。包含空值的算术表达式计算结果为空。
SELECT 列名 AS 列别名 FROM 表名 WHERE 条件;
SELECT 表别名.列名 FROM 表名 as 表别名 WHERE 条件;
SELECT DISTINCT 列名 FROM 表名;
SELECT * | 投影列 FROM 表名 WHERE 选择条件;
符号 != 也能够表示 不等于条件。
可以用 BETWEEN 范围条件显示基于一个值范围的行。指定的范围包含一个下限和一个上限。
包含上限和下限,是闭区间。
NULL 条件,包括 IS NULL 条件和 IS NOT NULL 条件。
IS NULL 条件用于空值测试。空值的意思是难以获得的、未指定 的、未知的或者不适用的。因此,你不能用 = ,因为 null 不能等于 或不等于任何值。
可使用圆括号改变优先规则。
如果使用了 ORDER BY 子句,它必须位于 SQL 语句的最后。
SELECT 语句的执行顺序如下:
也可以排序一个不在select列表中的列。
举例:
- SELECT ROUND(45.923,-1);--->50
- SELECT ROUND(45.923,-2);--->0
- SELECT ROUND(55.923,-2);--->100
- SELECT TRUNCATE(45.923,0);--->45
- SELECT TRUNCATE(45.923,-1);--->40
- SELECT TRUNCATE(45.923,-2);--->0
- SELECT TRUNCATE(345.923,-2);--->300
- SELECT TRUNCATE(345.923,-3);--->0
在MySQL中允许直接使用字符串表示日期,但是要求字符串的日期 格式必须为:‘YYYY-MM-DD HH:MI:SS’ 或者‘YYYY/MM/DD HH:MI:SS’。
隐式数据类型转换是指MySQL服务器能够自动地进行类型转换。
显示数据类型转换是指需要依赖转换函数来完成相关类型的转换。
多表查询分类 sql92标准:
等值连接特点:
注意: 等值连接也被称为简单连接 (simple joins) 或内连接 (inner joins)。
等值连接的使用
SELECT 子句指定要返回的列名:
----- employee last name、employee number 和 department number,这些是 EMPLOYEES 表中的列
----- department number、department name 和 location ID, 这些是 DEPARTMENTS 表中的列
FROM 子句指定数据库必须访问的两个表:
------ EMPLOYEES 表
----- DEPARTMENTS 表
WHERE 子句指定表怎样被连接:
EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID,因为 DEPARTMENT_ID 列 是两个表的同名列,它必须用表名做前缀以避免混淆。
添加查询条件:除连接之外,可能还要求用 WHERE 子句在连接中限制一个或多个表中的行。
表别名定义原则
图片中的例子连接 EMPLOYEES 表到它自己。为了在 FROM 子句中 模拟两个表,对于相同的表 EMPLOYEES,用两个别名,分别为 worker 和 manager。在该例中,WHERE 子句包含的连接意味着 “一个工人的经理号匹配该经理的雇员号”。
连接只能发生在两个表中有相同名字和数据类型的列上。如果列有相同的名字,但 数据类型不同,NATURAL JOIN 语法会引起错误。
语法:
所谓的外连接指的是什么,就是当我们查询到匹配的结果集以外的数据,除了显示查到匹配的结果集,还能显示除了它以外的那些不匹配的数据,就叫外连接。到底显示谁的表当中不匹配的数据,那看你用的是左外还是右外,以及表示在左面还是右面。
孤儿数据指被连接的列的值为空的数据。指的就是那些不匹配的数据,在外连接当中所查到的那些不匹配的数据。
左边的表 (EMPLOYEES) 中即使没有与 DEPARTMENTS 表中匹配的 行,该查询也会取回 EMPLOYEES 表中所有的行。
右边的表 (DEPARTMENTS ) 中即使没有与 EMPLOYEES 表中匹配的 行,该查询也会取回 DEPARTMENTS 表中所有的行。
注意: MySQL 中不支持 FULL OUTER JOIN 连接
可以使用 union 实现全完连接。
语法结构
- (SELECT 投影列 FROM 表名 LEFT OUTER JOIN 表名 ON 连接条件)
- UNION
- (SELECT 投影列 FROM 表名 RIGHT OUTER JOIN 表名 ON 连接条件)
聚合函数也称之为多行函数,组函数或分组函数。聚合函数不象单行函数,聚合函数对行的分组进行操作,对每组给出一个结果。如 果在查询中没有指定分组,那么聚合函数则将查询到的结果集视为 一组。
1,聚合函数的类型
2,聚合函数说明
3,聚合函数使用方式
使用聚合函数的原则
AVG(arg)函数
对分组数据做平均值运算。 arg:参数类型只能是数字类型。
SUM(arg)函数
对分组数据求和。 arg:参数类型只能是数字类型。
MIN(arg)函数
求分组中最小数据。 arg:参数类型可以是字符、数字、 日期。
MAX(arg)函数
求分组中最大数据。 arg:参数类型可以是字符、数字、 日期。
返回分组中的总行数。
COUNT 函数有三种格式:
在组函数中使用 IFNULL 函数
SELECT AVG(IFNULL(commission_pct, 0)) FROM employees;
在没有进行数据分组之前,所有聚合函数是将结果集作为一个大的信息组进行处理。但是,有时,则需要将表的信息划分为较小的组,可以用 GROUP BY 子句实现。
原则
下面是包含一个 GROUP BY 子句 SELECT 语句的求值过程:
SELECT 子句指定要返回的列:
在 EMPLOYEES 表中的部门号
WHERE 子句指定被返回的行。因为无 WHERE 子句默认情况下 所有行被返回。
GROUP BY 子句指定行怎样被分组。行用部门号分组,所以 AVG 函数被应用于薪水列,以计算每个部门的平均薪水。
下面是图 片中的 SELECT 语句中包含一个 GROUP BY 子句时的求值过程:
SELECT 子句指定被返回的列:
FROM 子句指定数据库必须访问的表:EMPLOYEES 表。
GROUP BY 子句指定你怎样分组行:
如此 SUM 函数被用于每个部门号分组中的所有 job ID 的 salary 列。
HAVING 子句是对查询出结果集分组后的结果进行过滤。
用 WHERE 子句约束选择的行,用 HAVING 子句约束组。为了找到 每个部门中的最高薪水,而且只显示最高薪水大于 $10,000 的那些 部门,可以像下面这样做:
- SELECT department_id, MAX(salary) FROM
- employees GROUP BY department_id HAVING
- MAX(salary)>10000 ;
子查询语法
子查询是一个 SELECT 语句,它是嵌在另一个 SELECT 语句中的子 句。使用子查询可以用简单的语句构建功能强大的语句。
可以将子查询放在许多的 SQL 子句中,包括:
单行子查询是从内查询返回一行的查询。在该子查询类型中用一个 单行操作符。
子查询返回多行被称为多行子查询。对多行子查询要使用多行运算符而不是单行运算符。
ANY 运算符
ANY 运算符比较一个值与一个子查询返回的每一个值。
ALL 运算符比较一个值与子查询返回的每个值。
NOT 运算符可以与 IN运算符一起使用。
内查询返回的值含有空值,并因此整个查询无返回行,原因是用大 于、小于或不等于比较Null值,都返回null。所以,只要空值可能是 子查询结果集的一部分,就不能用 NOT IN 运算符。NOT IN 运算符 相当于 <> ALL。
注意,空值作为一个子查询结果集的一部分,如果使用 IN 操作符的 话,不是一个问题。IN 操作符相当于 =ANY。
- SELECT emp.last_name FROM employees emp WHEREemp.employee_id
- IN (SELECT mgr.manager_id FROM employees mgr);
MySQL中的索引类型
是最基本的索引,它没有任何限制。在创建索引时,可以指定索引 长度。length 为可选参数,表示索引的长度,只有字符串类型的字段才能指定索引长度,如果是 BLOB 和 TEXT 类型,必须指定 length。
创建索引时需要注意: 如果指定单列索引长度,length 必须小于这个字段所允许的最大字符个数。
SHOW INDEX FROM table_name;
CREATE INDEX index_name ON table(column(length));
column是列名,如果想指定长度就table(column(n)),不知道长度就直接table(column)。
ALTER TABLE table_name ADD INDEX index_name(column(length));
- CREATE TABLE `table` (
- COLUMN TYPE ,
- PRIMARY KEY (`id`),
- INDEX index_name (column(length))
- );
示例:
DROP INDEX indexname ON tablename;
唯一索引与普通索引类似,不同的就是: 索引列的值必须唯一,但 允许有空值。
CREATE UNIQUE INDEX indexName ON table(column(length));
ALTER TABLE table_name ADD UNIQUE indexName(column(length));
- CREATE TABLE `table` (
- COLUMN TYPE ,
- PRIMARY KEY (`id`),
- UNIQUE index_name (column(length))
- );
不能为一个没有分配主键约束的列去创建主键索引。
在做数据查询时,有这样一句话,能用主键作为条件判断的,一定要用主键来作为条件判断。它的效率非常高,因为主键自带主键索引。
主键索引是一种特殊的唯一索引,一个表只能有一个主键,不允许 有空值。一般是在建表的时候同时创建主键索引。
ALTER TABLE 表名 ADD PRIMARY KEY(列名);
- CREATE TABLE `table` (
- COLUMN TYPE ,
- PRIMARY KEY(column)
- );
组合索引是指使用多个字段创建的索引,只有在查询条件中使用了 创建索引时的第一个字段,索引才会被使用(最左前缀原则)。
最左前缀原则 —— 就是最左优先。
如: 我们使用表中的 name ,address ,salary 创建组合索引,那 么想要组合索引生效, 我们只能使用如下组合:
name/address/salary
name/address
name/
如果使用 addrees/salary 或者是 salary 则索引不会生效。
- ALTER TABLE table_name ADD INDEX index_name
- (column(length),column(length));
- CREATE TABLE `table` (
- COLUMN TYPE ,
- INDEX index_name
- (column(length),column(length))
- );
原子性(ATOMICITY)
一致性(CONSISTENCY)
隔离性(ISOLATION)
持久性(DURABILITY)
显式事务
需要我们手动的提交或回滚。 DML 语言中的所有操作都是显示事务操作。DML 语句当中,所有的操作都是显示事务操作。
隐式事务
数据库自动提交不需要我们做任何处理,同时也不具备回滚性。 DDL、DCL 语言都是隐式事务操作
在mysql当中,他对于DML操作的默认的事务时自动提交的,也就是说,当你去执行一个inserti update delete,并没有在一个事务的范围内去控制,因为没有开启一个事务的话,它默认的都是提交的。都是默认自动commit的,那一旦被commit了说明什么,说明以及被持久化处理了。
如果不想自动提交怎么办?先关闭mysql对于DML操作的自动提交,把需要手动提交的DML语句放到一个事务当中就可以了。怎么放到事务当中?先开启一个事务 start transation,从它下面所有的DML语句都不会自动提交,都需要手动提交。
举例:
创建account账户表,包含id、卡号、用户名、余额。
- create table account(
- id int primary key auto_increment,
- cardnum varchar(20) not null,
- username varchar(30) not null,
- balance double(10,2)
- );
向account表中插入两条数据。
- insert into account(cardnum,username,balance)
- VALUES('123456789','张三',2000);
- insert into account(cardnum,username,balance)
- VALUES('987654321','李四',2000);
在一个事务中完成转账业务。
- START TRANSACTION
- update account set balance = balance-200
- where cardnum = '123456789';
- update account set balance = balance+200
- where cardnum = '987654321';
- select * from account;
—— 当我们关闭数据库重新打开后,张三和李四的账户余额并没发生任何变化。
—— 这是因为当我们使用“START TRANSACTION”开启一个 事务后,该事务的提交方式不再是自动的,
—— 而是需要手动提交,而在这里,我们并没有使用事务提交语句COMMIT,
—— 所以对account表中数据的修改并没有永久的保存到数据库中,也就是说我们的转账事务并没有执行成功
—— 提交转账事务
commit;
—— 事务的回滚让数据库恢复到了执行事务操作前的状态。
—— 需要注意的是事务的回滚必须在事务提交之前,因为事务 一旦提交就不能再进行回滚操作。
rollback;
指一个事务读取了另外一个事务未提交的数据。
A事务读取B事务尚未提交的数据,此时如果B事务发生错误并执行 回滚操作,那么A事务读取到的数据就是脏数据。
在一个事务内读取表中的某一行数据,多次读取结果不同。
是指在一个事务内读取到了别的事务插入的数据,导致前后读取数量总量不一致。
事务的隔离级别用于决定如何控制并发用户读写数据的操作。数据 库是允许多用户并发访问的,如果多个用户同时开启事务并对同一 数据进行读写操作的话,有可能会出现脏读、不可重复读和幻读问 题,所以MySQL中提供了四种隔离级别来解决上述问题。
事务的隔离级别从低到高依次为:
隔离级别越低,越能支持高并发的数据库操作。
SELECT @@transaction_isolation;
对当前session有效。
- set session transaction isolation level read uncommitted;
- set session transaction isolation level read committed;
- set session transaction isolation level repeatable read;
- set session transaction isolation level serializable;
在公司里不能让所有人都是用root账号,这样会造成权限泛滥。对于mysql也是很不安全的,在真正的环境当中,mysql的root用户只给一个人,就是公司的DBA——数据库管理员。
MySQL 是一个多用户的数据库系统,按权限,用户可以分为两种: root 用户,超级管理员,和由 root 用户创建的普通用户。
CREATE USER username IDENTIFIED BY 'password';
SELECT USER,HOST FROM mysql.user;
新用户创建完后是无法登陆的,需要分配权限。
GRANT 权限 ON 数据库.表 TO 用户名@登录主机 IDENTIFIED BY "密码"
登陆主机:
%:创建用户时,如果没有指定登陆权限,那它默认的就百分号,表示可以匹配所有的主机,意思就是:我们的mysql服务端启动以后,如果这个用户的权限是%,那这个用户可以在任何使用ip地址的设备当中去链接mysql服务端,如果说现在要远程连接一个mysql,mysql服务器在一个设备当中,我现在要通过navicat去连接它,而这个navicat它不在这个mysql服务器中,是在另一个设备当中,他们ip不一样,那这样可不可以用navicat连接mysql呢?可以的。但是要求你连接的用户,它的登录主机必须得是%,因为%表示的是可以在任意的ip下去链接mysql的服务端。
localhost:表示现在你的客户段,只能链接本机的mysql服务端。现在我登录的是root账号,也就意味着,现在我想在另一个设备当中去连接我的本机的这个mysql,我用toot是连不了的。因为root的host权限是localhost,只能本机去连。
那如果我想用我的设备以外的设备能去连接这个用toot用户连接的mysql怎么办?必须要对root用户重新授权,把它的连接权限host改成%就可以了。
127.0.0.1:可以指定具体的id,来指定用户的连接mysql的具体连接权限。
权限列表
- GRANT ALL PRIVILEGES ON *.* TO
- 'username'@'localhost' IDENTIFIED BY'password'
每当调整权限后,通常需要执行以下语句刷新权限。
FLUSH PRIVILEGES;
DROP USER username@localhost;
分页查询就是在查询的结果集当中去取固定的条数的数据,比如说我现在查询的数据有1000条,但是我不全取,我只取前十条,这就叫分页查询。为什么要这样做,为了我们的界面。
MySQL 分页查询原则:
SELECT 投影列 FROM 表名 WHERE 条件 ORDER BY LIMIT 开始位置,查询数量;
SELECT 投影列 FROM 表名 WHERE 条件 ORDER BY LIMIT 查询数量 OFFSET 开始位置;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。