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。下面的表显示了需要的每个整数类型的存储和范围。
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
TINYINT | 1 字节 | (-128,127) | (0,255) | 小整数值 |
SMALLINT | 2 字节 | (-32 768,32 767) | (0,65 535) | 大整数值 |
MEDIUMINT | 3 字节 | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
INT或INTEGER | 4 字节 | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
BIGINT | 8 字节 | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
FLOAT | 4 字节 | (-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) | 单精度浮点数值 |
DOUBLE | 8 字节 | (-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类型有专有的自动更新特性,将在后面描述。
类型 | 大小(字节) | 范围 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | '-838:59:59'/'838:59:59' | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 | 1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
NOW () 和 CURRENT DATE () 的区别:
NOW() 命令用于显示当前年份,月份,日期,小时,分钟和秒。
CURRENT_ DATE () 仅显示当前年份,月份和日期。
字符串类型
字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。
类型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255字节 | 定长字符串 |
VARCHAR | 0-65535 字节 | 变长字符串 |
TINYBLOB | 0-255字节 | 不超过 255 个字符的二进制字符串 |
TINYTEXT | 0-255字节 | 短文本字符串 |
BLOB | 0-65 535字节 | 二进制形式的长文本数据 |
TEXT | 0-65 535字节 | 长文本数据 |
MEDIUMBLOB | 0-16 777 215字节 | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215字节 | 中等长度文本数据 |
LONGBLOB | 0-4 294 967 295字节 | 二进制形式的极大文本数据 |
LONGTEXT | 0-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一样(尤其是字符串转数字)



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;
#创建新用户 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'@'%';
/*删除用户
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
SELECT * from 表名 where ISNULL(字段名)
由上面可以看出,is NULL要比ISNULL()快一点。
第二步,is NULL和IFNULL()的比较
SELECT * from 表名 where 字段名 is NULL
SELECT * from 表名 where IFNULL(字段名,'0') = '0';
由上面可以看出,可看出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"的组合实现所谓的"全连接"。)
下图就是四种连接的图示。我觉得,这张图比维恩图更易懂,也更准确。
还存在一种特殊的连接,叫做"交叉连接"(cross join),指的是表 A 和表 B 不存在关联字段,这时表 A(共有 n 条记录)与表 B (共有 m 条记录)连接后,会产生一张包含 n x m 条记录的新表(见下图)。
#内连接(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
#创建角色 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 '角色名称'