MySQL
2024-04-18 16:30:41 0 举报
AI智能生成
MySQL
作者其他创作
大纲/内容
数据类型
整型
TINYINT <font color="#0076b3">1字节</font>
SMALLINT <font color="#0076b3">2字节</font>
MEDIUMINT <font color="#0076b3">3字节</font>
INT <font color="#0076b3">4字节</font>
BIGINT <font color="#0076b3">8字节</font>
浮点型
FLOAT [(M,D)]
M:数字总位数
D:小数点后的位数
<font color="#c41230">ps:M和D被省略则根据硬件<br> 允许的来保存数值</font>
日期时间型<br>括号内为存储需求
YEAR(1)
TIME(3)
DATE(3)
DATETIME(8)
TIMESTAMP(4)
字符型
CHAR(m) <font color="#0076b3">m字节, 0<=m<=255</font>
VARCHAR(m) <font color="#0076b3">L+1字节, L<=m且0<=m<=255</font>
TINYTEXT <font color="#0076b3">L+1字节, L<2^8</font>
TEXT <font color="#0076b3">L+3字节, L<2^16</font>
MEDIUMTEXT <font color="#0076b3">L+3字节, L<2^24</font>
LONGTEXT <font color="#0076b3">L+4字节, L<2^32</font>
ENUM('Value 1', 'Value2', ...) <font color="#0076b3">1或2字节, 最多枚举25535个</font>
SET('Value 1', 'Value2', ...) <font color="#0076b3">1,2,3,4或8字节, 取决于set成员数(最多64)</font>
约束
默认值 DEFAULT:
当插入记录时,如果没有明确字段赋值则自动赋予默认值。
例:<font color="#662c90"><i>CREATE TABLE tb4(..., ..., ..., sex ENUM('1', '2', '3') DEFAULT '3');</i></font>
主键约束 PRIMARY KEY:<br>
每张表只能存在一个主键
保证记录的唯一性
自动为 NOT NULL
唯一约束 UNIQUE KEY:
每张表可以存在多个唯一约束
保证记录的唯一性
可以为 NULL
例:<font color="#662c90"><i>CREATE TABLE tb4(id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,<br> name VARCHAR(20) NOT NULL UNIQUE KEY,<br> age TINYINT UNSIGNED);<br> INSERT tb4(name, age) VALUES ('Tom', 22);</i></font> <font color="#c41230">p.s:再写一条一样的tom会出错</font>
外键约束 FOREIGN KEYp
保持数据一致性和参照完整性
实现一对一或一对多的关系
要求
父表(被参照表)和子表(参照表)用相同的存储引擎,禁止使用临时表
引擎只能为InnoDB
外键列和参照列具有线割弄得数据类型<br>(数字的长度或是否有符号位这些必须相同,字符长度可以不同)
外键列和参照列必须创建索引,外键列索引没有的话MySQL会自动创建
修改引擎:在my.ini文件中改 default-strorage-engine=INNODB
外键约束的参照操作
CASCADE(级联):从父表删除/更新时自动删除/更新子表中匹配的行
SET NULL:从父表中删除/更新行,并设置子表外键为NULL(需要相应的子表列没有设置NOT NULL)
RESTRICT(拒绝):拒绝对父表进行删除/更新操作
NO ACTION(无动作):标准的SQL关键字,与RESRICT作用相同
例:在定义表时有这样一条语句(删除级联)<br><i><font color="#662c90">FOREIGN KEY (pid) REFERENCES province (id) ON DELETE CASCADE</font></i>
表级/列级约束:
列级约束:对一个数据列建立的约束(可以在列定义时声明也可以在列定义后声明,如上面tb4的主键)
表级约束:对多个数据列建立的约束(只可以在列定义后声明)
子查询
定义
定义:子查询(SubQuery)是指出现在其他SQL语句内的SLECT子句<br>例:<font color="#662c90"><i>SELECT * FROM t1 WHERE col=(SELECT col2 FROM t2);</i></font>
备注
子查询嵌套在查询内部,且必须始终出现在圆括号内
子查询可以包含多个关键字或条件<br>如 DISTINCT, GROUP BY, ORDER BY等<br>
子查询的外层查询可以是SELECT, INSERT, UPDATE, SET或DO
子查询可以返回标量、一行、一列或子查询
使用<u>比较运算符</u>的子查询<br>
比较运算符 operand:<br>=, <, >, >=, <=, <>, !=, <=><br>语法:<font color="#f15a23">operand comparison_operator subquery</font>
用ANY, SOME或ALL修饰的比较运算符
语法
<font color="#f15a23">operand comparison_operator ANY(subquery)</font>
<font color="#f15a23">operand comparison_operator SOME(subquery)</font>
<font color="#f15a23">operand comparison_operator ALL(subquery)</font>
例:<font color="#662c90"><i>SELECT goods_id, goods_name, goods_price FROM tdb_goods<br> WHERE goods_price >= ANY(SELECT goods_price FROM tdb_goods<br> WHERE goods_cate='超极本');</i></font>
返回值表
使用 [NOT] IN的子查询
语法:<font color="#f15a23">operand comparison_operator [NOT] IN (subquery)</font>
备注:“=ANY”运算符与 IN 等效<br> “!=ALL”或“<>ALL”运算符与 NOT IN 等效
INSERT ... SELECT 将查询结果写入数据表:<br><font color="#f15a23">INSERT [INTO] tbl_name [(col_name, ...)] <br>SELECT ...;</font><br>例:<font color="#662c90"><i>INSERT tdb_goods_cates(cate_name)<br> SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;</i></font>
连接
定义
MySQL在SELECT语句,多表更新,多表删除语句中支持JOIN操作
语法(表的参照关系):<br><font color="#f15a23">table_reference {[INNER | CROSS] JOIN | {LEFT | RIGHT} [OUTER] JOIN} table_reference <br>ON conditional_expr;</font><br><font color="#c41230">p.s:JOIN=CROSS JOIN=INNER JOIN<br> INNER表示内连接,LEFT/RIGHT OUTER表示左/右外连接</font><br>例:<font color="#662c90"><i>UPDATE tdb_goods INNER JOIN tdb_goods_cates ON goods_cate=cate_name<br> SET goods_cate=cate_id;</i></font>
内连接(INNER JOIN)<br>A与B的交集
ON 关键字设定连接条件,也可以用WHERE代替<br>通常用ON设定连接条件,用WHERE进行结果记录的过滤<br>例:查询所有商品的详细信息<br><font color="#662c90"><i>SELECT goods_id, goods_name, cate_name, brand_name,goods_price<br>FROM tdb_goods AS g<br>INNER JOIN tdb_goods_cates AS c ON g.cate_id=c.cate_id<br>INNER JOIN tdb_goods_brands AS b ON g.brand_id=b.brand_id\G;</i></font>
外连接
左外连接(LEFT JOIN):显示左表全部的记录以及右表符合条件的记录
右外连接(RIGHT JOIN):显示右表全部的记录以及左表符合条件的记录
多表连接(两张表以上的连接)<br>参照内连接例子的写法
自身连接<br>(无限级分类表设计)
同一数据表对其自身进行连接(想象有相同的一张表当左表或右表进行多表连接)<br>例:<font color="#662c90"><i>SELECT s.type_id, s.type_name, p.type_name<br> FROM tdb_goods_types AS s<br> LEFT JOIN tdb_goods_types AS p<br> ON s.parent_id=p.type_id;</i></font>
关于连接的说明
A LEFT JOIN B join_condition
表B结果集依赖表A
A的结果集根据左连接条件依赖所有数据表(B除外)
左外连接条件决定如何检索表B(没有WHERE)
如果A的某条记录符合WHERE条件,但在B不存在符合条件的记录,<br>将生成所有列为空的额外B行
如果用内连接查找的记录在连接数据表中不存在,且在WHERE子句中尝试以下操作:<br>col_name IS NULL时,如果col_name被定义为NOT NULL,<br>MySQL将在符合连接条件的记录后停止搜索更多行
运算符和函数
一些内置函数和运算符
字符函数
例:<font color="#662c90"><i>1)</i></font><i>SELECT CONCAT('imooc', '-', 'MySQL'); =>imooc-MySQL<br> 2)SELECT CONCAT(first_name, last_name) AS fullname FROM test; </i><font color="#c41230">#first_name和last_name是列名</font><br><i> 3)SELECT CONCAT_WS('|', 'A', 'B', 'C'); =>A|B|C </i><font color="#c41230">#第一个是指定分隔符</font><br><i> 4)SELECT LOWER('MySQL'); =>mysql</i><br><i> 5)SELECT LEFT('MySQL', 2); =>My </i><font color="#c41230">#2代表位数</font><br><i> 6)SELECT LOWER(LEFT('MySQL', 2)); =>my </i><font color="#c41230">#函数嵌套<br><br> </font><font color="#662c90">7)SELECT TRIM(' MySQL '); =>MySQL </font><font color="#c41230">#去掉了空格</font><br><font color="#662c90"> 8)SELECT LENGTH(LTRIM(' MySQL ')); =>8</font><br><font color="#662c90"> 9)SELECT TRIM(LEADING '?' FROM '???MySQL??'); =>MySQL??</font><br><font color="#662c90"> SELECT TRIM(TAILING '?' FROM '???MySQL??'); =>???MySQL</font><br><font color="#662c90"> SELECT TRIM(BOTH '?' FROM '???MySQL??'); =>MySQL</font><br><font color="#662c90"> 10)SELECT REPLACE('??My??SQL???', '?', ''); =>MySQL </font><font color="#c41230">#将?替换成了空字符</font><br><font color="#662c90"> SELECT REPLACE('??My??SQL???', '?', '!!'); =>!!!!My!!!!SQL!!!!!!</font><br><font color="#662c90"> SELECT REPLACE('??My??SQL???', '??', '!'); =>!My!SQL!?</font><br><font color="#662c90"> 11)SELECT SUBSTRING('MySQL', 1, 2); =>My </font><font color="#c41230">#1表示起始位置,2表示截取长度,长度不指定则截取到最后</font><br><font color="#662c90"> SELECT SUBSTRING('MySQL', 3); =>SQL</font><br><font color="#662c90"> SELECT SUBSTRING('MySQL', -1); =>L</font><br><font color="#662c90"> 12)SELECT * FROM test WHERE first_name LIKE '%o%'; =>Tom%</font><br><font color="#662c90"> SELECT * FROM test WHERE first_name LIKE '%1%%' ESCAPE '1'; =>Tom% </font><font color="#c41230">#告诉其1后面的%不是通配符</font>
数值运算符及其函数
例:<font color="#662c90"><i>1)SELECT 3+4; =>7<br> 2)SELECT CEIL(3.01); =>4<br> SELECT FLOOR(3.01); =>3<br> 3)SELECT POWER(3, 3); =>27<br> 4)SELECT ROUND(3.652, 1); =>3.7<br> 5)SELECT TRUNCATE(125.89, 1); =>125.8</i></font>
比较运算符及函数
例:<font color="#662c90">1)SELECT 5 BETWEEN 1 AND 22; =>1 </font><font color="#c41230">#1表示true</font><br><font color="#662c90"> 2)SELECT 10 IN (5, 10, 15, 20); =>1</font><br><font color="#662c90"> 3)SELECT NULL IS NULL; =>1</font><br><font color="#662c90"> 4)SELECT '' IS NULL; =>0 </font><font color="#c41230">#0表示false</font>
日期时间函数
例:<font color="#662c90">1)SELECT DATE_ADD('2018-4-5', INTERUAL 365 DAY); =>2019-4-5 </font><br><font color="#662c90"> </font><font color="#c41230">#与365 DAY相似的表达还有1 YEAR; 3 WEEK; 2 MONTH等</font><br><font color="#662c90"> SELECT DATE_ADD('2018-4-5', INTERUAL -365 DAY); =>2017-4-5</font><br><font color="#662c90"> 2)SELECT DATEDIFF('2018-4-5', '2019-4-5'); =>-365</font><br><font color="#662c90"> 3)SELECT DATE_FORMAT('2018-4-5', '%m/%d/%Y'); =>04/05/2018</font>
信息函数
聚合函数
例:<font color="#662c90"><i>SELECT AUG(goods_price) AS AUG_PRICE FROM tdb_goods;</i></font>
加密函数
例:<font color="#662c90"><i>1)SELECT MD5('admin');<br> 2)SET password=PASSWORD('dimitar'); </i></font> <font color="#c41230">#改密码</font>
MySQL自定义函数
定义
用户自定义函数(user-defined function,UDF)是一种对MySQL扩展的途径,其语法和内置函数类似
两个必要条件
参数
返回值
可以返回任意类型的值,同样也可以接收任意类型的参数
创建自定义函数
语法:<br><font color="#f15a23">CREATE FUNCTION function_name<br>RETURNS<br>{STRING | INTERGER | REAL | DECIMAL}<br>routine_body;</font>
p.s
routine_body是函数体
函数体有合法的SQL语句构成
函数体可以是简单的SELECT或INSERT语句
函数体如果为复合结构则使用<font color="#f15a23">BEGIN ... END</font>结构体
复合结构可以还包含声明、循环、控制结构
创建不带参数的自定义函数<br>例:<font color="#662c90"><i>CREATE FUNCTION f1()<br> RETURNS VARCHAR(30)<br> RETURN DATE_FORMAT(NOW(), '%y年%m月%d月 %H点%i分%s秒');</i></font>
创建带有参数的自定义函数<br>例:<font color="#662c90"><i>CREATE FUNCTION f2(num1 SMALLINT UNSIGNED, num2 SMALLINT UNSIGNED)<br> RETURNS FLOAT(10, 2) UNSIGNED<br> RETURN (num1+num2)/2;</i></font>
创建复合结构的自定义函数<br>例:<font color="#662c90"><i>DELIMITER //<br> CREATE FUNCTION adduser(username VARCHAR(20))<br> RETURNS INT UNSIGNED<br> BEGIN<br> INSERT test(username) VALUES(username);<br> RETURN LAST_INSERT_ID();<br> END //<br> DELIMITER ;</i></font>
删除自定义函数
语法:<br><font color="#f15a23">DROP FUNCTION [IF EXISTS] function_name;</font>
<font color="#5c5c5c">简单的操作</font>
停止/启动MySQL服务<br>
<i><font color="#662c90">net stop mysql</font></i>
<i><font color="#662c90">net start mysql</font></i>
MySQL登录与退出
登录(参数)
-D, --database=name 打开指定数据库
--delimiter=name 指定分隔符
-h, --host=name 服务器名称
-p, --password[=name] 密码
-P, --port=# 端口号
--prompt=name 设置提示符
-u, --user=name 用户名
-V, --version 输出版本信息并退出
举例
登录:<i><font color="#662c90">mysql -uroot -p -P3306 -h</font></i>
修改提示符
mysql> <i><font color="#662c90">prompt \u@\h \D></font></i>
<font color="#c41230">p.s:\D 完整日期<br> \d 当前数据库<br> \h 服务器名称<br> \u 当前用户</font>
退出MySQL的三种方式
<font color="#662c90"><i>exit;</i></font>
<font color="#662c90"><i>quit;</i></font>
<font color="#662c90"><i>\q;</i></font>
操作数据库
打开数据库:<br><font color="#f15a23">USE db_name;</font><br><font color="#000000">例:</font><i>USE TEST;</i>
创建数据库:<br><font color="#f15a23">CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name<br>[DEFAULT] CHARACTER SET [=] charset_name;</font><br><font color="#000000">例:</font><i>CERATE DATABASE t1;</i>
查看当前服务器下的数据表列表:<br><font color="#f15a23">SHOW {DATABASE | SCHEMAS} [LIKE 'pattern' | WHERE expr];</font><br><font color="#000000">例:</font><i>SHOW DATABASE;</i>
修改数据库:<br><font color="#f15a23">ALTER {DATABASE | SCHEMA} [db_name]<br>[DEFAULT] CHARACTER SET [=] charset_name;</font>
删除数据库:<br><font color="#f15a23">DROP {DATABASE | SCHEMA} [IF EXISTS] db_name;</font>
数据表操作
定义:数据表(或表)是数据库的重要组成部分,为其他对象的基础
创建表:<br><font color="#f15a23">CREATE TABLE [IF NOT EXISTS] table_name(colum_name data_type, ...);</font><br><font color="#000000">例:</font><i><font color="#662c90">CREATE TABLE tb1(username VARCHAR(20),<br> userage TINYINT UNSIGNED,<br> salary FLOAT(8,2) UNSIGNED);</font></i>
AUTO_INCREMENT:自动编号且须与主键(primary key)组合使用,默认起始为1,每次增1,自动编号可以不用赋值<br>例:<i><font color="#662c90">CREATE TABLE tb3(id SMALLINT UNSIGNED AUTO_INCREMENT <u>PRIMARY KEY</u>,<br> username VARCHAR(30) <u>NOT NULL</u>);</font></i>
空值与非空<br>
<i><font color="#662c90">NULL</font></i>
<i><font color="#662c90">NOT NULL</font></i>
插入记录(INSERT):<br><font color="#f15a23">INSERT [INTO] tbl_name [(col_name, ...)] VALUES (Val, ...);</font><br><font color="#000000">例:</font><i>INSERT tb1(username, userage, salary) VALUES ('Jhon', 25, 10000);</i>
<font color="#f15a23">INSERT [INTO] tbl_name [(col_name, ...)] {VALUES | VALUE}</font><br><font color="#f15a23">({expr | DEFAULT}, ...), (...), ...; <br></font><font color="#c41230">p.s:col_name省略的话默认为要全部字段都赋值</font><br><font color="#000000">如果有一张表的第一个字段为:id SMALLINT PRIMARY KEY NOT NULL AUTO_INCREMENT<br>则可以赋值如 INSERT tbl VALUES (<u>NULL</u>, 'Tom', '123', 25);<br> INSERT tbl VALUES (<u>NULL</u>, 'Jhon', '456', 21); 这样的话就不会影响AUTO_INCREMENT的值</font>
<font color="#f15a23">INSERT [INTO] tbl_name SET col_name={expr | DEFAULT};</font><br><font color="#c41230">p.s:和上面的语句相比,这条语句可以使用子查询(SubQuery)</font><br>例:<i><font color="#662c90">INSERT users SET username='Bam', password='456', sex=1;<br> INSERT test SELECT username FROM users WHERE password='456';</font></i>
<font color="#f15a23">INSERT [INTO] tbl_name [(col_name, ...)] SELECT ...;</font><br>此语句可以将查询结果插入到指定的数据表
更新记录(UPDATE):
单表更新:<br><font color="#f15a23">UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET<br>col_name1={expr1 | DEFAULT} [, col_name2={expr2 | DEFAULT}] ...<br>[WHERE where_condition];</font><br>例:<font color="#662c90"><i>UPDATE users SET age=age+5, sex=0;<br> UPDATE users SET age=age+10 WHERE id%2=0;</i></font>
多表更新:<br><font color="#f15a23">UPDATE tbl_references SET col_name1={expr1 | DEFAULT} [, col_name2={expr2 | DEFAULT}, ...]<br>[WHERE where_condition];</font>
一步到位多表更新:<br>创建数据表的同时将查询结果写入到数据表(CREATE ... SELECT)<br><font color="#f15a23">CREATE TABLE [IF NOT EXISTS] tdl_name [(create_definition, ...)] select_statement;</font>
删除记录(DELETE):
单表删除:<br><font color="#f15a23">DELETE FROM tbl_name [WHERE where_condition];</font> <br><font color="#c41230">p.s:在where表达式中可以使用MySQL支持的函数或运算符</font><br>例:<i><font color="#662c90">DELETE FROM users WHERE id=6;</font></i>
多表删除:<br><font color="#f15a23">DELETE tbl_name1[.*] [, tbl_name2[.*], ...]<br>FROM tbl_references [WHERE where_condition];</font><br>例:<font color="#662c90"><i>DELETE t1 FROM tdb_goods AS t1<br> <u>LEFT JOIN</u> (SELECT goods_id, goods_name<br> FROM tdb_goods<br> GOUP BY goods_name HAVING count(goods_name) >= 2) AS t2<br> ON t1.goods_name=t2.goods_name<br> WHERE t1.goods_id > t2.goods_id;</i></font>
查找(SELECT):<br><font color="#f15a23">SELECT expr, ... FROM tbl_name;</font>
完整的select语句:<br><font color="#f15a23">SELECT select_expr [, select_expr ...]<br>[ FROM table_references<br> [WHERE where_condition]<br> [GROUP BY {col_name | position} [ASC | DESC], ...]<br> [HAVING where_condition]<br> [ORDER BY {col_name | expr | position} [ASC | DESC], ...]<br> [LIMIT {[offset, ] row_count | row_count OFFSET offset}]<br> ];</font><br>
查询表达式每一个表示想要的一列,多列间用逗号分隔
“*”表示所有列,tbl_name.* 可以命名所有列
查询表达式可以用 [AS] alias_name 为其赋予别名
别名可以用于 ORDER BY, GROUP BY 或 HAVING子句
查询结果分组(GROUP BY):<br><font color="#f15a23">[GROUP BY {col_name | position} [ASC | DESC], ...];</font><br> 列名 位置 升序 降序<br>例:<font color="#662c90"><i>SELECT name FROM users GROUP BY id DESC;</i></font> (不写的话默认为升序)
分组条件(HAVING):<br><font color="#f15a23">[HAVING where_condition];</font><br><font color="#c41230">p.s:having后加聚合函数</font><br>例:<font color="#662c90"><i>SELECT name,age FROM users GROUP BY id HAVING age>10;<br> SELECT sex FROM users GROUP BY id HAVING count(id)>=2;</i></font>
对查询结果进行排序(ORDER BY):<br><font color="#f15a23">[ORDER BY {col_name | expr | position} [ASC | DESC], ...];</font><br>
限制查询结果返回的数量(LIMIT):<br><font color="#f15a23">[LIMIT {[offset, ] row_count | row_count OFFSET offset}];</font><br>例:<font color="#662c90"><i>SELECT * FROM users LIMIT 2;<br> SELECT * FROM users LIMIT 2,2;</i></font> (第一个2为下标从0开始的第2行,与升降序无关;第二个2为返回两条结果)
修改数据表<br>(ALTER)
说明:ALTER命令是对<u>建立好的数据表</u>进行修改
数据表更名:
方法1:<br><font color="#f15a23">ALTER TABLE tbl_name RENAME [TO | AS] new_tbl_name;</font>
方法2:<br><font color="#f15a23">RENAME TABLE tbl_name TO new_tbl_name;</font>
添加列:
添加单列:<br><font color="#f15a23">ALTER TABLE tbl_name ADD [COLUMN] col_name<br>col_definition [FIRST | AFTER col_name];</font><br><font color="#c41230">p.s:first为插入成为第一列;after col_name插入到指定的列后面</font><br>例:<font color="#662c90"><i>ALTER TABLE user1 ADD age<br> TINYINT UNSIGNED NOT NULL AFTER name;</i></font>
添加多列(在现有的最后一列后面添加新列):<br><font color="#f15a23">ALTER TABLE tbl_name ADD [COLUMN] (col_name, col_definition);</font>
删除列:<br><font color="#f15a23">ALTER TABLE tbl_name DROP [COLUMN] col_name;</font><br>例:<font color="#662c90"><i>ALTER TABLE user1 DROP name, age;</i></font>
修改列:
修改列定义:<br><font color="#f15a23">ALTER TABLE tbl_name MODIFY [COLUMN] col_name<br>column_definition [FIRST | AFTER col_name];</font><br>例:<font color="#662c90"><i>ALTER TABLE user2 MODIFY id<br> SMALLINT UNSIGNED NOT NULL FIRST;</i></font>
修改列名称(功能比修改列定义高一级):<br><font color="#f15a23">ALTER TABLE tbl_name CHANGE [COLUMN]old_col_name<br>new_col_name col_definition [FIRST | AFTER col_name];</font>
添加约束:
添加主键约束:<br><font color="#f15a23">ALTER TABLE tbl_name ADD [CONSTRAINT [symbol] ]<br>PRIMARY KEY [index_type] (index_rol_name);</font><br>例:<font color="#662c90"><i>ALTER TABLE user2 ADD CONSTRAINT PK_user2_id<br> PRIMARY KEY(id);</i></font>
添加唯一约束:<br><font color="#f15a23">ALTER TABLE tbl_name ADD [CONSTRAINT [symbol] ]<br>UNIQUE [INDEX | KEY] [index_name] [index_type]<br>(index_col_name, ...);</font>
添加外键约束:<br><font color="#f15a23">ALTER TABLE tbl_name ADD [CONSTRAINT [symbol] ]<br>FOREIGN KEY [index_name] (index_col_name, ...) reference_definition;</font><br>例:<font color="#662c90"><i>ALTER TABLE user2 ADD FOREIGN KEY (pid) REFERENCES (id);</i></font>
添加默认约束DEFAULT:<br><font color="#f15a23">ALTER TABLE tbl_name ALTER [COLUMN] col_name {SET DEFAULT literal};</font><br>例:<font color="#662c90"><i>ALTER TABLE user2 ALTER age SET DEFAULT 15;</i></font>
删除约束:
删除主键约束:<font color="#f15a23">ALTER TABLE tbl_name DROP PRIMARY KEY;</font>
删除唯一约束:<br><font color="#f15a23">ALTER TABLE tbl_name DROP {INDEX | KEY} index_name;</font><br>例:<font color="#662c90"><i>ALTER TABLE user2 DROP INDEX name;</i></font>
删除外键约束:<br><font color="#f15a23">ALTER TABLE tbl_name DROP FOREIGN KEY fk_name;</font> <br><font color="#c41230">p.s:可以用 'SHOW CREATE TABLE tbl_name' 命令查看外键名</font><br>例:<font color="#662c90"><i>ALTER TABLE user2 DROP FOREIGN KEY user2_ibfk_1;</i></font>
删除默认约束:<font color="#f15a23">ALTER TABLE tbl_name ALTER [COLUMN] col_name {DROP DEFAULT};</font>
SQL存储过程
过程
定义与特点
存储过程(procedure)是SQL语句和控制语句的预编译集合,<br>以一个名称存储并作为一个单元处理,只在第一次进行语句分析和编译,之后调用结果即可
特点
增强SQL语句的功能和灵活性
实现较快的执行速度
减少网络流量
创建存储过程:<br><font color="#f15a23">CREATE<br>[DEFINER={user | CURRENT_USER}] </font><font color="#5c5c5c">(默认为当前用户)</font><br><font color="#f15a23">PROCEDURE sp_name ([proc_parameter [, ...] ])</font><br><font color="#f15a23">[characteristic ...] routine_body;<br>例:</font><font color="#662c90"><i>CREATE PROCEDURE sp1()<br> SELECT VERSION();</i></font><br><br><font color="#c41230">p.s:<br>proc_parameter定义为</font><br><font color="#f15a23">[IN | OUT | INOUT] param_name type<br></font><font color="#c41230">过程体的语法结构和函数体要求相似,<br>routine_body里面如果要写多条语句则放到 </font><font color="#f15a23">BEGIN ... END</font><font color="#c41230"> 结构体里面</font>
IN:输入input,该参数值在调用存储过程时指定<br>例:<font color="#662c90"><i>DELIMITER // #修改分隔符为 // 免得和 ; 冲突<br> CREATE PROCEDURE removeUserById (IN D_id INT UNSIGNED)<br> BEGIN<br> DELETE FROM user WHERE id=D_id;<br> END //<br> DELIMITER ; #改回 ; 为分隔符<br> <br> CALL removeUserById(3);</i></font>
OUT:输出output,该参数值可以被存储过程改变且可以返回<br>例:<font color="#662c90"><i>创建带有多个OUT类型参数的存储过程<br> DELIMITER //<br> CREATE PROCEDURE rmUserByIdAndRetInfos<br> (IN p_age SMALLINT UNSIGNED, <br> OUT deleteUsers SMALLINT UNSIGNED, <br> OUT userCounts SMALLINT UNSIGNED)<br> BEGIN<br> DELETE FROM users WHERE age=p_age;<br> SELECT ROW_COUNT() INTO deleteUsers;<br> SELECT COUNT(id) FROM users INTO userCounts;<br> END //<br> DILIMITER ;</i></font><br><br> <font color="#662c90"><i>CALL rmUserByAgeAndRetInfos(20, @delu, @count);<br> SELECT @delu, @count;</i></font>
INOUT:该参数在调用是指定且可以被改变和返回<br>例:<font color="#662c90"><i>DELIMITER //<br> CREATE PROCEDURE rmUserAndRetNums <br> (IN p_id INT UNSIGNED, OUT userNums INT UNSIGNED)<br> BEGIN<br> DELETE FROM users WHERE id=p_id;<br> SELECT count(id) FROM users INTO userNums;<br> END //<br> DELIMITER ;<br><br> CALL rmUserAndRetUserNums(18, <u>@nums</u>);<br> SELECT @nums;</i></font>
MySQL变量
局部变量:<br>作用范围在begin和end之间,在语句块里面设置
用户变量:<br>以“@”开始,形式为“@变量名”<br>用户变量和MySQL客户端绑定,仅仅对当前使用客户端有效
全局变量
定义语法
set GLOBAL 变量名
set @@global.变量名
对所有客户端生效,只有具有super权限才能设置该变量
会话变量:只对连接的客户端生效<br>
declare语句专门定义局部变量,set语句是设置不同类型的变量包括会话变量和全局变量
调用存储过程
<font color="#f15a23">CALL sp_name ([parameter [, ...] ]);</font><br><font color="#000000">例:</font><font color="#662c90"><i>CALL sp1();</i></font>
<font color="#f15a23">CALL sp_name [()];</font><br><font color="#000000">例:</font><font color="#662c90"><i>CALL sp1;</i></font>
存储过程和函数的区别
插入表格截图
MySQL存储引擎
简介
MySQL可以将数据以不同技术存储在文件(内存)中,这种技术成为存储引擎<br>每种存储引擎使用不同的存储机制、索引技巧、锁定水平,最终提供广泛且不同的功能
MySQL存储引擎分类
MyISAM
InnoDB
Memory<br>
CSV
Archive
并发处理
并发控制:当多个连接对记录进行修改是保证数据的一致性和完整性<br> (例如A、B两人同时浏览一个商品,A要买走商品,而B也想买,怎样解决?用到锁系统)
锁系统
共享锁(读锁):同时间段内,多个用户可读取同一资源,过程中数据不变化
排它锁(写锁):在任何时候只能有一个用户写入资源,当进行写锁是会阻塞其他读锁或写锁的操作
锁颗粒(锁的粒度)
表锁(开销最小)
行锁(开销最大)
事物处理
事务:保证数据库的完整性,是数据库区别于文件系统的重要特征之一<br> 例:A转200元给B,事务要实现 ①从A中减去200元(A的余额大于等于200);②B的账户中减去200元
特征(ACID)
原子性A
一致性C
隔离性I
持久性D
外键和索引
外键:保证数据一致性的策略
索引:是对数据表中一列或者多列的值进行排序的一种结构(快速定位和访问表中信息)<br>
修改存储引擎的几种方法
修改MySQL配置文件my.ini实现:<br><font color="#f15a23">default-strorage-engine=engine</font><br>例:<i><font color="#662c90">default-strorage-engine=InnoDB</font></i>
通过穿件数据表命令实现:<br><font color="#f15a23">CREATE TABLE tbl_name<br>(...<br> ...<br>)ENGINE=engine;</font><br>例:<font color="#662c90"><i>CREATE TABLE tb1(S1 VACHAR(10)) ENGINE=MyISAM;</i></font>
通过修改数据表命令实现:<br><font color="#f15a23">ALTER TABLE tbl_name ENGINE [=] engine_name;</font><br>例:<font color="#662c90"><i>ALTER TABLE tb1 ENGINE InnoDB;</i></font>
各种存储引擎的特点
插入表格截图
0 条评论
下一页