-- 启动 MySQL
net start mysql-- 关闭 MySQL
net stop mysql-- 登录
mysql -uroot -p123456-- 退出
exit 或者 quit-- 添加用户:先到 mysql 数据库,对 user 表进行操作即可
USE mysql;
INSERT INTO user(host,user,authentication_string,select_priv,insert_priv)VALUES('127.0.0.1','root',PASSWORD('123456'),'Y','Y');
/*1.MySQL 5.7 之前,authentication_string 用 password 表示2.select_priv 这些表示的是用户具有的权限,'Y' 表示授予该权限给用户,此外还有 insert_priv、update_priv、delete_priv、create_priv、drop_priv、reload_priv、shutdown_priv、process_priv、file_priv、grant_priv、reference_priv、index_priv、after_priv3.密码需要用 PASSWORD() 来加密
*/-- 创建用户,最好是养成习惯,在用户名后面加上 @‘localhost’
CREATE USER root2 IDENTIFIED BY '123456';-- 修改用户名,如果root2后面不加@‘localhost’,那么当需要填写用户名时也不用加@‘localhost’ 此时该用户 root2 的 host 字段值为 %,若有指定则 host 字段值为 localhost
RENAME USER ‘root’@‘localhost’ TO ‘root2’;-- 修改密码
1.
mysqladmin -uroot -p123456 password 123 --亲测可用
2.
USE mysql;
UPDATE user SET authentication_string = PASSWORD('123456') WHERE user='root' AND host='localhost';
3.
set password for root@localhost = password('123'); -- 删除用户
DROP USER myuser;-- 另一种给用户授予权限的写法
GRANT SELECT,INSERT,UPDATE ON mydatabase.* TO 'root'@'localhost';-- 删除权限
REVOKE SELECT,INSERT,UPDATE ON mydatabase.* FROM 'root'@'localhost';-- 查看权限
SHOW GRANTS FOR 'root'@'localhost';
使用 mysqladmin
mysqladmin -uroot -p123456 CREATE mysql2
登录后创建
CREATE DATABASE mysql2;
使用 mysqladmin
mysqladmin -uroot -p123456 DROP mysql2
登录后删除
DROP DATABASE mysql2;
登录后选择
USE mysql2;
数据库字段的数据类型与数据库优化息息相关
MySQL 支持的数据类型大致可以分为三类:数值 、日期/时间 和 字符类型
1.数值类型
2.日期与时间类型
3.字符类型
char 和 varchar 的比较:
CREATE TABLE hello (id INT PRIMARY_KEY AUTO_INCREMENT DEFAULT 100,name VARCHAR(11) NOT NULL COMMETNT '名字'
);
DROP TABLE table_name ;
INSERT INTO table_name ( field1, field2,...fieldN )VALUES( value1, value2,...valueN );
SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[OFFSET M ][LIMIT N]
你可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。
你也可以使用 LIMIT 属性来设定返回的记录数。
UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]
若不指定where,则默认更新整张表
DELETE FROM table_name [WHERE Clause]
如果没有指定 WHERE 子句,MySQL表中的所有记录将被删除,这种情况下建议使用 TRUNCATE TABLE table_name
,这条语句会将整张表删除,然后重新建立一张一模一样的表但没有任何记录,如果要删除表的所有记录,它的效率比使用 delete 快
-- 使用 ALTER 命令及 DROP 子句来删除表的 i 字段
ALTER TABLE testalter_tbl DROP i;
-- 在表 testalter_tbl 中添加 i 字段,并定义数据类型
ALTER TABLE testalter_tbl ADD i INT;
如果需要指定新增字段的位置,可以使用MySQL提供的关键字 FIRST (设定位第一列), AFTER 字段名(设定位于某个字段之后)。
ALTER TABLE testalter_tbl ADD i INT FIRST;ALTER TABLE testalter_tbl ADD i INT AFTER c;
修改字段有 MODIFY 和 CHANGE 子句
-- 把字段 c 的类型从 CHAR(1) 改为 CHAR(10)
ALTER TABLE testalter_tbl MODIFY c CHAR(10);
使用 CHANGE 子句, 语法有很大的不同。 在 CHANGE 关键字之后,紧跟着的是你要修改的字段名,然后指定新字段的类型及名称
ALTER TABLE testalter_tbl CHANGE i j BIGINT;
-- 把字段 j 从 BIGINT 修改为 INT
ALTER TABLE testalter_tbl CHANGE j j INT;
当你修改字段时,你可以指定是否包含 NULL 值、是否设置默认值。
-- 指定字段 j 为 NOT NULL 且默认值为100ALTER TABLE testalter_tbl MODIFY j BIGINT NOT NULL DEFAULT 100;
如果你不设置默认值,MySQL会自动设置该字段默认为 NULL
另外,我们可以使用 ALTER 来修改字段的默认值
ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
也可以使用 ALTER 命令及 DROP子句来删除字段的默认值
ALTER TABLE testalter_tbl ALTER i DROP DEFAULT; -- 删除后字段初始值变为 NULL
将数据表 testalter_tbl 重命名为 alter_tbl
ALTER TABLE testalter_tbl RENAME TO alter_tbl;
语法是:SHOW TABLE STATUS LIKE table_name
,STATUS 后面需要跟过滤条件,否则会把数据库所有表都查询出来
SHOW TABLE STATUS LIKE 'testalter_tbl'G-- 结果Name: testalter_tblType: MyISAMRow_format: FixedRows: 0Avg_row_length: 0Data_length: 0
Max_data_length: 25769803775Index_length: 1024Data_free: 0Auto_increment: NULLCreate_time: 2007-06-03 08:04:36Update_time: 2007-06-03 08:04:36Check_time: NULLCreate_options:Comment:
如果我们需要完全的复制 MySQL 的数据表,包括表的结构,索引,默认值等。 如果仅仅使用CREATE TABLE … SELECT 命令,是无法实现的。
如何完整的复制 MySQL 数据表,步骤如下:
HOW CREATE TABLE
命令获取创建数据表(CREATE TABLE) 语句,该语句包含了原数据表的结构,索引等。案例:
复制表 w3cschool_tbl
执行以上步骤后,你将完整地复制表,包括表结构及表数据。
SELECT field1, field2,...fieldN
FROM table_name1,
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
常和通配符 %
一起搭配使用
SELECT * from w3cschool_tbl WHERE w3cschool_author LIKE '%jay';SELECT * from w3cschool_tbl WHERE w3cschool_author LIKE '%jay%';SELECT * from w3cschool_tbl WHERE w3cschool_author LIKE 'jay%';
SQL 中的通配符主要有两个:
1.%
:匹配单个字符
2. _
:匹配任意个字符,包括零个字符
为了处理空值,MySQL提供了三大运算符:
在MySQL中,NULL值与任何其它值的比较(即使是NULL)永远返回false,即 NULL = NULL 返回false 。所以关于 NULL 值必须使用特殊的运算符
举几个案例:
-- 查找name字段中以'st'为开头的所有数据
SELECT name FROM person_tbl WHERE name REGEXP '^st';
-- 查找name字段中以'ok'为结尾的所有数据
SELECT name FROM person_tbl WHERE name REGEXP 'ok$';
-- 查找name字段中包含'mar'字符串的所有数据
SELECT name FROM person_tbl WHERE name REGEXP 'mar';
-- 查找name字段中以元音字符开头或以'ok'字符串结尾的所有数据
SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';
SELECT field1, field2,...fieldN FROM table_name1,
ORDER BY field1, [] [ASC [DESC]]
你可以使用任何字段来作为排序的条件,从而返回排序后的查询结果。
你可以设定多个字段来排序。
你可以使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升排列。
你可以添加 WHERE…LIKE 子句来设置条件。
SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)。
例如我们将数据表按名字进行分组,再统计每个人登录的次数:
SELECT name, SUM(singin) as singin_count FROM employee_tbl GROUP BY name WITH ROLLUP;-- 结果
+--------+--------------+
| name | singin_count |
+--------+--------------+
| 小丽 | 2 |
| 小明 | 7 |
| 小王 | 7 |
| NULL | 16 |
+--------+--------------+
其中记录 NULL 表示所有人的登录次数。
我们可以使用 coalesce 来设置一个可以取代 NUll 的名称,coalesce 语法:select coalesce(a,b,c);
,表示如果a==null
,则选择b;如果b==null
,则选择c;如果a!=null
,则选择a;如果a b c 都为null ,则返回为null(没意义)。
如果名字为空我们使用总数代替:
SELECT coalesce(name, '总数'), SUM(singin) as singin_count FROM employee_tbl GROUP BY name WITH ROLLUP;-- 结果
+--------------------------+--------------+
| coalesce(name, '总数') | singin_count |
+--------------------------+--------------+
| 小丽 | 2 |
| 小明 | 7 |
| 小王 | 7 |
| 总数 | 16 |
+--------------------------+--------------+
A 为左表,B 为右表
求两张表的交集,会丢弃掉没有等值关联的行
A独有+AB共有(交集)
显示 A 表的所有行,B 表对应 A 表中这些没有关联到的行用 null 显示
由于 mysql 中不支持 full outer join,所以这里通过 union 进行转换
AB并集 = AB交集+A独有+B独有
AB 独有 = A 独有 + B 独有
MySQL 的事务机制默认是自动提交的,我们可以通过手动 start transaction
来开启一个事务
作用:向日期添加指定的时间间隔。
格式:DATE_ADD(date,INTERVAL expr type)
date 参数是合法的日期表达式。expr 参数是你希望添加的时间间隔。
type 参数可以是下列值:
案例:
向 “OrderDate” 添加 45 天,这样就可以找到付款日期
SELECT OrderId,DATE_ADD(OrderDate,INTERVAL 45 DAY) AS OrderPayDate
FROM Orders
添加前:
执行结果:
作用:从日期减去指定的时间间隔
格式:DATE_SUB(date,INTERVAL expr type)
参数同上
作用:返回两个日期之间的天数
格式:DATEDIFF(date1,date2)
date1 和 date2 参数是合法的日期或日期/时间表达式
案例:
SELECT DATEDIFF('2008-11-30','2008-11-29') AS DiffDate
结果:
作用:以不同的格式显示日期/时间数据
格式:DATE_FORMAT(date,format)
date 参数是合法的日期。format 规定日期/时间的输出格式。
输出格式有:
案例:
使用 DATE_FORMAT() 函数来显示不同的格式。我们使用 NOW() 来获得当前的日期/时间
select
DATE_FORMAT(NOW(),'%b %d %Y %h:%i %p'),
DATE_FORMAT(NOW(),'%m-%d-%Y'),
DATE_FORMAT(NOW(),'%d %b %y'),
DATE_FORMAT(NOW(),'%d %b %Y %T:%f')
结果
作用:获取当前日期和时间
格式:NOW()
案例:
SELECT NOW(),CURDATE(),CURTIME();
结果
使用 NOW() 创建表时:
CREATE TABLE Orders (
OrderId int NOT NULL,
ProductName varchar(50) NOT NULL,
OrderDate datetime NOT NULL DEFAULT NOW(),
PRIMARY KEY (OrderId)
);
OrderDate 列规定 NOW() 作为默认值。作为结果,当你向表中插入行时,当前日期和时间会自动插入列中。
作用:返回当前的日期
格式:CURDATE()
同样的,CURDATE() 用于建表语句时,当你向表中插入行时,当前日期会自动插入列中。
作用:返回当前的时间
格式:CURTIME()
同样的,CURTIME() 用于建表语句时,当你向表中插入行时,当前时间会自动插入列中。
作用:提取日期或日期/时间表达式的日期部分
格式:DATE(date)
date 参数是合法的日期表达式。
案例:
SELECT ProductName, DATE(OrderDate) AS OrderDate
FROM Orders
WHERE OrderId=1
原来表中数据
结果
作用:返回日期/时间的单独部分,比如年、月、日、小时、分钟等等
格式:EXTRACT(unit FROM date)
date 参数是合法的日期表达式。unit 参数可以是下列的值:
案例:
SELECT EXTRACT(YEAR FROM OrderDate) AS OrderYear,
EXTRACT(MONTH FROM OrderDate) AS OrderMonth,
EXTRACT(DAY FROM OrderDate) AS OrderDay,
FROM Orders
WHERE OrderId=1
结果
作用:返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。
格式:CONCAT(str1,str2,…)
注意:
如果所有参数均为非二进制字符串,则结果为非二进制字符串。
如果自变量中含有任一二进制字符串,则结果为一个二进制字符串。
一个数字参数会被转化为与之相等的二进制字符串格式;若要避免这种情况,可使用显式类型 cast, 例如:
SELECT CONCAT(CAST(int_col AS CHAR), char_col)
MySQL的concat函数可以连接一个或者多个字符串,如:
select concat('10');
-- 结果
10select concat('11','22','33');
-- 结果
112233
MySQL的concat函数在连接字符串的时候,只要其中一个是NULL,那么将返回NULL
select concat('11','22',null);--结果
NULL
mysql向表中某字段后追加一段字符串
update table_name set field=CONCAT(field,'',str);
mysql 向表中某字段前加字符串
update table_name set field=CONCAT('str',field);
作用:CONCAT_WS() 代表 CONCAT With Separator ,是CONCAT()的特殊形式。第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。如果分隔符为 NULL,则结果为 NULL。另外,函数会忽略任何分隔符参数后的 NULL 值。
格式:CONCAT_WS(separator,str1,str2,...)
案例:
select concat_ws(',','11','22','33');
-- 结果
11,22,33-- 和MySQL中concat函数不同的是, concat_ws函数在执行的时候,不会因为NULL值而返回NULL
select concat_ws(',','11','22',NULL,'33');
--结果
11,22,33
作用:在分组后,会将同一组的值按要求拼接起来
格式:GROUP_CONCAT([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'])
案例:
表的内容为:
以id分组,把name字段的值打印在一行,逗号分隔(默认)
select id,group_concat(name) from aa group by id;-- 结果
+------+--------------------+
| id| group_concat(name) |
+------+--------------------+
|1 | 10,20,20|
|2 | 20 |
|3 | 200,500|
+------+--------------------+
以id分组,把name字段的值打印在一行,分号分隔
select id,group_concat(name separator ';') from aa group by id;-- 结果
+------+----------------------------------+
| id| group_concat(name separator ';') |
+------+----------------------------------+
|1 | 10;20;20 |
|2 | 20|
|3 | 200;500 |
+------+----------------------------------+
以id分组,把去冗余的name字段的值打印在一行,逗号分隔
select id,group_concat(distinct name) from aa group by id;-- 结果
+------+-----------------------------+
| id| group_concat(distinct name) |
+------+-----------------------------+
|1 | 10,20|
|2 | 20 |
|3 | 200,500 |
+------+-----------------------------+
以id分组,把name字段的值打印在一行,逗号分隔,以name排倒序
select id,group_concat(name order by name desc) from aa group by id;-- 结果
+------+---------------------------------------+
| id| group_concat(name order by name desc) |
+------+---------------------------------------+
|1 | 20,20,10 |
|2 | 20|
|3 | 500,200|
+------+---------------------------------------+
作用:用来复制字符串
格式:REPEAT(字符串,复制的份数)
案例:
将 ab 复制两份
select repeat('ab',2);-- 结果
+----------------+
| repeat('ab',2) |
+----------------+
| abab |
+----------------+
作用:从左开始截取字符串
格式:LEFT(被截取字段,截取长度)
案例:
select left(content,200) as abstract from my_content_t;
作用就是从右开始截取字符串,其他同上
案例:
select right(content,200) as abstract from my_content_t;
作用:截取字符串
格式:SUBSTRING(被截取字段,从第几位开始截取)
,SUBSTRING(被截取字段,从第几位开始截取,截取长度)
案例:
select substring(content,5) as abstract from my_content_t;select substring(content,5,200) as abstract from my_content_t;
注意:如果位数是负数 如-5 则是从后倒数位数,到字符串结束或截取的长度
SUBSTRING(str,pos) , SUBSTRING(str FROM pos) , SUBSTRING(str,pos,len) , SUBSTRING(str FROM pos FOR len):
不带有 len 参数的格式,表示从字符串str返回一个子字符串,起始于位置 pos。带有len参数的格式从字符串str返回一个长度为len的子字符串,起始于位置 pos。 使用 FROM的格式为标准 SQL 语法。也可让pos使用一个负值。假若这样,则子字符串的位置起始于字符串结尾的pos 字符,而不是字符串的开头位置。
作用:按关键字截取字符串
格式:SUBSTRING_INDEX(被截取字段,关键字,关键字出现的次数)
案例:
select substring_index("www.w3cschool",".",2) as abstract;-- 结果
www.w3cschool
注意:如果关键字出现的次数是负数 如-2 则是从后倒数,到字符串结束
SELECT - 2;-- 结果
-2
注意,如果这个操作符被用于一个 BIGINT,返回值也是一个 BIGINT!这就意味着,应该避免在一个可能有值 -2^63 的整数上使用 - 操作符
作用:返回 X 的绝对值
案例:
SELECT ABS(2);
-- 结果
2 SELECT ABS(-32);
-- 结果
32
作用:以 -1 、 0 或 1 的方式返回参数的符号,它取决于参数 X 是负数、0 或正数。
案例:
SELECT SIGN(-32);
-- 结果
-1 SELECT SIGN(0);
-- 结果
0 SELECT SIGN(234);
-- 结果
1
作用:取模 (就如 C 中的 % 操作符)。返回 N 被 M 除后的余数
案例:
SELECT MOD(234, 10);
-- 结果
4SELECT 253 % 7;
-- 结果
1 SELECT MOD(29,9);
-- 结果
2SELECT 29 MOD 9;
-- 结果
2
作用:返回不大于 X 的最大整数值
案例:
SELECT FLOOR(1.23);
-- 结果
1SELECT FLOOR(-1.23);
-- 结果
-2
注意,返回值被转换为一个 BIGINT
作用:返回不小于 X 的最小整数
案例:
SELECT CEILING(1.23);
-- 结果
2SELECT CEILING(-1.23);
-- 结果
-1
注意,返回值被转换为一个 BIGINT
作用:将参数 X 四舍五入到最近的整数,然后返回。两个参数的形式是将一个数字四舍五入到 D 个小数后返回。
案例:
SELECT ROUND(-1.23);
-- 结果
-1 SELECT ROUND(-1.58);
-- 结果
-2 SELECT ROUND(1.58);
-- 结果
2 SELECT ROUND(1.298, 1);
-- 结果
1.3SELECT ROUND(1.298, 0);
-- 结果
1
注意,当参数在两个整数之间时, ROUND() 的行为取决于 C 库的实现。某些取整到最近的偶数,总是向下取,总是向上取,也可能总是接近于零。如果你需要某种取整类型,应该使用一个明确定义的函数比如 TRUNCATE() 或 FLOOR() 代替。
作用:删除,类似于 FLOOR() ,但是它可安全地用于 BIGINT 值。
案例:
SELECT 5 DIV 2-- 结果
2
作用:返回值 e (自然对数的底) 的 X 次方
案例:
SELECT EXP(2);
-- 结果:e 的平方
7.389056SELECT EXP(-2);
-- 结果
0.135335
作用:返回 X 的自然对数
案例:
SELECT LN(2);
-- 结果:e的 0.693147 次方等于 2
0.693147 SELECT LN(-2);
-- 结果:e的多少次方都是正数
NULL
作用:如果以一个参数调用,它返回 X 的自然对数(e 就是自然对数);如果以两个参数调用,这个函数返回 X 任意底 B 的对数
案例:
SELECT LOG(2);
-- 结果:e的 0.693147 次方等于 2
0.693147 SELECT LOG(-2);
-- 结果:e的多少次方都是正数
NULL
SELECT LOG(2,65536);
-- 结果:2 的 16 次方等于 65536
16.000000 SELECT LOG(1,100);
-- 结果:1 的任意次方都等于 1,不可能等于 100
NULL
作用:返回 X 的以 2 为底的对数
案例:
SELECT LOG2(65536);
-- 结果:2的16次方等于65536
16.000000SELECT LOG2(-100);
-- 结果
NULL
LOG2() 通常可以用于计数出一个数字需要多少个比特位用于存储它。这个函数在 MySQL 4.0.3 中被添加。在更早的版本中,可以使用 LOG(X)/LOG(2) 来代替它。
作用:返回 X 以 10 为底的对数
案例:
SELECT LOG10(2);
-- 结果
0.301030 SELECT LOG10(100);
-- 结果
2.000000 SELECT LOG10(-100);
-- 结果
NULL
作用:返回 X 的 Y 幂
案例:
SELECT POW(2,2);
-- 结果
4.000000 SELECT POW(2,-2);
-- 结果
0.250000
作用:返回 X 的非负平方根
案例:
SELECT SQRT(4);
-- 结果
2.000000 SELECT SQRT(20);
-- 结果
4.472136
作用:返回 PI 值(圆周率)。缺少显示 5 位小数,但是在 MySQL 内部,为 PI 使用全部的双精度
案例:
SELECT PI();
-- 结果:返回的只显示五位
3.141593 SELECT PI()+0.000000000000000000;
-- 结果:但实际参与运算的是双精度范围内的数,双精度有8个字节
3.141592653589793116
作用:返回 X 的余弦
案例:
SELECT COS(PI());--结果
-1.000000
作用: 返回 X 的正弦
案例:
SELECT SIN(PI());--结果
0.000000
作用:返回 X 的正切
案例:
SELECT TAN(PI()+1);--结果
1.557408
作用:返回 X 的反余弦,更确切地说,返回余弦值为 X 的值。如果 X 不在 -1 到 1 之间的范围内,返回 NULL
案例:
SELECT ACOS(1);
-- 结果
0.000000 SELECT ACOS(1.0001);
-- 结果
NULL SELECT ACOS(0);
-- 结果
1.570796
作用:返回 X 的反正弦,更确切地说,返回正弦值为 X 的值。如果 X 不在 -1 到 1 之间的范围内,返回 NULL
案例:
SELECT ASIN(0.2);
-- 结果
0.201358 SELECT ASIN('foo');
-- 结果
0.000000
作用:返回 X 的反正切,更确切地说,返回正切值为 X 的值
案例:
SELECT ATAN(2);
-- 结果
1.107149 SELECT ATAN(-2);
-- 结果
-1.107149
作用:返回两个变量 X 和 Y 的反正切。它类似于计算 Y / X 的反正切,除了两个参数的符号用于决定结果的象限
案例:
SELECT ATAN(-2,2);
-- 结果
-0.785398 SELECT ATAN2(PI(),0);
-- 结果
1.570796
作用:返回 X 的余切
案例:
SELECT COT(12);
-- 结果
-1.57267341 SELECT COT(0);
-- 结果
NULL
作用:返回一个范围在 0 到 1.0 之间的随机浮点值。如果一个整数参数 N 被指定,它被当做种子值使用(用于产生一个可重复的数值)
案例:
SELECT RAND();
-- 结果
0.9233482386203SELECT RAND(20);
-- 结果:指定了种子
0.15888261251047 SELECT RAND(20);
-- 结果:指定种子是20.无论调用多少次,都是产生相同的值
0.15888261251047 SELECT RAND();
-- 结果
0.63553050033332 SELECT RAND();
-- 结果
0.70100469486881
在一个 ORDER BY 子句中,不可以使用 RAND() 值使用一个列,因为 ORDER BY 将多次重复计算列。从 MySQL 3.23 开始,你可以使用: SELECT * FROM table_name ORDER BY RAND()
,这有利于得到一个来自 SELECT * FROM table1,table2 WHERE a=b AND c<d ORDER BY RAND() LIMIT 1000
的集合中的随机样本。 注意,在一个 WHERE 子句中的 RAND() 将在每次 WHERE 执行时被重新计算。 RAND() 并不是预期完美的随机数发生器,但是可以代替做为产生特别的随机数一个快速的方法,这样便于在两个不同平台下的同一 MySQL 版本间移动。
作用:有两个或更多个参数,返回最小(最小值)的参数。
参数使用下列规则进行比较:
案例:
SELECT LEAST(2,0);
-- 结果
0 SELECT LEAST(34.0,3.0,5.0,767.0);
-- 结果
3.0 SELECT LEAST("B","A","C");
-- 结果
"A"
在早于 MySQL 3.22.5 的版本中,你可以使用 MIN() 代替 LEAST()
作用:返回最大(最大值)参数。
参数使用与 LEAST 一致的规则进行比较
案例:
SELECT GREATEST(2,0);
-- 结果
2 SELECT GREATEST(34.0,3.0,5.0,767.0);
-- 结果
767.0SELECT GREATEST("B","A","C");
-- 结果
"C"
在早于 MySQL 3.22.5 的版本中,可以使用 MAX() 代替 GREATEST()。
作用:将参数 X 从弧度转换为角度,然后返回
案例:
SELECT DEGREES(PI());-- 结果
180.000000
作用:将参数 X 从角度转换为弧度,然后返回
案例:
SELECT RADIANS(90);-- 结果
1.570796
作用:将数值 X 截到 D 个小数,然后返回。如果 D 为 0 ,结果将不包含小数点和小数部分
案例:
SELECT TRUNCATE(1.223,1);
-- 结果
1.2 SELECT TRUNCATE(1.999,1);
-- 结果
1.9 SELECT TRUNCATE(1.999,0);
-- 结果
1 SELECT TRUNCATE(-1.999,1);
-- 结果
-1.9
从 MySQL 3.23.51 开始,所有数字被四舍五入到零。 如果 D 是负数,那么数字的整个部分被对准零位输出
SELECT TRUNCATE(122,-1);
-- 结果
120SELECT TRUNCATE(122,-2);
-- 结果
100SELECT TRUNCATE(122,-3);
-- 结果
0
注意,十进值小数在计算机中通常不以精确数字存储,而是双精度型的值,你可能会被下列结果所愚弄:
SELECT TRUNCATE(10.28*100,0);--结果
1027
-- 我的测试结果是 1028
上面结果的发生是因为 10.28 实际上是以某些像 10.2799999999999999 的形式被存储的。
作用:返回原字符串的子字符串,该字符串是原字符串从<始>位置开始,长度为<长>的一段。如果没有指定<长>或指定得超过字符串长度,则子字符串从<始>位置一直取到原字符串尾。如果所指定的位置不能返回字符串,则返回空字符串。
格式:SUBSTR(string string,num start,num length)
string为字符串;start为起始位置(若为负数则表示从末尾开始);length为长度。注意:mysql中的start是从1开始的。
案例:
-- 查出kename字段中第一次出现`.`之前的字符串
select kename,substr(kename,1,locate('.',kename)) as subkename from web_dev_api where 1;-- 截取末尾两位
select substr(kename,-2,2);
索引是一种可以帮助 数据库(MySQL)高效获取数据的一种数据结构,它会以某种方式指向数据,从而可以在这些数据结构上实现一些高级查找算法。索引的目的是为了提高查询效率,就好像书的目录一样
没有特殊指明,索引默认使用 B 树, 聚集索引、次要索引、覆盖索引、前缀索引、唯一索引默认都是用 B 树
优缺点
优点:
缺点:
是否建立索引
主键索引
当一张表,把某个列设为主键的时候,则该列就是主键索引,下面的id 列就是主键索引
create table user
(id int unsigned primary key auto_increment ,
name varchar(32) not null defaul ‘’);
如果你创建表时,没有指定主键索引,也可以在创建表后,再添加, 指令:
alter table 表名 add primary key (列名);//举例
alter table user add primary key (id);
普通索引
一般来说,普通索引的创建,是先创建表,然后在创建普通索引。比如:
create table user(
id int unsigned,
name varchar(32)
)create index 索引名 on 表 (列1,列名2);
全文索引
全文索引,主要是针对对文件、文本的检索, 比如文章, 全文索引针对MyISAM有用。创建如下:
CREATE TABLE articles (id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,title VARCHAR(200),body TEXT,FULLTEXT (title,body))engine=myisam charset utf8;
注意:
唯一索引
当表的某列被指定为unique约束时,这列就是一个唯一索引
// 创建
create table user(id int primary key auto_increment , name varchar(32) unique);
这时, name 列就是一个唯一索引,unique字段可以为NULL,并可以有多NULL, 但是如果是具体内容,则不能重复,主键字段,不能为NULL,也不能重复。
创建唯一索引的另一种方式:
create table user(id int primary key auto_increment, name varchar(32));create unique index 索引名 on 表名 (列表..);
查询索引
desc 表名 //不能够显示索引名
show index(es) from 表名
show keys from 表名
删除索引
alter table 表名 drop index 索引名; //如果删除主键索引。
alter table 表名 drop primary key
由于索引本身很大,占用磁盘空间,对dml操作有影响,变慢,满足以下条件的字段,才应该创建索引。
- 肯定在where条经常使用
- 该字段的内容不是唯一的几个值
- 字段内容不是频繁变化
使用脚本进行大数据量的批量插入,对特定情况下测试数据集的建立非常有用。
create table Student(s_no char(6) primary key,class_no char(6) not null,s_name varchar(10) not null,s_sex char(2) check(s_sex in ('男','女')),s_birthday datetime
);create table Class(
class_no char(6) primary key,
class_name char(20) not null,
class_special varchar(20),
class_dept char(20)
);create table Course(course_no char(5) primary key,course_name char(20) not null,course_score numeric(6,2)
);create table Choise(s_no char(6),course_no char(5),score numeric(6,1)
);CREATE TABLE Teacher(t_no CHAR(6) PRIMARY KEY,t_name VARCHAR(10) NOT NULL,t_sex SET('男','女'),t_birthday DATETIME,t_title CHAR(10)
);create table Teaching(course_no char(5),t_no char(6)
);insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('991101','js9901','张彬','男','1981-10-1');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('991102','js9901','王蕾','女','1980-8-8');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('991103','js9901','李建国','男','1981-4-5');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('991104','js9901','李平方','男','1981-5-12');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('991201','js9902','陈东辉','男','1980-2-8');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('991202','js9902','葛鹏','男','1979-12-23');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('991203','js9902','潘桃枝','女','1980-2-6');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('991204','js9902','姚一峰','男','1981-5-7');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('001101','js0001','宋大芳','男','1980-4-9');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('001102','js0001','许辉','女','1978-8-1');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('001201','js0002','王一山','男','1980-12-4');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('001202','js0002','牛莉','女','1981-6-9');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('002101','xx0001','李丽丽','女','1981-9-19');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('002102','xx0001','李王','男','1980-9-23');insert into Class(class_no,class_name,class_special,class_dept) values('js9901','计算机99-1','计算机','计算机系');
insert into Class(class_no,class_name,class_special,class_dept) values('js9902','计算机99-2','计算机','计算机系');
insert into Class(class_no,class_name,class_special,class_dept) values('js0001','计算机00-1','计算机','计算机系');
insert into Class(class_no,class_name,class_special,class_dept) values('js0002','计算机00-2','计算机','计算机系');
insert into Class(class_no,class_name,class_special,class_dept) values('xx0001','信息00-1','信息','信息系');
insert into Class(class_no,class_name,class_special,class_dept) values('xx0002','信息00-2','信息','信息系');insert into Course(course_no,course_name,course_score) values('01001','计算机基础',3);
insert into Course(course_no,course_name,course_score) values('01002','程序设计语言',5);
insert into Course(course_no,course_name,course_score) values('01003','数据结构',6);
insert into Course(course_no,course_name,course_score) values('02001','数据库原理与应用',6);
insert into Course(course_no,course_name,course_score) values('02002','计算机网络',6);
insert into Course(course_no,course_name,course_score) values('02003','微机原理与应用',8);insert into Choise(s_no,course_no,score) values('991101','01001',88.0);
insert into Choise(s_no,course_no,score) values('991102','01001',);
insert into Choise(s_no,course_no) values('991103','01001',91.0);
insert into Choise(s_no,course_no,score) values('991104','01001',78.0);
insert into Choise(s_no,course_no,score) values('991201','01001',67.0);
insert into Choise(s_no,course_no,score) values('991101','01002',90.0);
insert into Choise(s_no,course_no,score) values('991102','01002',58.0);
insert into Choise(s_no,course_no,score) values('991103','01002',71.0);
insert into Choise(s_no,course_no,score) values('991104','01002',85.0);insert into Teacher(t_no,t_name,t_sex,t_birthday,t_title) values('000001','李英','女','1964-11-3','讲师');
insert into Teacher(t_no,t_name,t_sex,t_birthday,t_title) values('000002','王大山','男','1955-3-7','副教授');
insert into Teacher(t_no,t_name,t_sex,t_birthday,t_title) values('000003','张朋','男','1960-10-5','讲师');
insert into Teacher(t_no,t_name,t_sex,t_birthday,t_title) values('000004','陈为军','男','1970-3-2','助教');
insert into Teacher(t_no,t_name,t_sex,t_birthday,t_title) values('000005','宋浩然','男','1966-12-4','讲师');
insert into Teacher(t_no,t_name,t_sex,t_birthday,t_title) values('000006','徐红霞','女','1951-5-8','副教授');
insert into Teacher(t_no,t_name,t_sex,t_birthday,t_title) values('000007','徐永军','男','1948-4-8','教授');
insert into Teacher(t_no,t_name,t_sex,t_birthday,t_title) values('000008','李桂清','女','1940-11-3','教授');
insert into Teacher(t_no,t_name,t_sex,t_birthday,t_title) values('000009','王一帆','女','1962-5-9','讲师');
insert into Teacher(t_no,t_name,t_sex,t_birthday,t_title) values('000010','田丰','男','1972-11-5','助教');insert into Teaching(course_no,t_no) values('01001','000001');
insert into Teaching(course_no,t_no) values('01002','000002');
insert into Teaching(course_no,t_no) values('01003','000002');
insert into Teaching(course_no,t_no) values('02001','000003');
insert into Teaching(course_no,t_no) values('02002','000004');
insert into Teaching(course_no,t_no) values('01001','000005');
insert into Teaching(course_no,t_no) values('01002','000006');
insert into Teaching(course_no,t_no) values('01003','000007');
insert into Teaching(course_no,t_no) values('02001','000007');
insert into Teaching(course_no,t_no) values('02002','000008');#查询所有学生的基本信息
select s_no,class_no,s_name,s_sex,s_birthday from Student;
#查询所有学生 显示学号姓名
select s_no,s_name from Student;
#查询男同学 显示学号姓名出生日期
select s_no,s_name,s_birthday from Student where s_sex = '男';
#查询出生日期在80-1-1前女学生
select s_no,class_no,s_name,s_sex,s_birthday from Student where s_sex='女' and s_birthday<'1980-01-01';
#查询李姓男学生
select s_no,class_no,s_name,s_sex,s_birthday from Student where s_sex='男' and s_name like "李%";
#查询名字含一
select s_no,class_no,s_name,s_sex,s_birthday from Student where s_name like "%一%";
#查询职称不是讲师
select t_no,t_name,t_sex,t_birthday,t_title from Teacher where t_title != '讲师';
#查询未参加考试的学生
SELECT co.s_name
FROM(SELECT s.s_name s_name,c.score scoreFROM student s LEFT JOIN choise cON s.`s_no` = c.`s_no`) co
WHERE co.score IS NULL;
#查询考试不及格的学生并按成绩排序
SELECT co.*
FROM (SELECT s.*,c.score scoreFROM student sLEFT JOIN choise c ON s.`s_no` = c.`s_no`) co
WHERE co.score < 60.0 OR co.score IS NULL
ORDER BY co.score;
#查询课程号为01001 02001 02003所有课程
select course_no,course_name,course_score from Course where course_no in ('01001','02001','02003');
#查询1970年出生的讲师
SELECT *
FROM teacher
WHERE t_birthday >= '1970-01-01 00:00:00' AND t_birthday < '1971-01-01 00:00:00';
#查询各课程号选修人数
select course_no,count(course_no) from Choise group by course_no ;
#查询教授两门课程以上的讲师
select t_no,count(course_no) from Teaching group by t_no having count(course_no)=>2 ;
#查询01001平均分最低分最高分
select avg(score),min(score),max(score) from Choise where course_no = '01001';
#查询1960年后出生职称为讲师并按出生日期升序
select t_no,t_name,t_sex,t_birthday,t_title from Teacher where t_birthday > '1960' and t_title = '讲师' ORDER BY t_birthday ASC;
#查询所有学生选课和成绩s_no s_name course_no score
select Student.s_no,s_name,course_no,score from Student join Choise on Student.s_no = Choise.s_no;
#查询计算机99-1同学的选课及成绩s_no s_name course_no course_name score
select Student.s_no,s_urse_no,course_name,score from Student join Choise,Course,Class where Student.s_no = Choise.s_no urse_no = urse_no and Student.class_no = Class.class_no and Class.class_name = '计算机99-1';
#查询所有学生及格科目
select Student.s_no,s_urse_no,course_name,score from Student join Choise,Course where Student.s_no = Choise.s_no urse_no = urse_no and Choise.score >= 60;
#查询所有学生平均成绩和所选科目数
select Student.s_no,s_name,avg(score),count(score) from Choise join Student where Student.s_no = Choise.s_no group by s_no;
#查询未参加考试的学生和课程
select Student.s_no,s_urse_no,course_name,score from Choise join Student,Course urse_no = urse_no and Student.s_no = Choise.s_no and score is NULL;
#查询不及格的学生和课程
select Student.s_no,s_urse_no,course_name,score from Choise join Student,Course urse_no = urse_no and Student.s_no = Choise.s_no and score < 60;
#查询"程序设计语言"的所有同学和成绩 ANY
select s_name,score from Student,Choise where course_no = any(select course_no from Course where course_name = '程序设计语言') and Student.s_no = Choise.s_no;
#查询所有教师的任课
select t_name,course_name from Teaching,Teacher,Course where Teacher.t_no = Teaching.t_no urse_no = urse_no;
#查询李建国的同学 子查询
select s_name from Student where class_no = (select class_no from Student where s_name = '李建国') and s_name != '李建国';
#查询没有选修计算机基础NOTEXISTS
select s_name from Student,Choise where NOT EXISTS (select course_no from Course where course_name = '计算机基础' and course_no = urse_no) and Student.s_no = Choise.s_no;
#查询主讲数据库原理和应用和主讲数据结构的教师姓名 UNION
select t_name from Teacher,Teaching,Course where Teacher.t_no = Teaching.t_no urse_no = urse_no urse_name = '数据库原理与应用' UNION select t_name from Teacher,Teaching,Course where Teacher.t_no = Teaching.t_no urse_no = urse_no urse_name = '数据结构';
#插入学生的存储过程
delimiter $$
create procedure insertStudent(in s_no char(6),in class_no char(6),in s_name varchar(10),in s_sex char(2),in s_birthday datetime
)
begin
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values(s_no,class_no,s_name,s_sex,s_birthday);
end$$
delimiter ;
#插入课程 学分默认2
#delimiter $$
#create procedure insertCourse(
#in course_no char(5),
#in course_name char(20),
#in course_score numeric(6,2) DEFAULT 2
#)
#begin
#insert into Course(course_no,course_name,course_score) values(course_no,course_name,course_score);
#end$$
#delimiter ;
#根据姓名查询学生信息
delimiter $$
create procedure queryStudent(in name varchar(10)
)
begin
select s_no,s_name from Student where s_name = name;
end$$
delimiter ;
#触发器
drop trigger StudentTrigger;
delimiter $$
create trigger StudentTrigger
AFTER INSERT ON Student FOR EACH ROW
begin
select NEW.s_no into @arg1;
select NEW.s_name into @arg2;
end$$
delimiter ;
本文发布于:2024-01-31 12:07:56,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170667407628408.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |