1.3.1 MySql语法.md

Scroll Down

1.3.1 MySql语法

MySQL 数据类型

MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。

数值类型

MySQL支持所有标准SQL数值数据类型。

这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。

关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。

BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。

作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。

类型大小范围(有符号)范围(无符号)用途
TINYINT1 字节(-128,127)(0,255)小整数值
SMALLINT2 字节(-32 768,32 767)(0,65 535)大整数值
MEDIUMINT3 字节(-8 388 608,8 388 607)(0,16 777 215)大整数值
INT或INTEGER4 字节(-2 147 483 648,2 147 483 647)(0,4 294 967 295)大整数值
BIGINT8 字节(-9,223,372,036,854,775,808,9 223 372 036 854 775 807)(0,18 446 744 073 709 551 615)极大整数值
FLOAT4 字节(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)0,(1.175 494 351 E-38,3.402 823 466 E+38)单精度浮点数值
DOUBLE8 字节(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)双精度浮点数值
DECIMAL对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2依赖于M和D的值依赖于M和D的值小数值

日期和时间类型

表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。

每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。

TIMESTAMP类型有专有的自动更新特性,将在后面描述。

类型大小(字节)范围格式用途
DATE31000-01-01/9999-12-31YYYY-MM-DD日期值
TIME3'-838:59:59'/'838:59:59'HH:MM:SS时间值或持续时间
YEAR11901/2155YYYY年份值
DATETIME81000-01-01 00:00:00/9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS混合日期和时间值
TIMESTAMP41970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07YYYYMMDD HHMMSS混合日期和时间值,时间戳

NOW ()CURRENT DATE () 的区别:

NOW() 命令用于显示当前年份,月份,日期,小时,分钟和秒。

CURRENT_ DATE () 仅显示当前年份,月份和日期。

字符串类型

字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。

类型大小用途
CHAR0-255字节定长字符串
VARCHAR0-65535 字节变长字符串
TINYBLOB0-255字节不超过 255 个字符的二进制字符串
TINYTEXT0-255字节短文本字符串
BLOB0-65 535字节二进制形式的长文本数据
TEXT0-65 535字节长文本数据
MEDIUMBLOB0-16 777 215字节二进制形式的中等长度文本数据
MEDIUMTEXT0-16 777 215字节中等长度文本数据
LONGBLOB0-4 294 967 295字节二进制形式的极大文本数据
LONGTEXT0-4 294 967 295字节极大文本数据

CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。

BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。

BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。

有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。

枚举:enum,实现将所有可能出现的结果都设计好,实际上存储的数据必须是规定好的数据中的一个。

枚举的使用方式

定义:enum(可能出现的元素列表); //如enum(‘男’,‘女’)

使用:存储数据,只能存储上面定义好的数据

意义在于:

1, 限定值的可能性!

2, 速度快,比普通的字符串速度快!

原因是枚举型 是利用 整数进行管理的,能够2个字节进行管理!

每个值,都是一个整数标识,从第一个选项开始为1,逐一递增!

管理时整数的形式,速度比字符串快!

一共有2 个字节,0-65535,因此可以有 65535个选项可以使用!、

-- 创建枚举表

create table my_enum(  gender enum('男','女','保密') )charset utf8;

**作用之一:**规范数据格式,数据只能是规定的数据中的其中一个

**作用之二:**节省存储空间(枚举通常有一个别名:单选框),枚举实际存储的是数值,而不是字符串本身

在mysql中,系统也是自动转换格式的,而且基本与PHP一样(尤其是字符串转数字)

img img img

img

1 男 2 女 3保密

-- 插入数据

-- 有效数据

insert into my_enum values('男'),('保密'); 

-- 数值插入枚举元素

insert into my_enum values (1),(2);

原理在下面

-- 错误数据

insert into my_enum values('male'); -- 错误:没有该元素

证明字段存储的数据是数值:将数据去除了 +0 就可以判断出原来的数据存储的到底是字符串还是数值,如果是字符串最终结果永远是0,否则是其他值

-- 将字段结果取出来进行+0运算

select gender + 0,gender from my_enum;

找出了枚举元素的实际规律:按照元素出现的顺序,从1开始编号

枚举原理:枚举在进行数据规范的时候(定义的时候),系统会自动建立一个数字与枚举元素的对应关系(关系放到日志中);然后在进行数据插入的时候,系统自动将字符转换成对应的数字存储,然后在进行数据提取的时候,系统就自动将数字转换成字符串显示。

因为我枚举实际存储的是数值,所以可以直接插入数值

**注意:**站在 mysql的角度,尽量多用集合!

但是站在php操作mysql的角度,尽量少用!(兼容性差)

约束条件

约束条件与数据类型的宽度一样,都是可选参数

作用:用于保证数据的完整性和一致性

主要分为:
$$
PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录
FOREIGN KEY (FK) 标识该字段为该表的外键
NOT NULL 标识该字段不能为空
UNIQUE KEY (UK) 标识该字段的值是唯一的
AUTO_INCREMENT 标识该字段的值自动增长(整数类型,而且为主键)
DEFAULT 为该字段设置默认值
CASCADE 级联delete/update操作时,同步操作被关联的表 /常用的Cascade取值由:none,all,save-update,delete,lock,refresh,evict, replicate,persist,merge,delete-orphan(one-to-many)
All:表示所有的操作都级联
Save-update:表示在save/update/save-update时产生级联
Delete:表示删除时级联
/
inverse表示:“是否放弃维护关联关系”(在Java里面个对象产生关联时,对数据库的影响), 在one-to-many和many-to-many的集合定义中使用,inverse=“true”表示该对象不维护 关联关系;该属性的值一般在使用有序集合时设置成false(注意hibernate的缺省值 是false).
UNSIGNED 无符号
ZEROFILL 使用0填充
$$
#书要关联出版社 #被关联的表 create table press(id int primary key auto_increment, name char(20)); #关联的表 create table book( book_id int primary key auto_increment, book_name varchar(20), book_price int, press_id int, constraint Fk_pressid_id foreign key(press_id) references press(id) #关联的表删了,被关联的表也删了 on delete cascade #关联的表修改了,被关联的表也修改了 on update cascade );

select * from emp;  

#注释

#--------------------------- #----命令行连接MySql---------

#启动mysql服务器 net start mysql #关闭 net stop mysql #进入 mysql -h 主机地址 -u 用户名 -p 用户密码 #退出 exit #显示当前mysql的version的各种信息。 status; #将用户的加密方式改为mysql_native_password。 alter user 'root'@'localhost' identified with mysql_native_password by 'root';

#--------------------------- #----MySql用户管理---------

#修改密码:首先在DOS 下进入mysql安装路径的bin目录下,然后键入以下命令: mysqladmin -uroot -p123 password 456;

img

#创建新用户 create user Liu@localhost identified with mysql_native_password by '123456'; #例: CREATE USER 'dog'@'localhost' IDENTIFIED BY '123456'; CREATE USER 'pig'@'192.168.1.101_' IDENDIFIED BY '123456'; CREATE USER 'pig'@'%' IDENTIFIED BY '123456'; CREATE USER 'pig'@'%' IDENTIFIED BY ''; CREATE USER 'pig'@'%'; #语法说明如下: #1) <用户名> #指定创建用户账号,格式为 'user_name'@'host_name'。这里user_name是用户名,host_name为主机名,即用户连接 MySQL 时所在主机的名字。若在创建的过程中, #只给出了账户的用户名,而没指定主机名,则主机名默认为“%”,表示一组主机。 #2) PASSWORD #可选项,用于指定散列口令,即若使用明文设置口令,则需忽略PASSWORD关键字;若不想以明文设置口令,且知道 PASSWORD() 函数返回给密码的散列值, #则可以在口令设置语句中指定此散列值,但需要加上关键字PASSWORD。 #3) IDENTIFIED BY子句 #用于指定用户账号对应的口令,若该用户账号无口令,则可省略此子句。 #增加用户权限 #格式: grant 权限 on 数据库.* to 用户名@登录主机 identified by '密码' #回收权限 revoke 权限 on 数据库.数据库表 from ‘用户名’@‘ip’ ; #删除用户 #格式: drop user 用户名; drop user Liu@loaclhost; #查看MYSQL数据库中所有用户 #格式: mysql> SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user; #查看数据库中具体某个用户的权限 #格式: mysql> show grants for 'cactiuser'@'%';

img

/*删除用户

drop:

​ drop user XXX;删除已存在的用户,默认删除的是'XXX'@'%'这个用户,如果还有其他的用户如'XXX'@'localhost'等,不会一起被删除。如果要删除'XXX'@'localhost',使用drop删除时需要加上host即drop user 'XXX'@'localhost'。

delete:

​ delete from user where user='XXX' and host='localhost';其中XXX为用户名,localhost为主机名。

区别:

​ drop不仅会将user表中的数据删除,还会删除其他权限表的内容。而delete只删除user表中的内容,所以使用delete删除用户后需要执行FLUSH PRIVILEGES;刷新权限,否则下次使用create语句创建用户时会报错。

*/

/* 如,增加一个用户user1密码为password1,让其可以在本机上登录, 并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入mysql,然后键入以下命令: grant select,insert,update,delete on . to user1@localhost Identified by "password1"; 如果希望该用户能够在任何机器上登陆mysql,则将localhost改为"%"。 如果你不想user1有密码,可以再打一个命令将密码去掉。 grant select,insert,update,delete on mydb.* to user1@localhost identified by ""; */

#all privileges 所有权限 grant all privileges on wpj1105.* to sunxiao@localhost identified by '123'; # localhost 本地访问; % 所有可访问 (对外开放,远程访问)。 create user Liu@localhost identified with mysql_native_password by '123456'; grant all privileges on . to Liu@localhost; create user 'Liu'@'%' identified with mysql_native_password by '123456'; grant all privileges on . to 'Liu'@'%';

#---------------------------- #-----MySql数据库操作基础-----

#显示数据库 show databases; #判断是否存在数据库wpj1105,有的话先删除 drop database if exists wpj1105; #创建数据库 create database wpj1105; #删除数据库 drop database wpj1105; #修改数据库名 CREATE DATABASE new_db_name; RENAME TABLE db_name.table1 TO new_db_name.table1, db_name.table2 TO new_db_name.table2; DROP DATABASE db_name; #使用该数据库 use wpj1105; #显示数据库中的表 show tables; #先判断表是否存在,存在先删除 drop table if exists student; #创建表 create table student( id int auto_increment primary key, name varchar(50), sex varchar(20), date varchar(50), content varchar(100) )default charset=utf8; #删除表 drop table student; #查看表的结构 describe student; #可以简写为desc student; #插入数据 insert into student values(null,'aa','男','1988-10-2','......'); insert into student values(null,'bb','女','1889-03-6','......'); insert into student values(null,'cc','男','1889-08-8','......'); insert into student values(null,'dd','女','1889-12-8','......'); insert into student values(null,'ee','女','1889-09-6','......'); insert into student values(null,'ff','null','1889-09-6','......'); #查询表中的数据 select * from student; select id,name from student; #修改某一条数据 update student set sex='男' where id=4; #删除数据 delete from student where id=5; #like 普通模糊查询 #结构 :字段 like '对比表达式' #%: 代替0个或多个任意字符。 #_ : 代替1个任意字符。 select * from stu where sname like '_强%'; // 查询stu表中学生名字第二个字是‘强’的学生信息 #rlike 正则表达式 #结构 : 字段 rlike '正则表达式' #常用符号 : #. : 匹配任何单个字符 #[] :匹配在括号内的任意单个字符 #* :匹配0个或多个前面的字符 # :匹配以后面的字符开头 #$ :匹配以$前面的字符结尾 select * from stu where tel rlike '^[0-9]$'; // 查询stu表中tel全为数字的行 #模糊查询高效的方法: #LOCATE('substr',str,pos)方法 #返回 substr 在 str 中第一次出现的位置,如果 substr 在 str 中不存在,返回值为 0 #如果pos存在,返回 substr 在 str 第pos个位置后第一次出现的位置 #如果 substr 在 str 中不存在,返回值为0。 SELECT LOCATE('xbar',foobar); ###返回0 SELECT LOCATE('bar',foobarbar); ###返回4 SELECT LOCATE('bar',foobarbar,5); ###返回7 #keyword是要搜索的内容,field为被匹配的字段,查询出所有存在keyword的数据 SELECT column FROM table WHERE LOCATE('keyword', field)>0 #POSITION('substr' IN field)方法 #position可以看做是locate的别名,功能跟locate一样 SELECT column FROM table WHERE POSITION('keyword' IN filed) #INSTR(str,'substr')方法 SELECT column FROM table WHERE INSTR(field, 'keyword' )>0 #除了上述的方法外,还有一个函数FIND_IN_SET #FIND_IN_SET(str1,str2): #返回str2中str1所在的位置索引,其中str2必须以","分割开。 SELECT * FROM person WHERE FIND_IN_SET('apply',name); # and 且 select * from student where date>'1988-1-2' and date<'1988-12-1'; # or 或 select * from student where date<'1988-11-2' or date>'1988-12-1'; #between select * from student where date between '1988-1-2' and '1988-12-1'; #in 查询制定集合内的数据 select * from student where id in (1,3,5); #排序 asc 升序 desc 降序 select * from student order by id asc; #分组查询 #聚合函数 select max(id),name,sex from student group by sex; select min(date) from student; select avg(id) as '求平均' from student; #统计表中总数 select count() from student; #统计表中性别总数 若有一条数据中sex为空的话,就不予以统计~ select count(sex) from student; select sum(id) from student; #查询第i条以后到第j条的数据(不包括第i条) select * from student limit 2,5; #显示3-5条数据 #使用mysql查询数据库,当执行left join时,有些关联的字段内容是NULL, #因此获取记录集后,需要对NULL的数据进行转换操作。 select a.id,a.name,IFNULL(b.lastlogintime,0) as lastlogintime from user as a left join user_lastlogin as b on a.id=b.uid; #将 win_loss 中的胜,负,平 都变成 对应的 ‘win’,'loss','tie' select date_year, case when win_loss='胜' then 'win' when win_loss='负' then 'loss' else 'tie' end win_loss#列名 from scores;

1.IF函数

IF(expr1,expr2,expr3)

如果expr1是TRUE(expr1<>0且expr1<>NULL),那么IF()返回expr2,否则它返回expr3。IF()返回一个数字或字符串值,取决于它被使用的上下文。

2.IFNULLl函数

IFNULL(expr1,expr2)

如果expr1不是NULL,IFNULL()返回expr1,否则它返回expr2。IFNULL()返回一个数字或字符串值,取决于它被使用的上下文环境。

MySql中is NULL、ISNULL()和IFNULL()运行速度的比较

在查询过程中,我们经常用到非空和is null的查询,为了更高效的查询,我们应该知道那种方法更快。

第一步,is NULL要比ISNULL()的比较

SELECT * from 表名 where 字段名 is NULL

img

SELECT * from 表名 where ISNULL(字段名)

img

由上面可以看出,is NULL要比ISNULL()快一点。

第二步,is NULL和IFNULL()的比较

SELECT * from 表名 where 字段名 is NULL

img

SELECT * from 表名 where IFNULL(字段名,'0') = '0';

img

由上面可以看出,可看出IFNULL()要比is NULL快一点。

综上所述,查询空值的运行速度基本上为IFNULL()>is NULL>ISNULL()。

mysql 中 case when then .... else end 的简单使用

数据SQL CASE 表达式是一种通用的条件表达式,类似于其它语言中的 if/else 语句。

CASE WHEN condition THEN result WHEN condition THEN result    ............. [WHEN ...] [ELSE result] END

CASE 子句可以用于任何表达式可以有效存在的地方。 condition 是一个返回boolean 的表达式。 如果结果为真,那么 CASE 表达式的结果就是符合条件的 result。 如果结果为假,那么以相同方式搜寻任何随后的 WHEN 子句。 如果没有 WHEN condition 为真,那么 case 表达式的结果就是在 ELSE 子句里的值。 如果省略了 ELSE 子句而且没有匹配的条件, 结果为 NULL。

Mysql@和@@符号的详细使用说明

一、概述

@是用户变量,@@是系统变量。

二、使用语法及实践

用户自定义变量

1、用户定义变量语法

SET @var_name = expr [, @var_name = expr]

如:set @t1 =100;

2、获取用户定义变量值方式,如:

select @t1 from dual;

系统变量

1、查看全部系统变量指令

SHOW GLOBAL VARIABLES

2、查看单个系统变量

SHOW GLOBAL VARIABLES LIKE 'wait_timeout'

3、设置系统变量语法

SET GLOBAL 变量名 = 变量值

如:SET GLOBAL wait_timeout = 604800;

注:如果修改变量值后没有生效,请退出从新再试下 。

4、获取系统变量值的语法

Oracle中有一个伪列rownum,可以在生成查询结果表的时候生成一组递增的序列号。MySQL中没有这个伪列,但是有时候要用,可以用如下方法模拟生成一列自增序号

(1)sql示例:

select (@i:=@i+5) as rownum, surname, personal_name from student, (select @i:=100) as init;

当然一般不会这么用,简单的从1开始递增就行

select (@i:=@i+1) as rownum, surname, personal_name from student, (select @i:=0) as init;

select (@i:=@i+1) as rownum, A.surname, B.uname from student A left join user B on CONCAT(A.surname,A.personal_name) = B.uname, (select @i:=0) as init;

select (@i:=@i+1) as rownum, A.surname, B.uname from student A

MySQL UNION 操作符

MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据。

MySQL UNION 操作符语法格式:

SELECT expression1, expression2, ... expression_n FROM tables [WHERE conditions] UNION [ALL | DISTINCT] SELECT expression1, expression2, ... expression_n FROM tables [WHERE conditions];

参数

  • expression1, expression2, ... expression_n: 要检索的列。
  • tables: 要检索的数据表。
  • WHERE conditions: 可选, 检索条件。
  • DISTINCT: 可选,删除结果集中重复的数据(去重)。默认情况下 UNION 操作符已经删除了重复数据,所以 DISTINCT 修饰符对结果没啥影响。
  • ALL: 可选,返回所有结果集,包含重复数据。

表的连接分成好几种类型。

  • 内连接(inner join)(又叫等值连接,只返回两个表中连接字段相等的行。)
  • 外连接(outer join)(外连接分为两种, "左外连接"和"右外连接")
  • 左连接(left join)(返回右表中所有的记录以及左表中连接字段相等的记录。)
  • 右连接(right join)(返回右表中所有的记录以及左表中连接字段相等的记录。)
  • 全连接(full join)(但是在mysqI中并不支持"全连接" ,更准确的说, mysql中不能直接使用"full join"实现全连接。可以使用"left join"、"union" 、"right join"的组合实现所谓的"全连接"。)

img

img

img

img

 下图就是四种连接的图示。我觉得,这张图比维恩图更易懂,也更准确。

img

还存在一种特殊的连接,叫做"交叉连接"(cross join),指的是表 A 和表 B 不存在关联字段,这时表 A(共有 n 条记录)与表 B (共有 m 条记录)连接后,会产生一张包含 n x m 条记录的新表(见下图)。

img

#内连接(inner join) SELECT * FROM A INNER JOIN B ON A.book_id=B.book_id; #左连接(left join) SELECT * FROM A LEFT JOIN B ON A.book_id=B.book_id; #右连接(right join) SELECT * FROM A RIGHT JOIN B ON A.book_id=B.book_id; #全连接(full join) SELECT * FROM A FULL JOIN B ON A.book_id=B.book_id; #查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩(包括有成绩的和无成绩的) SELECT stu.,ROUND(AVG(s.s_score),2) AS '平均分' FROM student stu LEFT JOIN score s ON s.s_id=stu.s_id GROUP BY stu.s_id HAVING AVG(s.s_score) < 60 UNION SELECT sd.,0 as '平均分' #即'平均分'列下的对应行的值为0 FROM student sd WHERE sd.s_id NOT IN (SELECT sc.s_id FROM score sc);

注意having和where的用法区别

1.having只能用在group by之后,对分组后的结果进行筛选(即使用having的前提条件是分组)。

2.where肯定在group by 之前。

3.where后的条件表达式里不允许使用聚合函数,而having可以。

当一个查询语句同时出现了where,group by,having,order by的时候,执行顺序和编写顺序是

1.执行where xx对全表数据做筛选,返回第1个结果集。

2.针对第1个结果集使用group by分组,返回第2个结果集。

3.针对第2个结果集中的每1组数据执行order byx,有几组就执行几次,返回第3个结果集。

4.针对第3个结集执行having xx进行筛选,返回第4个结果集。

5.针对第4个结果集排序。

也就是说其实where不能和聚合函数一起使用,因为select语句执行在where之后。

#巩固练习 create table c( id int primary key auto_increment, name varchar(10) not null, sex varchar(50) , #DEFAULT '男' , age int unsigned, #不能为负值(如为负值 则默认为0) sno int unique #不可重复 ); drop table c; desc c; insert into c (id,name,sex,age,sno) values (null,'涛哥','男',68,1); insert into c (id,name,sex,age,sno) values (null,'aa','男',68,2); insert into c (id,name,sex,age,sno) values (null,'平平','男',35,3); ... select * from c;

#修改数据 update c set age=66 where id=2; update c set name='花花',age=21,sex='女' where id=2 delete from c where age=21; #常用查询语句 select name,age ,id from c select * from c where age>40 and age<60; #and select * from c where age<40 or age<60; #or select * from c where age between 40 and 60 #between select * from c where age in (30,48,68,99); #in 查询指定集合内的数据 select * from c order by age desc; #order by (asc升序 des降序) #分组查询 select name,max(age) from c group by sex; #按性别分组查年龄最大值 #聚合函数 select min(age) from c; select avg(age) as '平均年龄 ' from c; select count(*) from c; #统计表中数据总数 select sum(age) from c; #修改表的名字 #格式:alter table tbl_name rename to new_name alter table c rename to a; #表结构修改 create table test ( id int not null auto_increment primary key, #设定主键 name varchar(20) not null default 'NoName', #设定默认值 department_id int not null, position_id int not null, unique (department_id,position_id) #设定唯一值 ); #修改表的名字 #格式:alter table tbl_name rename to new_name alter table test rename to test_rename; #向表中增加一个字段(列) #格式:alter table tablename add columnname type; #alter table tablename add(columnname type); alter table test add columnname varchar(20); #修改表中某个字段的名字 alter table tablename change columnname newcolumnname type; #修改一个表的字段名 alter table test change name uname varchar(50); select * from test; #表position 增加列test alter table position add(test char(10)); #表position 修改列test alter table position modify test char(20) not null; #表position 修改列test 默认值 alter table position alter test set default 'system'; #表position 去掉test 默认值 alter table position alter test drop default; #表position 去掉列test alter table position drop column test; #表depart_pos 删除主键 alter table depart_pos drop primary key; #表depart_pos 增加主键 alter table depart_pos add primary key PK_depart_pos (department_id,position_id); #用文本方式将数据装入数据库表中(例如D:/mysql.txt) load data local infile "D:/mysql.txt" into table MYTABLE; #导入.sql文件命令(例如D:/mysql.sql) source d:/mysql.sql; #或者 /. d:/mysql.sql;

每日人流量信息被记录在:序号 (id)、日期 (date)、 人流量 (people) 请编写一个查询语句,找出高峰期时段,要求连续三天及以上,并且每天人流量均不少于100。 例如,表 stadium: +------+------------+-----------+ | id | date | people | +------+------------+-----------+ | 1 | 2017-01-01 | 10 | | 2 | 2017-01-02 | 109 | | 3 | 2017-01-03 | 150 | | 4 | 2017-01-04 | 99 | | 5 | 2017-01-05 | 145 | | 6 | 2017-01-06 | 1455 | | 7 | 2017-01-07 | 199 | | 8 | 2017-01-08 | 188 | +------+------------+-----------+ 对于上面的示例数据,输出为: +------+------------+-----------+ | id | date | people | +------+------------+-----------+ | 5 | 2017-01-05 | 145 | | 6 | 2017-01-06 | 1455 | | 7 | 2017-01-07 | 199 | | 8 | 2017-01-08 | 188 | +------+------------+-----------+ Note: 每天只有一行记录,日期随着 id 的增加而增加。 select distinct s1.* from stadium s1,stadium s2,stadium s3 where s1.people>=100 and s2.people>=100 and s3.people>=100 and ( (s1.id = s2.id-1 and s2.id=s3.id-1) or (s1.id = s2.id-1 and s1.id=s3.id+1) or (s1.id = s2.id+1 and s2.id=s3.id+1) ) order by s1.id

img

img

img

#创建角色 create role ‘角色名称’ #授予角色权限 grant 权限名称(select、insert、update、delete)on 数据库.* to '角色名称' #把角色授予用户 grant '角色名称' to '用户名称' #查询角色 select current_role() #启动角色 set role '角色名称' #设置默认角色 set default role all(或者'角色名称') to '用户名称' #撤销角色权限 revoke 权限名称(select、insert、update、delete)on 数据库.* from '角色名称'

img

img

img

img

img

img

img

img

img

img

img

img

img

img

img

img

img

img

img

img

img

img

img

img

img

img

img

img

img

img

img