像这样的[ ] 里面的内容是选填的,执行sql时,不一定要写[ ] 里面的东西,如果写了,千万不要把[ ]也写上,执行sql语句里面选填内容不用加上[ ]

mysql语法的注释

  1. #这是单行注释
  2. -- 这也是单行注释,不过需要在--后面打上一个空格
  3. /*这是
  4. 一个
  5. 多行
  6. 注释
  7. */

数据库操作

选择数据库

  1. use dataname #在操作数据库之前,先要选择到这个数据库

查询数据库

  1. select database(),now(),user(),version() #查询当前数据库,时间,用户名,数据库版本
  2. show databases [like '%a%'] #查询已有的数据库,like语句表示模糊匹配数据库名

创建数据库

  1. create database [if not exists] dataname #数据库名dataname,选填的内容是如果没存在这个数据库就创建,加上这句,创造已经存在的数据库不报错
  2. [character set utf8] #设置字符集
  3. [collate utf8_general_ci] #设置排序规则
  4. #字符集和排序规则可以不写,字符集和排序规则写什么,在可视化操作页面用鼠标点击创建数据库,那里面可以选择

删除数据库

  1. drop database dataname #删除dataname数据库,删除结构的那种

表操作

创建表

  1. #这是创建数据表的基础的语法
  2. create table table_name (列名 列类型)
  3. -- 这是创建数据表的较为全面的语法
  4. #创建性别表
  5. create table sex(
  6. s_id int [auto_increment] [primary key] [not null],#列名,类型,自增,主键,非空
  7. s_name varchar(2)
  8. )
  9. #创建学生表
  10. create table [if not exists] students(
  11. std_id int [auto_increment] [not null],
  12. std_name varchar(100) [not null],
  13. std_sexid int(2) [not null],
  14. std_birthday date,
  15. [[constraint pk] primary key(std_id)], #创建主键
  16. [[constraint fk] foreign key (std_sexid) references sex(s_id)], #创建外键,第一个参数写本表列名,后面是引用的表名和与本外键对应的主键
  17. [[constraint ue] unique(std_name)] #唯一约束,和主键约束差不多
  18. )

可以通过以上的方式创建约束,如果用以上的方式创建约束,constraint 约束名可以省略,这样创建的约束没有约束名,加上constraint 约束名创建约束,取一个约束名,方便后期通过约束名删除约束

修改表名

  1. alter table students rename to st #把students表名改成st

添加约束

  1. #给已存在的表添加约束,主外键等
  2. alter table students add [constraint pk] primary key(std_id)

删除约束

  1. alter table students drop foreign key fk #删除students表里面的名为fk的外键约束,逐渐约束好像不能用名字删除,直接primary key

添加字段

  1. #向已有的表中添加新字段,default设置默认值,如果写 after 字段名 就是是把新的字段添加到这一字段之后,写first就是把新字段添加到最前面,after和first选择其中一个写,不要都写
  2. alter table students add column std_new varchar(20) [not null] [default 100] [after std_name] [first]

修改字段

  1. #修改已有表的字段
  2. alter table students change std_name s_n varchar(88)#change后面指定要修改的字段名std_name,之后就写要改的字段的名字,类型等,default可以设置默认值

删除字段

  1. alter table students drop column std_birthday #删除students表中std_birthday字段

修改/删除字段默认值

  1. #修改已有表中字段的默认值
  2. alter table students alter std_new set default 888;
  3. #删除已有列的默认值
  4. alter table students alter std_new drop default

数据操作——增删改

添加

  1. #单行指定字段添加,没添加的字段需要设置默认值之类的,不然报错
  2. insert into students(std_name,std_sexid) values('小明',1)
  3. #单行全部添加,每一列都要写对应的值,主键都要写null,值得数量和字段的数量不匹配就报错
  4. insert into students values(null,'小明',1,'1998-1-2')
  5. #多行插入
  6. insert into students values(null,'小明',1,'1998-1-2'),(null,'小强',2,'1998-1-3')

如果要插入很多条数据的话,不要用单行插入,一行一行的插入。这样会很慢。 用多行插入,速度快得多。

有可能会报错max_allowed_packet不足,需要设置max_allowed_packet变大一些。顾名思义就是最大的数据包的限制,单位是字节

  1. show variables like '%max_allowed_packet%'

image.png
设置大小,设置最大数据包为100MB

  1. set global max_allowed_packet=100*1024*1024

修改完成后再次查询需要,打开新的窗口页面进行查询
image.png

修改

  1. update students set std_name = '小红',std_sexid = 2 [where std_id = 1]
  2. #更新多个字段用逗号隔开,where可以选择写,不写就是更新全部数据

删除

  1. #普通删除数据
  2. delete from students [where std_id=1] #不写where就全部删除,表还在,结构还在
  3. #删除表结构
  4. drop table students #这么删除,数据表都没有了,表结构都被删了

数据操作——查

select

  1. # *号表示查询全部字段,也可以写字段名,函数,表达式等,用逗号隔开,all限定符表示查询某字段的全部,distinct表示过滤某字段重复数据
  2. select [all|distinct] * from students
  3. #取个别名,as后面加名字,可以是中文
  4. select distinct std_name as 别名 from students

from

  1. #from后面可以跟多个表名,用逗号隔开,连接查询,多张数据表连接查询出来的数据数量是每张表数据数量的乘积,表也可以取别名
  2. select *
  3. from students,sex as 性别表

如果表取了别名,在where条件里面,用原表名.列名是定位不到的,取了别名就要用表别名.列名

where

条件判断,各种逻辑组合

  1. #用and和or连接多个条件,&&和||一样的
  2. where 条件1 [and|or] (条件2 [&& | ||] 条件3)
  1. #多表查询,要把每个表连接起来,通常是x表主键=y表外键
  2. select *
  3. from students,sex
  4. where students.std_sexid = sex.s_id
  5. and std_name is [not] null #判断名字为空
  6. and std_name [not] like '_明' #模糊查询2字,第二字是明
  7. and std_name [not] in('小工','小明','小红')#查看名字在这个集合里面
  8. and std_score [not] between 71 and 99 #查看成绩在71到99之间的,包含71和99

聚合函数

sum()求和,max()最大值,min()最小值,avg()平均数,count()计数

  1. #查询成绩最高的学生
  2. select max(std_score) from students

group by

分组查询,把某一字段进行分组,假如”学科”字段里面的数据,有32个语文,67个数学,82个英语,通过group by ‘学科’,把语文分一组,数学分一组,英语分一组

  1. 全部数据是这样

image.png

  1. 分组std_sexid

image.png

  1. 查看std_sexid字段中1和2这两组里面的最高分

image.png

如果select 后面出现的列里面包含了聚合函数,那么不是聚合函数的列必须,在group by后面写上

having

在group by后面写的条件

与 where 功能、用法相同,执行时机不同。
where 在开始时执行检测数据,对原数据进行过滤。 having 对筛选出的结果再次进行过滤。 having 字段必须是查询出来的,where 字段必须是数据表存在的。 where 不可以使用字段的别名,having 可以。因为执行WHERE代码时,可能尚未确定列值。 where 不可以使用合计函数。一般需用合计函数才会用 having

image.png

order by

排序

  1. #按成绩排序,默认升序,可以用逗号分隔排序多列
  2. select *
  3. from students
  4. order by std_score [asc|desc] #升序和降序

limit

限制查询,分页的好东西

limit 起始位置,获取条数 如果limit后面只写一个数字,就是默认从0开始,取多条数据

  1. #查询结果从索引1开始,取3条
  2. select *
  3. from students
  4. limit 1,3

子查询

就是先select查询出一部分数据,以这查出来的数据作为参数再次查询,得出新的结果。 本来是两个步骤,现在合并到一起写一条sql语句,就成了子查询

  1. #随便举两个例子
  2. -- where
  3. -- 先查询出学生的平均成绩,然后再查比平均成绩高的学生
  4. select *
  5. from students
  6. where std_score>(select avg(std_score) from students)
  7. -- from
  8. -- 先查询3个字段,成绩大于30的学生,输出的新表,取个别名,必须取别名!在查询这个新表,同时限定条件std_sexid=1
  9. select *
  10. from (select std_id,std_name,std_sexid from students where std_score>30) as new_table
  11. where std_sexid=1

union

连接多个查询结果,把这些查询结果合并到一个查询结果里面。
比如查询结果A,有20条记录,查询结果B有15条记录,查询结果C有15条记录,用union把他们连接起来,合成一个新的查询结果D,D最多有20+15+15=50条数据。因为重复的数据会被删除

  1. select *from students where std_sexid=1 #查询出来有2条记录
  2. union select *from students where std_score>20 #查询出来6条记录,本表全部数据
  3. #最后的结果来时6条数据,有2条重复了

两个查询结果字段可以不同,但是列的数量要一样,不然就是这样的报错

image.png