库操作
创建,修改,删除称之为定义

创建数据库
CREATE DATABASE 数据库名;

CREATE DATABASE db1 charset utf8mb4; #不要忘了设置字符集

查看数据库
SHOW DATABASES; #图形化管理工具里面可以直接看到有哪些数据库

SHOW create DATABASE db1; #查看创建数据库db1的代码

使用数据库
USE db1 ; #切换到某个文件夹,即数据库

select database(); #查看当前所在的文件夹,即数据库

修改字符集和排序规则
ALTER DATABASE oldguo CHARSET utf8mb4;

删除数据库
DROP DATABASE db1; drop database db1;

表操作
创建表
要指定字段和字段类型,要指定主键,最后一个字段后面没有逗号

CREATE TABLE stu (

ID int(11) AUTO_INCREMENT PRIMARY KEY,

name varchar(20) CHARACTER SET utf8 NOT NULL,

nicename varchar(20) CHARACTER SET utf8 DEFAULT NULL,

sex char(1) CHARACTER SET utf8 DEFAULT NULL,

in_time datetime NOT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

注意事项:设置字符集

--- 建表规范 *****

--- 1. 表名小写字母,不能数字开头,

--- 2. 不能是保留字符,使用和业务有关的表名

--- 3. 选择合适的数据类型及长度

--- 4. 每个列设置 NOT NULL + DEFAULT .对于数据0填充,对于字符使用有效字符串填充

--- 5. 没个列设置注释

--- 6. 表必须设置存储引擎和字符集

--- 7. 主键列尽量是无关列数字列,最好是自增长

--- 8. enum类型不要保存数字,只能是字符串类型

修改表
ALTER TABLE 表名 ADD 新列名 数据类型 [完整性约束条件]; #增加列

ALTER TABLE 表名 ADD 新列名 数据类型 [完整性约束条件] first; #表示将该字段作为第一个字段

ALTER TABLE 表名 ADD 新列名 数据类型 [完整性约束条件] after 字段名; #表示将该字段放在哪个字段后面

alter table t1 modify name char(13); #将name字段的宽度改为13

alter table t1 change name Name char(10); #改字段名

ALTER TABLE `表名 Drop 列名 #删除列

ALTER TABLE `原表名 rename 新表名; #给表重命名

复制表
CREATE TABLE t1 select user,host from mysql.user; #将查询结果放到一个新表中

CREATE TABLE t3 select user,host from mysql.user where 1>3; 创建t3表,它复制了mysql.user的几个字段

CREATE TABLE t2 like mysql.user; #创建t2表,它复制了mysql.user的字段

select * from mysql.user\G; \G表示按行显示,mysql是系统自带的库,user为其下的一个表

select * from mysql.user\c \c表示取消,即不执行该语句

删除表
DROP TABLE stu #删除整个表

查看表
show create table 表名; #查看表的详细信息

desc 表名; #查看表结构,desc =describe

show tables; #查看当前文件夹下的所有表

记录
查询记录

SELECT ID,name, nicename FROM stu WHERE sex='男' ORDER BY IDDESC

DESC表示数字从大到小排列

ASC相反,默认从小到大

SELECT distinct 字段1,字段2,字段3.... FROM <表 1>, <表 2>…

[WHERE <条件表达式>] #WHERE 子语句作用于表

[GROUP BY [HAVING ]] #HAVING短语作用于组

[ORDER BY ]

[LIMIT[,] ] #row count限制显示的条数

关键字的执行优先级

from where group by having select distinct order by limit

distinct针对查询结果的一整条记录

select distinct post from emp; #post字段为岗位名称

该语句表示:选择学号Sno,课程号Cno两列并按课程号Cno来分组,并计算选每一课程的学生人数

SELECT Cno,COUNT(Sno) #对学号Sno 列进行运算

FROM SC #SC为学生选课表,包括学号Sno,课程号Cno,成绩Grade三列

GROUP BY Cno

SELECT Sno

FROM SC

GROUP BY Sno

HAVING COUNT(*)>3; #筛选出选修超过3门课程的学生

select name, salary2 two from emp; #字段中值的运算,salary2字段重命名为two

select concat(name,":",age) from emp; #concat连接作用

select concat_ws(":",name,age,sex) from emp; #concat_ws连接作用,第一个参数是分隔符

WHERE 条件表达式
确定范围(一般是数值的连续范围)

WHERE 列名 BETWEEN ... AND ...#从这一列中选出满足BETWEEN 条件的,含边界值

WHERE 列名 NOT BETWEEN ... AND ...

确定集合()

WHERE 列名 IN( ) #从这一列中选出满足in条件的

WHERE 列名 NOT IN( )

查询空值

WHERE sex is NULL

WHERE sex is NOT NULL

字符匹配

%表示任意长度的字符串,_(下横线)表示任意单个字符

WHERE name LIKE '刘%' #查询姓刘的 WHERE name NOT LIKE '刘%' #查询不姓刘的

WHERE name LIKE '欧阳_' #查询姓欧阳且名字为三个字的

HERE name LIKE '_阳%' #查询第二个字为阳的

多条件查询

WHERE 条件1 AND/OR 条件2 AND/OR 条件3......

IN 实际上是多个OR运算符的缩写

like一般用于字符串类型的匹配

group by

select @@sql_mode; #查看sql模式

set global sql_mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES";

select post,max(salary) from emp group by post;

select post,salary from emp group by post; #设置‘sql_mode="ONLY_FULL_GROUP_BY"是会报错,因为分组以后,只能查到分组字段和组内多条记录聚合的结果

没有group by关键字时,默认分为一组,聚合函数只能在分完组以后使用

select post,group_concat(name,age) from emp group by post;#结果如下

group_concat(name,age)


张野28

歪歪48,丫丫38,丁丁18,星星18,格格28

alex78,wupeiqi81,yuanhao73,liwenzhou28,jingliyang18,jinxin18,成龙48

egon18


having

select post,avg(salary) from emp group by post having avg(salary)>10000;

order by

select * from emp order by age asc,salary asc; #多重排序

limit

select * from emp limit 3; #显示3条记录

select * from emp limit 0,5; #从0开始不包括0,取5条

select * from emp limit 5,5;

正则表达式

select * from emp where name regexp "jin.*(n|g)$";

多表查询
select * from empl,depa; #两张表的笛卡儿积

连接查询:一个查询同时涉及两个以上的表

子查询:把一个查询的结果作为另一个查询的条件

连接查询比子查询效率高?具体情况具体分析

外连接 OUTER JOIN

1.左外连接

FROM Student LEFT JOIN SC ON(Student.Sno=SC.Sno)

select * from empl LEFT JOIN depa on empl.dep_id=depa.id;

查询保留在表Student中而不在表SC的记录,这些记录在表SC的字段的值为NULL

2.右外连接 RIGHT JOIN

select * from empl RIGHT JOIN depa on empl.dep_id=depa.id;

3.内连接 取两张表有对应关系的记录

select * from empl inner JOIN depa on empl.dep_id=depa.id;

select t1.id,t1.name,t1.hire_date,t1.post,t2.* from emp as t1 inner join (select post, max(hire_date) from emp group by post) as t2 on t1.post=t2.post;

将一个查询结果用括号括起来,起个名,当成一个表来使用

select t1.* from emp as t1 inner join (select post, max(hire_date) as max_date from emp group by post) as t2 on t1.post=t2.post where t1.hire_date=t2.max_date;

1.5 关于多表连接语法规则

1.首先找涉及到的所有表

2.找到表和表之间的关联列

3.关联条件写在on后面

A join B on 关联列

  1. 所有需要查询的信息放在select后

  2. 其他的过滤条件where group by having order by limit 往最后放

6.注意:对多表连接中,驱动表选择数据行少的表。后续所有表的关联列尽量是主键或唯一键(表设计),至少建立一个索引。

增加记录
INSERT INTO db1.t1(name, nicename) VALUES ('张三4','三哥4'), ('张三5','三哥5'), ('张三6','三哥6')

db1.t1 =数据库名.表名

CREATE TABLE user1 select user,host from mysql.user where 1>3;

INSERT INTO user1 select user,host from mysql.user;

修改记录
UPDATE <表名> SET 字段 1=值 1 [,字段 2=值 2… ] [WHERE 子句 ]

UPDATE stu SET sex='男' WHERE sex is NULL

truncate t8; #清空表,物理删除,立即释放存储空间

删除记录
DELETE FROM stu WHERE Sno='123456'

逻辑删除,不会立即释放存储空间

show介绍

show databases; 查看数据库名

show tables; 查看表名

show create database xx; 查看建库语句

show create table xx; 查看建表语句

show processlist; 查看所有用户连接情况

show charset; 查看支持的字符集

show collation; 查看所有支持的校对规则

show grants for xx; 查看用户的权限信息

show variables like '%xx%' 查看参数信息

show engines; 查看所有支持的存储引擎类型

show index from xxx 查看表的索引信息

show engine innodb status\G 查看innoDB引擎详细状态信息

show binary logs 查看二进制日志的列表信息

show binlog events in '' 查看二进制日志的事件信息

show master status ; 查看mysql当前使用二进制日志信息

show slave status\G 查看从库状态信息

show relaylog events in '' 查看中继日志的事件信息

show status like '' 查看数据库整体状态信息