mysql学习笔记

mysql学习笔记

1.简单语法

DDL语言(数据定义语言)

①创建数据库:create database myschool;
②查看所有数据库:show databases;
③创建表:

use myschool;#(先要找到在哪个数据库下创建表)
create table subject
(subjectNO int primary key,
subjectName varchar(50),
classHour int,
gradeID int);

(int默认长度是11,即int是int(11)的缩写;varchar和char的区别在于varchar的字段是可变的,char的字段不可变,eg:varchar(50),存储的字段是name,则取出来的时候只取这4个字段,而char(50),取出来的就是50分字符,后面46个空格。
④查看当前数据库中的所有表:show tables;
⑤查看创建表结构:show create table subject;
show create table subject\G;(稍微美观一些)
⑥删除数据库:drop database myschool;
⑦添加列属性:

 create table student
    (
studentNo int(4) not null,
    loginPwd varchar(20),
     studentName varchar(20) comment'学生姓名'
);

⑧查看引擎:show engines \G
⑨修改表语句:
在这里插入图片描述
⑩查看表字段: describe student;
简写:desc student;

DML语言(数据操作语言)

在这里插入图片描述
②为某个表添加某表中的数据:

insert into grade (gradeName)
select gradeName from grade;

在这里插入图片描述
在这里插入图片描述
更新查出来的数据设置给某列

mysql> update subject set classhour =
    -> (select classHour from
    -> (select classhour from subject where subjectno =3)as a)#临时表
    -> where subjectno =1;

在这里插入图片描述
在这里插入图片描述

DQL查询语句

在这里插入图片描述
②distinct语法:
在这里插入图片描述
多个字段去重:多个字段值一致才会去重,示例如下:
在这里插入图片描述
③使用表达式:
在这里插入图片描述
④排序
多字段排序,先按照第一个字段排序,如果遇到相同数据,再按照第二个字段排序;
eg:

 select * from
    -> subject s inner join grade g
    -> on s.gradeid = g.id
    -> order by s.classHour desc,g.id;

⑤分页Limit
在这里插入图片描述
limit 语句是在最后,一般select的语句写完之后,再做分页;

mysql> select classhour from subject limit 3,5;
+-----------+
| classhour |
+-----------+
|       122 |
|       234 |
|        88 |
|         0 |
|      1111 |
+-----------+
5 rows in set (0.00 sec)

mysql> select classhour from subject limit 3,5
    -> order by classhour desc;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'order by classhour desc' at line 2
mysql> select classhour from subject
    -> order by classhour desc
    -> limit 3,5;
+-----------+
| classhour |
+-----------+
|       212 |
|       212 |
|       122 |
|        88 |
|         0 |
+-----------+
5 rows in set (0.00 sec)

附加java code:
pageIndex:当前页;
pageSize:显示条数;
pageIndex * pageSize - pageSize:总记录条数
total:总记录数

⑥count

mysql> select count(*) from subject;
+----------+
| count(*) |
+----------+
|        8 |
+----------+

⑦子查询
在这里插入图片描述
子查询返回多行:in
子查询返回单行:=
子查询返回true/false:exits
若子查询条件成立,则显示父查询结果;
否则不显示。
eg:

        mysql> select * from subject;
+-----------+-------------+-----------+---------+
| subjectNo | subjectName | classHour | gradeId |
+-----------+-------------+-----------+---------+
|         2 | 数学        |       212 |       3 |
|         3 | 英语        |       234 |       4 |
|         4 | 数学        |       212 |       3 |
|         5 | 科学        |       122 |       3 |
|         6 | 英语        |       234 |       6 |
|         7 | 英语        |        88 |       6 |
|         9 | NULL        |         0 |       7 |
|       111 | 英语        |      1111 |      11 |
+-----------+-------------+-----------+---------+
8 rows in set (0.00 sec)

mysql> select subjectNo,subjectName
    -> from subject
    -> where exists
    -> (select gradeId from subject where subjectNo <10);
+-----------+-------------+
| subjectNo | subjectName |
+-----------+-------------+
|         2 | 数学        |
|         3 | 英语        |
|         4 | 数学        |
|         5 | 科学        |
|         6 | 英语        |
|         7 | 英语        |
|         9 | NULL        |
|       111 | 英语        |
+-----------+-------------+
8 rows in set (0.00 sec)

mysql> select subjectNo,subjectName
    -> from subject
    -> where exists
    -> (select gradeId from subject where subjectNo >200);
Empty set (0.00 sec)

相反的,exists 的反面是 not exists;
not exists:如果子查询成立,则显示空;如果子查询不成立,则显示夫查询结果;
eg:

mysql> select subjectNo,subjectName
    -> from subject
    -> where not exists
    -> (select gradeId from subject where subjectNo >200);
+-----------+-------------+
| subjectNo | subjectName |
+-----------+-------------+
|         2 | 数学        |
|         3 | 英语        |
|         4 | 数学        |
|         5 | 科学        |
|         6 | 英语        |
|         7 | 英语        |
|         9 | NULL        |
|       111 | 英语        |
+-----------+-------------+
8 rows in set (0.05 sec)

mysql> select subjectNo,subjectName
    -> from subject
    -> where not exists
    -> (select gradeId from subject where subjectNo <111);
Empty set (0.00 sec)

any:任意一个
all:全部
eg:

mysql> select * from grade;
+----+------+-----------+---------------+
| id | name | className | studentResult |
+----+------+-----------+---------------+
|  1 | 张明 | 语文      |            88 |
|  2 | 李文 | 语文      |            99 |
|  3 | 张宏 | 数学      |            78 |
|  4 | 微信 | 英语      |            67 |
|  5 | 魏中 | 英语      |            89 |
+----+------+-----------+---------------+
5 rows in set (0.00 sec)

mysql> select * from grade
    -> where studentResult > any
    ->
    -> (select studentResult from grade);
+----+------+-----------+---------------+
| id | name | className | studentResult |
+----+------+-----------+---------------+
|  1 | 张明 | 语文      |            88 |
|  2 | 李文 | 语文      |            99 |
|  3 | 张宏 | 数学      |            78 |
|  5 | 魏中 | 英语      |            89 |
+----+------+-----------+---------------+
4 rows in set (0.00 sec)

mysql> select * from grade
    -> where id > all
    -> (select studentResult from grade);
Empty set (0.00 sec)

⑧聚合函数
在这里插入图片描述
eg:

mysql> select max(studentResult) as '最高分',min(studentResult) as '最低分',avg(studentResult) as '平均分'
    -> from grade;                                                                                  '平均分'
+--------+--------+---------+
| 最高分 | 最低分 | 平均分  |
+--------+--------+---------+
|     99 |     67 | 84.2000 |
+--------+--------+---------+
1 row in set (0.00 sec)

⑨group by 分组
自动添加一列计算总和:with rollup;如下示例

mysql> select className,count(classname) from grade
    -> group by classname;
+-----------+------------------+
| className | count(classname) |
+-----------+------------------+
| 语文      |                2 |
| 数学      |                1 |
| 英语      |                2 |
+-----------+------------------+
3 rows in set (0.00 sec)

mysql> select className,count(classname) from grade
    -> group by classname with rollup;
+-----------+------------------+
| className | count(classname) |
+-----------+------------------+
| 数学      |                1 |
| 英语      |                2 |
| 语文      |                2 |
| NULL      |                5 |
+-----------+------------------+
4 rows in set (0.05 sec)

分组后筛选:
group by ……having……

⑩合并union 、union all
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

SQL UNION 语法
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。

SQL UNION ALL 语法
SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2
另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。

11、distinct
distinct 只能放在第一个字段,且和后面的字段一起去重
eg,distinct name,job,则是指name和job2个字段联合起来去重

12、尽量减少表连接的次数
通过笛卡尔积现象得出,连接表的次数越多,效率越低,尽量少做连接。

13、连接
1、内连接
a、内连接之等值条件,on的后面是 =

select name
from a
join 
select salary,name
from b
on a.name = b.name

b、内连接之非等值条件,on的后面不是等值

select name,salary
from a
join 
select salary_high,salary_low
from b
on salary between salary_high and salary_low

c、内连接的自连接
一个表看成2个表,取2个表明

2、外连接
left join ,左外连接,左表为主,全部获取
right jion,右外连接,右表为主,全部获取。
可以互换

3、union
unoin的效果比表连接效率高,union在减少匹配次数的情况下,还可以完成表的连接。而join,每增加一次join,就要进行一次笛卡尔积,匹配成倍的增加。
eg,a连接b,连接c
a有10条记录,b有10条记录,c有10条记录。
join,总共匹配101010 = 1000次
union,总共匹配1010+1010 = 200次

注意事项,union在进行结果集合并的时候,要保持结果集的列数相同。要求结果集的列的数据类型要一致

4、limit
作用,当数据量大的时候,可以分页显示,就像百度网页的结果分页。
limit (起始位置,长度),起始位置从0开始算。
比如,取出排名3-5名的学员信息,则limit(2,3)。
注意,limit在order by之后执行。

规律,limit(pageNo-1)*pageSize,pageSize

5、快速创建表
将一个查询结果,当作1个表新建。

create table test as select * from a

6、将表的查询结果插入另一张表中

insert into test1 select * fron a

7、删除
delete, 删除,只是把内容清除了,但是空间不做释放;且支持回滚,rollback一下,刚才删除的数据就会回来,不是真正意义上的删除。优点,可回滚;缺点,效率低。

truncate, ,物理删除,删除的快,空间内容全部一次性删除。不支持回滚,就是。内容没了,表结构还在。truncate只是在删除表里的数据,但是表结构都还在。

drop drop table test
这个是直接把表删除了,表结构和表中的数据都没了。

事务

事务的特点:
①原子性(A):执行事在这里插入代码片务要么都成功要么都不成功
②一致性(C):执行后,保持数据的一致
③隔离性(I):事务之间相互独立,互不影响
④持久性(D):数据永久储存在数据库中
在这里插入图片描述
在这里插入图片描述
查看默认事务提交方式:
select @@autocommit;
@@:内置
在这里插入图片描述
当set autocommit = 0;时,rollback才能回滚,因为结果并没有上报到数据库。so,如果想要实时回滚数据,首先要关闭自动提交模式;

①事务隔离级别:
a.读取未提交(read-uncommitted):事务间可以查看未提交(committ)的数据;
b.读取提交(read-committed):事务间只能读取已经提交的数据;
c.重复读取(repeatable-read):和正常操作一致
d.串行化(serializable)–>加锁、竞争锁
一个事务未完成,另一个事务不能操作,会显示tines out
②查看事务默认隔离级别:
(8版本以上用transaction_isolation,以下版本用tx_isolation)

select @@transaction_isolation;
select @@session.transaction_isolation;
select @@global.transaction_isolation;

例子:
在该cmd中先设置关闭自动提交设置,然后在表中增加某条数据
在这里插入图片描述
在另外一个cmd中查询该表数据:首先设置事务隔离级别为read-uncommitted,然后查询表数据;
在这里插入图片描述
用串行化的结果如下:
首先关闭自动提交,向表中增加数据:
在这里插入图片描述
打开另一个cmd(事务),设置默认隔离级别未串行化(serialazable),查询该表中的数据,结果如下:times out
在这里插入图片描述
把增加数据的事务提交之后,再做查询时即可。

2.简单知识点

①timestamp:
00-69:2000-2069年
70-99:1970-1999年
②数据类型
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
③concat(字段1,字段2,字段3……):字段连接;
在这里插入图片描述
在这里插入图片描述
示例:两者效果一样

select * from subject where subjectName != 'null';
 select * from subject where subjectName is not null;

在这里插入图片描述
LIKE用法:like通常与通配符%一起使用,%表示通配pattern中出现的内容,而不加通配符%的LIKE语法,表示精确匹配,其实际效果等同于 = 等于运算符
eg:select * from student where name like '%梅';

select * from student where name like '李梅';

'_'代表一个字;
'__'代表两个字;
如下:
在这里插入图片描述

连接查询

mysql不支持full 链接,直接用等于‘=’即可;

注意事项

①mysql命令行中执行多行命令时,如果前边输入的命令发生错误,是很令人头疼的事情,可以通过输入\c来取消前边的输入,重新进入“mysql->”提示符。
②mysql注释
单行注释用#;多行注释用/* */;

错误记录

但是如果前边输入的东西很多,直接取消又很可惜的,因为得重新敲打指令,这种情况下,可以通过输入\p,然后在命令行客户端右键,选择“标记”,就可以选择要复制的内容,选择好后,按Enter,即可将选择的内容复制到剪切板,接着输入\c,再粘贴,修改,执行命令。
即输入\p→右键鼠标选择“标记”→选择要复制的内容→按Enter键→输入\c→右键鼠标选择“粘贴”,然后修改即可。

LEETCODE错误备注:

在使用mysql执行update的时候,如果不是用主键当where语句,会报如下错误,使用主键用于where语句中正常。

异常内容:Error Code: 1175. You are using safe update mode and you tried to
update a table without a WHERE that uses a KEY column To disable safe
mode, toggle the option in Preferences -> SQL Queries and reconnect.
Error Code: 1175. You are using safe update 2
这是因为MySql运行在safe-updates模式下,该模式会导致非主键条件下无法执行update或者delete命令,执行命令
SET SQL_SAFE_UPDATES = 0;修改下数据库模式

如果想要提高数据库安全等级,可以在恢复回原有的设置,执行命令:SET SQL_SAFE_UPDATES = 1;

执行成功后,以delete命令为例,非主键情况下又报错了,说明安全等级修改成功

Error Code: 1175. You are using safe update

DATEDIFF 计算时间差

定义和用法
DATEDIFF() 函数返回两个日期之间的天数。

语法
DATEDIFF(date1,date2)
date1 和 date2 参数是合法的日期或日期/时间表达式。

注释:只有值的日期部分参与计算。


2020.6.21
快3个月,没有学习了。。

这段时间过得太懒了,以后不能再这样了。


2020.6.21

1、ifnull函数
concat函数中,如果连接的字段中其中有为null的,即结果值为null,为了避免出现这种情况,可以用ifnull()函数将null转化为非null值。
eg:
concat(first_name," ",last_name,",",ifnull(old,0))

2021.4.12’
继续开始攻坚技术难题-Fighting

1、CASE结构
CASE 变量|表达式|字段
WHEN 要判断的值/条件 THEN 返回的值1
WHEN 要判断的值/条件 THEN 返回的值2

ELSE 要返回的值n
END CASE

特点,①可以作为表达式,嵌套在其他语句中使用;也可以作为独立的语句使用,但只能放在BEGIN END中

2、if结构-实现多重分支
语法,
if 条件1then 语句1;
elseif 条件2 then 语句2;

else 语句n;
end if;
应用在begin end 中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值