MySql基础使用
Posted coolcpp
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySql基础使用相关的知识,希望对你有一定的参考价值。
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_idG;
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_idG;
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_conditionG;
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_idG;
连接三个表联合显示查询结果,注意不同的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....
以上是关于MySql基础使用的主要内容,如果未能解决你的问题,请参考以下文章
使用 json rereiver php mysql 在片段中填充列表视图
[Go] 通过 17 个简短代码片段,切底弄懂 channel 基础
连接MySQL出现错误:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)(代码片段