标签:restrict 记录 表连接 左连接 注意 outer 简单的 _for str
1. 修改密码
mysqladmin -u root -p password 123456 //修改密码为123456
2. 进入mysql
mysql -u root -p
3. 显示数据库
show databases
4. 创建school数据库
create database school;
5. 使用数据库
use 数据库名
6. 创建表格
CREATE TABLE demo(
->id int PRIMARY KEY AUTO_INCREMENT,
->name char(20) NOT NULL,
->age int);
7. 显示表格
show tables;
8. 插入数据
insert into demo (id,name,age) values(1, "mike", 19);
9. 查看插入的内容
select * from demo;
10. 显示表格信息
//方法一
desc demo;
//方法二
show columns from demo;
11. 增加列操作
alter table demo add hobby char(20); //加的列在表的最后面
alter table demo add qq int after age; //加在某列的前面
alter table demo add mail char(30) first; //加在列的最前面
12. 删除列操作
alter table demo drop hobby;
13. 修改列
alter table 表名 modify 列名 新类型 新参数 //修改列类型
alter table 表名 change 旧列名 新列名 新类型 新参数 //修改列名和列类型
14. 删除数据库
drop database 数据库名
15. 查看数据库存储引擎
show engines;
//support列为YES表示引擎可用,DEFAULT表示数据库当前默认的引擎
16. 改变列的顺序
alter table demo modify id int first; //修改顺序为第一位
alter table demo modify mail char after hobby; //移动到其他列的后面
17. 删除
delete from demo where name="mike";
18. 修改
update demo set id=1 where name="mike";
19. 查找
select * from demo; //*代表所有列
select * from demo where id=1; //查询单行
select * from demo where id>1; //多行查询
select name,mail from demo where id>=1; //指定列查找
20. 投影运算和广义运算
取出部分列叫投影运算
取出部分列作运算叫广义运算
select id,name,age+1 from demo
21. 比较运算符
between and 在某范围内
between 100 and 500
int<4,11> 在某集合内
and
not in
where <price between 100 and 300> or <price between 400 and 500>;
select * from demo where 0;
select * from demo where 1;
22. null查询
select *from demo where qq is null;
select *from demo where qq is not null;
null的特性不利于优化,一般设置为not null
23. group分组与统计函数
//count求行
select count(*) from demo;
//avg求平均值
select avg(age) from demo;
//sum求和
select sum(age) from demo;
//min求最大
//max求最小
//group
select max(price),cat_id from goods group by cat_id;
24. as取别名
select id,name,age-id as z from demo;
25. having
select id,name,qq-age as sheng from demo having sheng>200;
26. 约束
a>. 约束保证数据的完整性和一致性。
b>. 约束分为表级约束和列级约束。
c>. 约束类型包括:
NOT NULL(非空约束)
PRIMARY KEY(主键约束)
UNIQUE KEY(唯一约束)
DEFAULT(默认约束)
PROEIGN KEY(外键约束)
外键约束
保持数据一致性,完整性。
实现一对一或一对多的约束。
外键约束的要求
a>. 父表和子表必须使用相同的存储引擎,而且禁止使用临时表。
b>. 数据表的存储引擎只能为InnoDB。
c>. 外键列和参照列必须具有相似的数据类型。其中数字的长度或是否有符号位必须相同,而字符的长度则可以不同。
d>. 外键列和参照列必须创建索引。如果外键列不存在索引的话,mysql将自动创建索引。
编辑数据表的默认存储引擎
MySQL配置文件:
default-storage-engine=INNODB
外键约束的参照操作
a>. CASCADE:从父表删除或更新且自动删除或更新子表中匹配的行
b>. SET NULL:从父表删除或更新行,并设置子表中的外键列为NULL。如果使用该选项,必须保证子表列没有指定NOT NULL。
c>. RESTRICT:拒绝对父表的删除或更新操作。
d>. NO ACTION:标准SQL关键字,在mysql中与RESTRICT相同。
表级约束和列级约束
对一个数据列建立的约束,称为列级约束。
对多个数据列建立的约束,称为表级约束。
列级约束既可以在列定义时声明,也可以在列定义后声明。
表级约束只能在列定义后声明。
添加主键约束
alter table 表名 add primary key (列名);
添加外键约束
alter table 表名 add foreign key (外键列) references 参照表 (参照列);
添加唯一约束
alter table 表名 add unique key (列名);
添加默认约束
alter table 表名 set default 默认值;
删除默认约束
alter table 表明 drop default;
查索引与查约束
SHOW INDEX //查索引
SHOW INDEXES //查约束
删除主键约束
alter table 表名 drop primary key;
删除唯一约束
alter table 表名 drop index 列名; //注意删除的是约束不是字段
删除外键约束
alter table 表名 foreign key 外键别名(constraint);
27. 修改列定义
alter table 表名 modify 列名 数据类型 其他属性
alter table 表名 change 列名 新列名 数据类型 其他属性
28. 表重命名的两种方法
alter table 表名 rename 新表名
rename table 表名 to 新表名
29. 记录操作
插入记录
insert 表名 列名称(可省略) values|value (可以一次插入多条记录)
insert 表名 set 值 (只能一次插入单条记录) //与第一种的区别在于,此方法可以使用子查询(SubQuery)
insert 表名 select //此方法可以将查询结果插入到指定数据表
删除记录
delete from 表名 where 条件 //若省略where,所有记录都将删除
更新记录(单表更新)
update 表名 set 更新的列值 where 条件 //若省略where,所有记录都将更新
查找记录
select version(); //查看mysql版本
select now(); //查看当前时间
select id,name from info;
select name,age from info where id>=2;
select info.id,info.name from info; //有多张表时可以清楚使用
30. as别名
select id as userId, username as uname from info;
31. where条件表达式
< > = % * / 函数等待
32. 查询结果分组(GROUP BY)
select sex from info group by sex; //通过性别分组
分组条件
select age from info having age > 16;
对结果进行排序(ORDER BY)
select * from info order by id desc; //id号降序排列
限制结果返回的数量(LIMIT)
select * fom info LIMIT 2;
insert test(name) select name from info where age>30
33. 子查询与连接
set names gbk; //以gbk编码显示客户端
子查询
指出现在其他SQL语句内的select子句。
子查询只嵌套在查询内部,且必须始终出现在圆括号内。
子查询可以包含多个关键字或条件,如:DISTINCT, GROUP BY, LIMIT,函数等。
子查询的外层查询可以是:SELECT, INSERT, UPDATE, SET或DO。
子查询可以返回标题,一行,一列或子查询。
使用比较运算符的子查询
=, >, <, >=, <=, <>, !=, <=>
语法结构
operand comparison_operator subquery;
AVG()未平均值
select ROUND(AVG(price), 2) FROM goods; //平均值留两位小数,四舍五入
使用[NOT] IN的子查询
语法结构:
operand comparison operator [NOT] IN (subquery) = ANY运算符与IN等效。
!=ALL 或<>ALL运算符与NOT IN等效。
使用[NOT] EXISTS的子查询(用的比较少)
若子查询返回任何行,EXISTS将返回TRUE;否则返回FALSE。
34. 将查询结果写入数据表
INSERT [INTO] 表名 [(列名,...)] SELECT ...
35. 多表更新
连接类型:
INNER JOIN 内连接
在mysql中,JOIN,CROSS JOIN和INNER JOIN是等价的。
LEFT[OUTER] JOIN,左外连接
RIGHT[OUTER] JOIN,右外连接
UPDATE tdb_goods INNER JOIN tdb_goods_cates ON goods_cate=cate_name SET goods_cate=cate_id;
INNER JOIN是内连接
是更新表内部与参照表中的对照。
ON是条件
SET是修改成什么样的值 。
36. CREATE....SELECT
创建数据表同时将查询结果写入到数据表。
```sql
CREATE TABLE tdb_brands
(
brand_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
brand_name VARCHAR(40) NOT NULL
)
SELECT brand_name FROM tdb_goods GROUP BY brand_name;
UPDATE tdb_brands INNER JOIN tdb_goods ON tdb_brands.brand_name=tdb_goods.brand_name set tdb_brands.brand_name=tdb_goods.brand_id;
``
在联合修改后有nma->id类型和名字要跟着改变一样
用alter change
alter table tdb_goods change good_cate cate_id SMALLINT UNSIGNED NOT NULL,
change brand_name brand_id smallint unsigned not null;
37. 连接
语法结构
JOIN
INNER JOIN:内链接和交叉连接等价,都是笛卡尔积运算。
CROSS JOING:交叉连接
LEFT [OUTER] JOIN 左连接:是根据最左表的记录,在被连接右表中找出符合条件的记录与之匹配,找不到与左表匹配的,用null填充。
RIGHT [OUTER] JOIN 右连接:是根据是右表的记录,在被连接左表中找出符合条件的记录与之连接,找不到与右表匹配的,用null填充。
连接条件
使用ON关键字来设定连接条件,
使用WHERE关键字进行结果集记录的过滤。
LEFT JOIN:显示左表全部和左右符合连接条件的记录。
RIGHT JOIN:显示左右符合连接条件的记录和右表全部记录。
如果使用LEFT JOIN,左表中存在一条记录A,在右表中没有找到相应的记录,则在返回结果用会出现一条只有记录A中的相应字段内容,其他字段都为NULL在记录(RIGHT JOIN类似。
38. 查询所有商品的详细信息(通过左外连接实现)
SELECT goods_id,goods_name,cate_name,brand_name,goods_price FROM tdb_goods AS g LEFT JOIN tdb_goods_cates AS c ON g.cate_id=c.cate_id LEFT JOIN tdb_goods_brands AS b ON g.brand_id=b.brand_id\G;
39. 查询所有商品的详细信息(通过右外连接实现)
SELECT goods_id,goods_name,cate_name,brand_name,goods_price FROM tdb_goods AS g RIGHT JOIN tdb_goods_cates AS c ON g.cate_id=c.cate_id RIGHT JOIN tdb_goods_brands AS b ON g.brand_id=b.brand_id\G;
40. 多表连接
SELECT col_name1,col_name2,col_name3,col_name4,col_name5 FROM tbl_name1 AS t1 INNER JOIN tbl_name2 AS t2 ON join_condition INNER JOIN tbl_name3 AS t3 ON join_condition\G;
SELECT goods_id,goods_name,cate_name,brand_name,goods_price FROM tdb_goods AS g
->INNER JOIN tdb_goods_cate AS c ON g.cate_id=c.cate_id
->INNER JOIN tdb_goods_brands AS b ON g.brand_id=b.brand_id\G;
连接三个表联合显示查询结果,注意不同的INNER JOIN中间没有逗号!!!没有逗号!!!没有逗号!!!
显示的结果和商品表tdb_goods的记录一样,不过之前是通过单表的查询来显示,这次是通过三张表的连接来显示。
多表的连接实际上是外键的逆向约束。外键把数据分开存储,多表连接又把数据联系在一起。
41. 外连接
A LEFT JOIN B join_condition
数据表B的结果集依赖数据表A。
数据表A的结果集根据左连接条件依赖所有数据表(B表除外)
左外连接条件决定如何检索数据表B(在没有制定WHERE条件的情况下)
如果数据表A的某条记录符合WHERE条件,但是在数据表B不存在符合连接条件的记录,将生成一个所有列为空的额外的B行。
如果使用内连接查找的记录在连接数据库表中不存在,并且在WHERE子句中尝试以下操作:col_name IS NULL时,如果col_name被定义为NOT NULL,mysql将在找到符合连执着条件的记录后停止搜索更多的行。
42. 自身连接
同一个数据表对其自身进行连接。
SELECT s.type_id, s.type_name, p.type.name AS parent_name FROM tdb_goods_types AS s LEFT JOIN tdb_goods_types AS p
-> ON s.parent_id=p.type_id;
注意自身连接一定要用别名,其中s代表son子表,p代表parent父表,同时为了显示出一样商品不存在父类的这种情况要用LEFT JOIN而不能用INNER JOIN。
查找所有分类及其父类
SELECT s.type_id, s.type_name, p.type_name FROM tdb_goods_types AS s LEFT JOIN tdb_goods_types AS p ON s.parent_id=p.type_id;
查找所有分类及其子类
SELECT p.type_id,p.type_name FROM tdb_goods_types AS p LEFT JOIN tdb_goods_types AS s ON s.parent_id=p.type_id;
查找所有分类及其子类的数目
SELECT p.type_id, p.type_name,count(s.type_name) AS children_count FROM tdb_goods_types AS p LEFT JOIN tdb_goods_types AS s ON s.parent_id=p.type_id GROUP BY p.type_name ORDER BY p.type_id;
43. 多表删除
DELETE t1 FROM tdb_goods as t1 LEFT JOIN .....
这儿临时的t1指的并不是原表,而是原表的副本t1,在与t2进行链接后得到的新的t1.
这个临时的t1表的数据即是要删除的多余的数据。
多表删除(单表模拟多表删除重复数据)
DELETE t1 FROM tdb_goods AS t1 LEFT JOIN (SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING count(goods_name) >= 2) AS t2 ON t1.goods_name=t2.goods_name WHERE t1.goods_id > t2.goods_id;
44. 运算符与函数
%:任意个字符
_:任意一个字符
SELECT DATE_FORMAT(‘2017-7-15‘, ‘%m/%d/%Y‘); //07/15/2017
MD5():信息摘要算法,为以后的web页面做准备,尽量使用MD5()
SELECT MDT(‘admin‘);
PASSWORD():密码算法,通过PASSWORD()修改(重要用于MYSQL数据库)当前用户和其他和其他用户的密码,修改客户端自己的密码。
SET PASSWORD=PASSWORD(‘dimitar‘); //把密码修改成dimitar
45. 自定义函数
用户自定义函数(user-defined function, UDF)是一种对MySQL扩展的途径,其算法与内置函数相同。
自定义函数的两个必要条件:参数(零个或多个) 返回值(只能有一个)
函数可以返回任意类型的值,同样可以接收这些类型的参数。
创建自定义函数:
CREATE FUNCTION 函数名() RETURNS VARCHAR(30)
RETURN
SET NAMES gbk;
USE test;
SELECT NOW();
SELECT DATA_FORMAT(NOW(), ‘%Y年%m月%d日 %H点:%i分:%s秒‘);
//以上函数可以写成函数方便以后调用:
CREATE FUNCTION date() RETURNS VARCHAR(30)
RETURN DATE_FORMAT(NOW(),‘%Y年%m月%d日 %H点:%i分:%s秒);
SELECT date(); //调用
关于函数体
a>. 函数体由合法的SQL语句构成。
b>. 函数体可以是简单的SELECT或INSERT语句。
c>. 函数体如果为复合结构则使用BEGIN...END语句。
d>. 复合结构可以包含声明,循环,控制结构。
带参数的自定义函数:
CREATE FUNCTION f1(num1 )
wating....
标签:restrict 记录 表连接 左连接 注意 outer 简单的 _for str
原文地址:https://www.cnblogs.com/coolcpp/p/basic-mysql.html