语句规范:
1:关键字与函数名称全部大写(命令语句“几乎”是大写实现的)
2:数据库名、表明、字段名称全部小写
3:SQL语句必须以分号结尾!!!!!
命令语句:
mysql -u用户名 -p密码 :登录
exit; 或者 quit; 或者\q :退出
prompt 提示符名称 :设置提示符号
SELECT VERSION(); :显示当前服务器版本
SELECT NOW(); :显示当前日期时间
SELECT USER(); :显示当前用户
{}:表示必须选择 []:表示可有可无 |:表示选择其一即可
创建数据库语法:CREATE {DATABASE|SCHEMA} [IF NOT EXISTS] table_name;
显示数据库:SHOW{DATABASES|SCHEMAS};
查看警告信息:SHOW WARNINGS;
修改数据库:ALTER {DATABASE|SCHEMA}db_name;
例如:修改数据库t1的编码方式
ALTER DATABASE t1 CHARACTER SET=utf8; 再使用SHOW CREATE DATABASE t1;即可查看现在的编 码方式
数据类型:
CHAR() :定长字符型
VERCHAR() :长度可变
FLOAT[(M,D)] :M表示数组总位数 D表示小数点后面的位数
DOUBLE[(M,D)] :M表示数组总位数 D表示小数点后面的位数
ENUM:枚举 例如:性别
SET:集合 可任意组合
删除数据库: DROP{DATABASE|SCHEMA}[IF EXISTS] db_name;
创建数据表:
第一步:通过 USE 数据库名称;命令打开某个数据库
第二步:创建列
CREATE TABLE[IF NOT EXISTS]table_name(
column_name data_type, //逗号是两行命令的分隔符 最后一行不用加
)
例如:CRAETE TABLE tb1(
username VERCHAR(20),
age TINYINT UNSIGNED, //unsigned表示无符号位
salary FLOAT(8,2) UNSIGNED )
第三步:查看 SHOW TABLES[FROM DB_TABLE]; //例如:SHOW TABLE FROM mysql;表示查看数据库这的所有数据表
查看数据表的结构:SHOW COLUMNS FROM table_name;
第四步:创建行(记录的插入与查找):
INSERT[INTO] tabl_name[(col_name,...)] VALUES(val,...) //若省略列名,则要为所有变量赋值
例如: INSERT tb1 VALUES('Tom',25,7863.25);
INSERT tb1(username,salary) VALUES('Kindy',7863.25);
记录的查找:SELECT exper,... FROM tbl_name; 例如:SELECT * FROM tb1; //表示查找所有表中的数据
删除数据表:
SHOW DATABASES; //查看有哪些数据库,假若有数据库db1
USE db1; //使用数据库db1
SHOW TABLES; //查看db1中的所有表
DROP TABLE 表名;
删除某一列:
NOT NULL:不可为空; 注:中间有空格;
自动编码:AUTO_INCREMENT 默认起始值为1,每次自增1,必须与主键结合使用
主键约束:PRIMARY KEY或KET (可以不使用自动编码) 唯一(每张数据表,每张数据表均可有自己的主键),自动为NOT NULL
唯一约束:UNIQUE KEY 一张数据表中可以多次出现该约束,子段可为null 约束后表中同一子段不可能出现多次赋同样的值
默认值:DEFAULT 没有赋值时会自动赋予默认值
例如:
第一步
CREATE TABLE td1(
id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
age TINYINT NOT NULL UNIQUE KEY,
sex ENUM('1','2','3') DEFAULT '3',
salary INT UNSIGNED
);
第二步:
INSERT td1(age,salary) VALUES (22,24); //sex默认赋值3
第三步:
INSERT td1(age,salary) VALUES (22,25); //此时就会报错,因为age设置了唯一约束,不可两次赋值一样
外键约束(完整性、一致性):FOREIGN KEYp
父表与子表使用相同的存储引擎(InnoDB);
外键列与参照列数据类型相同, 数值型:长度与符号相同 字符型:长度可以不同
编辑数据表默认存储引擎:my.ini文件 default-storage-engine=INNODB
例如:CREATE TABLE province(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
pname VARCHAR(20) NOT NULL); //注意V''A''RCHAR 不是e
)
CREATE TABLE users(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(10) NOT NULL,
pid BIGINT,
FOREIGN KEY(pid) REFERENCES provinces(id)); //此时会报错因为外键列(BIGINT)与参照列数据类型(SAMLLINT)不相同必须要改成 pid BIGINT UNSIGNED;才可 即是否有符号位也要一致
)
外键参数:
CASCADE:从父表中删除或更新时会同时自动删除或更新字表中匹配的该行的所有信息
SET NULL:从父表删除或更新行,并设置字表中的外键列为null,(字表列中不能有not null)
RESTRICT:拒绝对父表的删除或更新操作;(同NO ACTION)
第一步:将上例第二步修改
CREATE TABLE users(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(10) NOT NULL,
pid SMALLINT UNSIGNED,
FOREIGN KEY(pid) REFERENCES provinces(id) ON DELETE CASCADE);
第二步:INSERT provinces(pname)VALUES('A');
INSERT provinces(pname)VALUES('B');
INSERT provinces(pname)VALUES('C');
第三步:INSERT users(username,pid) VALUES('TOM',3);
INSERT users(username,pid) VALUES('TOKE',1);
第四步:DELETE FROM provinces WHERE id=3; //父表中删除记录后子表中不在有TOM全部的记录
##修改数据表字段##
1:******添加******:
添加单列:ALTER TABLE tbl_name ADD[COLUMN] col_name column_definition[FIRST|AFTER col_name]
// 可不写 列名 列描述 插入到第一行 插入到某行之后 省略则会加到最下面
添加多列(不能指定位置只能在原来表的最下方):ALTER TABLE tbl_name ADD[COLUMN] (col_name column_definition,...)
2:*****删除*****
删单行:ALTER TABLE tb_name DROP [COLUMN] col_name;
删单行:ALTER TABLE tb_name DROP [COLUMN] col_name,DROP [COLUMN] col_name..........;
3*****添加约束*****
ALTER TABLE tb_name ADD [CONSTRAINT [约束的名字]]PRIMARY KEY[index_type](想设为主键的列名,.....)
主键约束:
唯一约束:
外键约束:users2中的pid去参照provinces中的id
添加、删除默认约束:
ALTER TABLE tb_name ALTER [COLUMN] col_name{SET DEFAULT literal|DROP DEFAULT}
4:*****删除约束*****
删除主键约束:ALTER TABLE users2 DROP PRIMARY KEY; //不用加列名,因为任何一个表只有一个主键
删除唯一约束:ALTER TABLE tb_name DROP {INDEX|KEY} index_name;
第一步:SHOW INDEXES FROM users2\G; //可用于查看哪些有索引
第二步:
删除外键约束:此时一定要知道外键约束的名称(系统赋予的)(用SHOW CREATE TABLE users2;来查看)
ALTER TABLE tb_name DROP FOREIGN KEY 系统赋予的索引名;
##修改数据表的列定义(名、排序、定义)##
修改位置与定义:
ALTER TABLE tb_name MODIFY[COLUMN] col_name column_definition[FIRST|AFTER col_name];
//定义没有改变也要写 若修改也会随着相应变化
修改列名(也可修改定义与位置):change功能远远大于modify
ALTER TABLE tb_name CHANGE[COLUMN] old_col_name new_col_name column_definition[FIRST|AFTER col_name];
##修改数据表的名字##
方法一:ALTER TABLE tb_name RENAME [TO|AS] new_tb_name;
方法二:RENAME TABLE tb_name TO new_tb_name[,tb_name2 TO new_tb_name2].....
// [ ]表示可选 例如RENAME TABLE tb TO new_tb ,tb_name2 TO new_name2;
***********记录的操作**********
插入记录:
1: INSERT [INTO] tb_ame[(col_name,....){VALUES|VALUE}({表达式或默认值},....),(...),.. //若省略列名,则所有列均要依次赋值
2: INSERT db_name SET 属性=‘值’,属性=‘值’,属性=‘值’......
3:INSERT [INTO] tb_name[(col_name,....)] SELECT........ 将查找的结果插入到指定的表:
更新:UPDATE 表名 SET 表达式 [where.....];
例如:UPDATE users7 age=age+id WHERE id%2=0;
分组:[GROUP BY{col_name|position}[ASC|DESC],...]
分组条件:[HAVING where_condition]
SELECT sex FROM users7 GROUP BY sex HAVING age>10; //此时会报错,要么having后跟聚合函数(min ,max,平均值......)要么属性age也放到select语句中 SELECT sex,age FROM users7 GROUP BY sex HAVING age>10;
对查询结果进行排序:ORDER BY;
[ORDER BY{col_name|expr|position}[ASC|DESC],.....]
限制查询结果返回的数量:LIMIT SELECT中默认是从0开始编号的
删除:
1:单表删除 DELETE FROM t_name [WHERE where_condition]
*************子查询*************
求平均值:AVG() 例如:SELECT AVG(good_price) FROM db_goods;
对数值进行四舍五入:SELECT ROUND (AVG(good_price),2); //四舍五入保留到小数点后两位
SELECT good_id,good_name,good_price FROM db_goods WHERE good_price>=5000;
使用”子查询”将上述查询合并完成:SELECT good_id,good_name,good_price FROM db_goods WHERE good_price>=(SELECT ROUND (AVG(good_price),2););
ANY SOME ALL:
SELECT good_id,good_name,good_price FROM db_goods WHERE good_price>(SELECT good_price FROM db_good WHERE good_cat='超极本'); //此时会报错 子查询返回了多个结果 无法确定是哪个
SELECT good_id,good_name,good_price FROM db_goods WHERE good_price> ANY(SELECT good_price FROM db_good WHERE good_cat='超极本'); //此时只要大于子查询的最小值即可
SELECT good_id,good_name,good_price FROM db_goods WHERE good_price> ALL(SELECT good_price FROM db_good WHERE good_cat='超极本'); //此时只要大于子查询的最大值
*************连接*************
INNER JOIN:内连接 mysql中JOIN,CROSS JOIN 与INNER JOIN是等价的; 仅显示符合条件的信息
LEFT[OUTER] JOIN(显示左表中的全部及右表中符合条件的):左外连接;
RIGHT[OUTER] JOIN(显示右表中的全部及右表中符合条件的) :右外连接
例如(使用连接创建(事实)逻辑的外键):
第一步:创建一个商品表
第二步:查看有哪些分类
第三步:创建一个类别表并插入数据
注:创表和插入数据可以一步完成:
CREATE TABLE goods_cat(
cat_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
cat_name VARCHAR(20) NOT NULL
)SELECT cat_name FROM good GROUP BY good_cat;
第四步:使用外连接
查看表的结构,发现good_cat依然是VARCHAR类型,我们可以使用change修改表的物理结构:
ALTER TABLE good CHANGE good_cat cat_id SAMLLINT UNSIGNED NOUT NULL ;
自身连接:
第一步:创建无限分类数据表:
第二步:自身连接
##多表删除:
第一步:查看哪些重复
SELECT good_id,good_name FROM tb_good GROUP BY good_name HAVING count(good_name)>=2;
第二步:删除重复,保存编号小的
DELETE t1 FROM db_good AS t1 LEFT JOIN(SELECT good_id,good_nameFROM db_good GROUP BY good_name count(good_name)>=2)AS t2 ON t1.good_name=t2.good_name WHERE t1.good_name>t2.good_name;
#######字符函数#######
1:CONCAT():字符连接
2:CONCAT_WS():使用指定的分隔符进行连接
3:FORMAT():数组格式化
4:大小写转化:LOWER() UPPER()
5:获取字符串左侧字符右侧字符 LEFT() RIGHT()
6:LENGTH():取长 包含空格长度
7:LTRIM():删除前导空格 RTRIM:删除后续空格 删除特定字符串
8:SUBSTRING() :截取 程序中编号是从0开始,而mysql编号是1开始
9:REPLACE():替换
9:[NOT] LIKE:模式匹配 %:代表任意0个或多个字符 _:代表任意一个字符
注:寻找first_name中有%的first_name
SELECT * FROM test WHERE first_name LIKE'%1%%' ESCAPE '1';
10:数值运算符与函数运算符
CEIL():进以取整 FLOOR:舍一取整
DIV:整数除法:
MOD():取余数
POWER():幂运算
ROUND():四舍五入
TRUNCATE():数字截断
[NOT] BETWEEN ...AND...
[NOT]IN:
IS[]NOT] NULL:
时间日期:
信息函数:
CONNECTION_ID():返回当前连接的id
DATABASE():当前数据库
LAST_INSERT_ID():最后插入记录
USER():当前用户
VERSION():版本信息
加密函数:
MD5():信息摘要算法
PASSWORD():密码算法
修改自己的密码:SET PASSWORD=PASSWORD('dimitar'); //dimitar为新的密码
####自定义函数#########
删除函数:DROP FUNCTION [IF EXISTS] function_name;
创建:CREATE FUNCTION function_name RETURNS{STRING|INTEGER|REAL|DECIMAL} routine_body;
关于函数体:1:可有生SQL语句组成
2:可由简单的select或insert语句
3:若为复合结构需使用BEGIN...END...语句
4:复合结构可包含声明、循环、控制结构
将以上过程创建为一个不带参的函数:
创建带参函数可以计算两个数的平均值:
函数体里面有几个语句要执行时需要添加begin与end
####创建存储过程#########
IN:该值调用时必须指定:
OUT:该值可以被存储过程改变,并可返回
INOUT: 该参数调用时指定,并可改变与返回
1:创建不带参的存储过程:
调用:
2:创建一个带有IN类型的带参存储过程
###//发现数据表中的记录全部删除了 它默认为了两个字段 所用的以在给参数名字的时候不能跟数据表的重名
存储过程的修改只能修改注释、内容类型等简单的东西 无法修改方法体
此时需要修改方法体就只能删除存储过程,再重建
第一步:删除存储过程
第二步:为数据表插入数据
第三步:重建存储结构
3:创建带有IN与OUT类型参数的存储过程
3:创建带有多个out类型参数的存储过程
例如:根据年龄来删除用户,可以返回删除数与剩余数
修改存储引擎的方法:
1:修改配置文件
2:CREATE TABLE table_name(
)ENGINE=engine;
3:ALTER TABLE table_name ENGINE [=] engine_name;
注意:
一直出现“->”表示期待出现结束符号,只要输入“;”或其它的结束符号后语句没有问题,他会正确执行
赋别名(原名 AS 别名):别名可用于GROUP BY,ORDER BY或HAVING子句
SELECT id AS userid,username AS uname FROM users7;
ASC:升序 (默认) DESC:降序
=ANY 等价于 IN !=ALL(<>ALL)等价于NOT IN !=等价与<>
DELIMITER // :将分割;修改为//也可以为其他的
变量:
BEGIN...END 生成的变量为局部变量,只能在其语句块之间有效,语句块运行完后它就消失了
一、局部变量。
局部变量一般用在sql语句块中,比如存储过程的begin/end。其作用域仅限于该语句块,在该语句块执行完毕后,局部变量就消失了。
局部变量一般用declare来声明,可以使用default来说明默认值。
例如在存储过程中定义局部变量:
drop procedure if exists add;
create procedure add
(in a int,
in b int)
begin
declare c int default 0;
set c = a + b;
select c as c;
end;
在上述存储过程中定义的变量c就是局部变量
SET @I=7; //此时定义的为用户变量,是与客户端绑定的,设置的变量只对当前所使用的客户端生效
用户变量使用如下的方式定义:
@变量名
对用户变量赋值有两种方式,一种是直接用"="号,另一种是用":="号。其区别在于使用set命令对用户变量进行赋值时,两种方式都可以使用;当使用select语句对用户变量进行赋值时,只能使用":="方式,因为在select语句中,"="号被看作是比较操作符。
示例程序如下:
drop procedure if exists math;
create procedure math
(in a int,
in b int)
begin
set @var1 = 1;
set @var2 = 2;
select @sum:=(a + b) as sum, @dif:=(a - b) as dif;
end;
SELECT ROW_COUNT(); 得到插入、删除以及更新的被影响的记录总数
SHOE CREATE TABLE users7:用于查看数据表users7的创建命令
下载MYSQL管理工具:1:phpMyadmin 2:Navicat
3:MysqlWorkBench
UN:无符号位 NN:not null PK:主键 UQ:唯一约束 ZF:添加从0开始 AI:自动编号