码迷,mamicode.com
首页 > 数据库 > 详细

MySql基础使用

时间:2018-07-22 14:07:55      阅读:185      评论:0      收藏:0      [点我收藏+]

标签: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
创建数据表同时将查询结果写入到数据表。

  1. 创建
  2. 写入
  3. 更新
    为了一步到位
    可以在创建时写入信息

```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....

MySql基础使用

标签:restrict   记录   表连接   左连接   注意   outer   简单的   _for   str   

原文地址:https://www.cnblogs.com/coolcpp/p/basic-mysql.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!