您的位置:首页 > 数据库 > MySQL

MySQL学习1 基础入门

2016-05-30 00:00 771 查看
摘要: mysql ,入门 基础

1.4.3 建立和断开MySQL服务器连接
#mysql -h host_name -p -u user_name
--host=host_name or -hhost_name
--user=user_name or -uuser_name
--password=your_pass or -pyour_pass 不能有空格在-p与your_pass之间
#mysql -h host_name -p -u user_name DATABASE_NAME
退出MySQL终止会话
mysql>quit
mysql>exit
mysql>\q

1.4.4执行SQL语句
mysql>SELECT NOW();
mysql>SELECT NOW()\g
mysql>SELECT NOW(),USER(),VERSION()\G

mysql>SELECT NOW(),
->USER(),
->VERSION()
->;

mysql>SELECT NOW(),
->VERSION(),
->\c
mysql>

mysql>SELECT NOW();SELECT USER();SELECT VERSION();

mysql>SELECT NOW();
mysql>select now();
mysql>SeLeCt UsEr();

#mysql < myscript.sql
#mysql sampdb < create_president.sql
#mysql -u user_name -p -h host_name DATABASE_NAME < myscript.sql

1.4.5创建数据库
mysql>CREATE DATABASE sampdb;
mysql>SELECT DATABASE();
mysql>USE sampdb;
mysql>SELECT DATABASE();
#mysql -h cobra.example.com -p -u sampadm sampdb

1.4.6创建表
mysql>CREATE TABLE tb1_name (column_specs);
# Create president table for U.S. Historical League
DROP TABLE IF EXISTS president;
#@ _CREATE_TABLE_
CREATE TABLE president
(
last_name VARCHAR(15) NOT NULL,
first_name VARCHAR(15) NOT NULL,
suffix VARCHAR(5) NULL,
city VARCHAR(20) NOT NULL,
state VARCHAR(2) NOT NULL,
birth DATE NOT NULL,
death DATE NULL
);
#@ _CREATE_TABLE_

# Create member table for U.S. Historical League
DROP TABLE IF EXISTS member;
#@ _CREATE_TABLE_
CREATE TABLE member
(
member_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (member_id),
last_name VARCHAR(20) NOT NULL,
first_name VARCHAR(20) NOT NULL,
suffix VARCHAR(5) NULL,
expiration DATE NULL,
email VARCHAR(100) NULL,
street VARCHAR(50) NULL,
city VARCHAR(50) NULL,
state VARCHAR(2) NULL,
zip VARCHAR(10) NULL,
phone VARCHAR(20) NULL,
interests VARCHAR(255) NULL
);
#@ _CREATE_TABLE_

# create student table for grade-keeping project
DROP TABLE IF EXISTS student;
#@ _CREATE_TABLE_
CREATE TABLE student
(
name VARCHAR(20) NOT NULL,
sex ENUM('F','M') NOT NULL,
student_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (student_id)
) ENGINE=InnoDB;
#@ _CREATE_TABLE_

# create grade event table for grade-keeping project
DROP TABLE IF EXISTS grade_event;
#@ _CREATE_TABLE_
CREATE TABLE grade_event
(
date DATE NOT NULL,
category ENUM('T','Q') NOT NULL,
event_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (event_id)
) ENGINE=InnoDB;
#@ _CREATE_TABLE_

# create score table for grade-keeping project

# The PRIMARY KEY comprises two columns to prevent any combination
# of event_id/student_id from appearing more than once.

DROP TABLE IF EXISTS score;
#@ _CREATE_TABLE_
CREATE TABLE score
(
student_id INT UNSIGNED NOT NULL,
event_id INT UNSIGNED NOT NULL,
score INT NOT NULL,
PRIMARY KEY (event_id, student_id),
INDEX (student_id),
FOREIGN KEY (event_id) REFERENCES grade_event (event_id),
FOREIGN KEY (student_id) REFERENCES student (student_id)
) ENGINE=InnoDB;
#@ _CREATE_TABLE_

# create absence table for grade-keeping project
DROP TABLE IF EXISTS absence;
#@ _CREATE_TABLE_
CREATE TABLE absence
(
student_id INT UNSIGNED NOT NULL,
date DATE NOT NULL,
PRIMARY KEY (student_id, date),
FOREIGN KEY (student_id) REFERENCES student (student_id)
) ENGINE=InnoDB;
#@ _CREATE_TABLE_

mysql>DESCRIBE president;
mysql>DESC president;
mysql>EXPLAIN president;
mysql>SHOW COLUMNS FROM president; <=> mysql>SHOW FIELDS FROM president;
mysql>SHOW COLUMNS FROM president LIKE '%name';
mysql>SHOW FIELDS FROM president LIKE '%name';
mysql>DESCRIBE president '%name';
mysql>SHOW FULL COLUMNS FROM president

mysql>SHOW TABLES;
mysql>SHOW DATABASES;
#mysqlshow
#mysqlshow sampdb;
#mysqlshow sampdb member <=> mysql>SHOW FULL COLUMNS FROM memnber;

mysql>SELECT student.name,grade_event.date,score.score,grade_event.category
->FROM grade_event INNER JOIN score INNER JOIN student
->ON grade_event.event_id = score.event_id AND score.student_id = student.student_id
->WHERE grade_event.date = '2012-09-23';

1.4.7添加新行
mysql>SELECT * FROM tb1_name;
1 INSERT INTO tbl_name VALUES(value1,value2,...);
mysql>INSERT INTO student VALUES('Kyle','M',NULL);
2 INSERT INTO tblname VALUES(...),(...),...;
mysql> INSERT INTO student VALUES ('Avery','F',NULL),('Nathan','M',NULL);
3 INSERT INTO tbl_name (col_name1,colname2,...) VALUES(value1,value2,...);
mysql> INSERT INTO member (last_name,first_name) VALUES('Stein','Waldo');
mysql> INSERT INTO student (name,sex) VALUES ('Abby','F'),('Joseph','M');
4 INSERT INTO tbl_name SET col_name1=value1,col_name2=value2, ...;
mysql> INSERT INTO member SET last_name='Stein',first_name='Waldo';
5 利用文件添加新行
1 #mysql sampdb < insert_president.sql <=> mysql> source insert_president.sql
注意:LOAD DATA语句里的关键字LOCAL会引发客户端程序(mysql)读取数据文件,并把文件内容发送到服务器进行加载,如果省略LOCAL,那么数据文件必须存放在于服务器主机上,并且你需要拥有FILE服务器访问权限(大部分MySQL用户都没有这样的权限)。另外,你还要指定完整的文件路径,以便服务器能找到它。如果使用LOAD DATA语句遇到以下错误:
mysql>LOAD DATA LOCAL INFILE 'member.txt' INTO TABLE member;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'mysql>LOAD DATA LOCAL INFILE 'member.txt' INTO TABLE member' at line 1
#mysql -p -u sampadm --local--infile sampdb //此时不会报错
若依然报错则说明服务器在启动时需要带上--local-infile选项
2 #mysqlimport --local sampdb member.txt
mysqlimport程序时按照文件的名字来确定表名的,同时它会把文件名中第一个句号(.)之前的所有内容都当作表名。例如,mysqlimport 会把名为member.txt和president.txt的文件分别加载到member表和president表里。

1.4.8 重置sampdb数据库
#cd /home/share/sampdb
#mysql -p -u sampadm sampdb
mysql>source create_member.sql;
mysql>source create_president.sql;
mysql>source create_member.sql;
mysql>source insert_president.sql;
mysql>DROP TABLE IF EXISTS absence,score,grade_event,student;
mysql>source create_student.sql;
mysql>source create_grade_event.sql;
mysql>source create_score.sql;
mysql>source create_absence.sql;
mysql>source insert_student.sql;
mysql>source insert_grade_event.sql;
mysql>source insert_score.sql;
mysql>source insert_absence.sql;
或者#sh /home/share/sampdb/init_all_tables.sh sampdb

1.4.9 检索信息
mysql>SELECT * FROM president;
mysql>SELECT birth FROM president WHERE last_name = 'Eisenhower';
mysql>SELECT 2+2,'Hello,world'.VERSION();
mysql>SELECT * FROM student;
mysql>SELECT name FROM student;
mysql>SELECT name,sex,student_id FROM student;
mysql>SELECT name,student_id,FROM student;
mysql>SELECT student_id,name,FROM student;
在MySQL里列名不区分大小写,因此下面这些检索语句都是等价的
mysql>SELECT name,student_id,FROM student;
mysql>SELECT NAME,STUDENT_ID,FROM student;
mysql>SELECT nAme,sTuDeNt_Id FROM student;
另一方面,数据库名和表名可能是区分大小写的。具体情况取决于服务器主机所使用的文件系统,以及MySQL的配置。Windows系统的文件名不区分大小写,所以运行在它上面的服务器也不区分数据库名和表名的大小写。在Unix系统上,文件名通常都区分大小写,因此运行在它上面的服务器会区分数据库名和表名的大小写。Mac OS X系统的扩展文件系统比较特殊,它不区分大小写。如果想让MySQL服务器不区分数据库名和表明的大小写,那么可以对它进行配置。

1.4.9.1 指定检索条件
mysql>SELECT * FROM score WHERE score > 95;
对于默认的字符集和排序方式,字符串的比较操作通常不区分大小写:
mysql>SELECT last_name,first_name,FROM president WHERE last_name='ROOSEVELT';
mysql>SELECT last_name,first_name,FROM president WHERE last_name='roosevelt';
mysql>SELECT last_name,first_name,birth FROM president WHERE birth < '1750-1-1';
mysql>SELECT last_name,first_name,birth,state FROM president WHERE birth < '1750-1-1' AND (state='VA' OR state='MA');
mysql> SELECT last_name,first_name,state FROM president WHERE state='VA' OR state='MA';
mysql> SELECT last_name,first_name,state FROM president WHERE state IN ('VA','MA');

1.4.9.2 NULL值
NULL值很特殊。其含义是"无值"或“未知值“
mysql> SELECT NULL < 0,NULL = 0,NULL <> 0,NULL > 0;
+----------+----------+-----------+----------+
| NULL < 0 | NULL = 0 | NULL <> 0 | NULL > 0 |
+----------+----------+-----------+----------+
| NULL | NULL | NULL | NULL |
+----------+----------+-----------+----------+
mysql> SELECT NULL = NULL,NULL <> NULL;
+-------------+--------------+
| NULL = NULL | NULL <> NULL |
+-------------+--------------+
| NULL | NULL |
+-------------+--------------+
找到目前仍健在的美国总统
mysql> SELECT last_name,first_name FROM president WHERE death IS NULL;
mysql> SELECT last_name,first_name FROM president WHERE death <=> NULL;
找到那些有后缀名的名字
mysql> SELECT last_name,first_name,suffix FROM president WHERE suffix IS NOT NULL;
mysql> SELECT last_name,first_name,suffix FROM president WHERE NOT (suffix <=> NULL);

1.4.9.3 对查询结果排序
mysql>SELECT last_name,first_name FROM president ORDER BY last_name; //升序
mysql>SELECT last_name,first_name FROM president ORDER BY last_name DESC; //降序
在一个列里,对于升序排序,NULL值总是出现在开头,而对于降序排序,它总是出现在末尾。为确保NULL值出现在指定排列顺序的末尾,需要额外增加一个可以区分NULL值和非NULL值的排序列;
ORDER BY子句的默认排序方式是升序排序。在其中的列名后面加上关键字ASC或DESC,所以以下两句是等价的。
mysql> SELECT last_name,first_name,death FROM president ORDER BY IF(death IS NULL,0,1),death DESC,last_name;
mysql> SELECT last_name,first_name,death FROM president ORDER BY IF(death IS NULL,0,1) ASC,death DESC,last_name;
以下一句是先以0,1降序,在以death值降序,最后以last_name值升序。
mysql> SELECT last_name,first_name,death FROM president ORDER BY IF(death IS NULL,0,1) DESC ,death DESC,last_name;

1.4.9.4 限制查询结果
mysql> SELECT last_name,first_name,birth FROM president ORDER BY birth LIMIT 5;
mysql> SELECT last_name,first_name,birth FROM president ORDER BY birth DESC LIMIT 5;
mysql> SELECT last_name,first_name,birth FROM president ORDER BY birth DESC LIMIT 10,5;
随机抽取出一行或几行,那么可以联合使用LIMIT子句和ORDER BY RAND()子句
mysql> SELECT last_name,first_name,birth FROM president ORDER BY RAND() LIMIT 1;
mysql> SELECT last_name,first_name,birth FROM president ORDER BY RAND() LIMIT 3;

1.4.9.5对输出列进行计算和命名
mysql> SELECT 17,FORMAT(SQRT(25+13),3); //SQRT(n)为数字n的平方根,FORMAT(m,n)保留数m的n位小数;
mysql> SELECT CONCAT(first_name,' ',last_name),CONCAT(city,', ',state) FROM president;
mysql> SELECT CONCAT(first_name,' ',last_name) AS Name,CONCAT(city,', ',state) AS Birthplace FROM president; //AS别名
mysql> SELECT CONCAT(first_name,' ',last_name) AS 'President Name',CONCAT(city,', ',state) AS 'Place of Birth' FROM president;
mysql> SELECT CONCAT(first_name,' ',last_name) 'President Name',CONCAT(city,', ',state) 'Place of Birth' FROM president;
可以省略了关键字AS
mysql> SELECT 1 one,2 two,3 three;
+-----+-----+-------+
| one | two | three |
+-----+-----+-------+
| 1 | 2 | 3 |
+-----+-----+-------+
如果一个查询结果的列名有误,或者有列丢失,那么请检查在某两列之间是否忘了加上逗号。如果真是这种情况,那么第二列会被当成第一列的别名。如:
mysql> SELECT first_name last_name FROM president;

1.4.9.6 处理日期
mysql> SELECT * FROM grade_event WHERE date='2012-10-01';
+------------+----------+----------+
| date | category | event_id |
+------------+----------+----------+
| 2012-10-01 | T | 6 |
+------------+----------+----------+
mysql> SELECT last_name,first_name,death FROM president WHERE death >= '1970-01-01' AND death < '1980-01-01';
+-----------+------------+------------+
| last_name | first_name | death |
+-----------+------------+------------+
| Truman | Harry S | 1972-12-26 |
| Johnson | Lyndon B. | 1973-01-22 |
+-----------+------------+------------+
YEAR(),MONTH(),MONTHNAME(),DAYOFMONTH(),CURDATE();TIMESTAMPDIFF(),DATE_ADD(),DATE_SUB();

1 Name: 'TIMESTAMPADD'
Description:
Syntax:
TIMESTAMPADD(unit,interval,datetime_expr)

Adds the integer expression interval to the date or datetime expression
datetime_expr. The unit for interval is given by the unit argument,
which should be one of the following values: MICROSECOND
(microseconds), SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, or
YEAR.

It is possible to use FRAC_SECOND in place of MICROSECOND, but
FRAC_SECOND is deprecated. FRAC_SECOND was removed in MySQL 5.5.3.

The unit value may be specified using one of keywords as shown, or with
a prefix of SQL_TSI_. For example, DAY and SQL_TSI_DAY both are legal.
Examples:
mysql> SELECT TIMESTAMPADD(MINUTE,1,'2003-01-02');
-> '2003-01-02 00:01:00'
mysql> SELECT TIMESTAMPADD(WEEK,1,'2003-01-02');
-> '2003-01-09'

2 Name: 'TIMESTAMPDIFF'
Description:
Syntax:
TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)

Returns datetime_expr2 - datetime_expr1, where datetime_expr1 and
datetime_expr2 are date or datetime expressions. One expression may be
a date and the other a datetime; a date value is treated as a datetime
having the time part '00:00:00' where necessary. The unit for the
result (an integer) is given by the unit argument. The legal values for
unit are the same as those listed in the description of the
TIMESTAMPADD() function.
Examples:
mysql> SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01');
-> 3
mysql> SELECT TIMESTAMPDIFF(YEAR,'2002-05-01','2001-01-01');
-> -1
mysql> SELECT TIMESTAMPDIFF(MINUTE,'2003-02-01','2003-05-01 12:05:55');
-> 128885

3 Name: 'TO_DAYS'
Description:
Syntax:
TO_DAYS(date)

Given a date date, returns a day number (the number of days since year
0).
amples:
mysql> SELECT TO_DAYS(950501);
-> 728779
mysql> SELECT TO_DAYS('2007-10-07');
-> 733321

4 Name: 'DATE_ADD'
Description:
Syntax:
DATE_ADD(date,INTERVAL expr unit), DATE_SUB(date,INTERVAL expr unit)

These functions perform date arithmetic. The date argument specifies
the starting date or datetime value. expr is an expression specifying
the interval value to be added or subtracted from the starting date.
expr is a string; it may start with a "-" for negative intervals. unit
is a keyword indicating the units in which the expression should be
interpreted.

mysql> select dayofmonth('1972-12-26');
+--------------------------+
| dayofmonth('1972-12-26') |
+--------------------------+
| 26 |
+--------------------------+
mysql> select month('1837-03-18');
+---------------------+
| month('1837-03-18') |
+---------------------+
| 3 |
+---------------------+
mysql> select monthname('1837-03-18');
+-------------------------+
| monthname('1837-03-18') |
+-------------------------+
| March |
+-------------------------+

mysql> SELECT last_name,first_name,birth FROM president WHERE MONTH(birth)=3;
+-----------+------------+------------+
| last_name | first_name | birth |
+-----------+------------+------------+
| Madison | James | 1751-03-16 |
| Jackson | Andrew | 1767-03-15 |
| Tyler | John | 1790-03-29 |
| Cleveland | Grover | 1837-03-18 |
+-----------+------------+------------+
mysql> SELECT last_name,first_name,birth FROM president WHERE MONTHNAME(birth)=3;
Empty set (0.00 sec)
mysql> SELECT last_name,first_name,birth FROM president WHERE MONTHNAME(birth)='March';
+-----------+------------+------------+
| last_name | first_name | birth |
+-----------+------------+------------+
| Madison | James | 1751-03-16 |
| Jackson | Andrew | 1767-03-15 |
| Tyler | John | 1790-03-29 |
| Cleveland | Grover | 1837-03-18 |
+-----------+------------+------------+
mysql> SELECT last_name,first_name,birth FROM president WHERE MONTHNAME(birth)='march';
+-----------+------------+------------+
| last_name | first_name | birth |
+-----------+------------+------------+
| Madison | James | 1751-03-16 |
| Jackson | Andrew | 1767-03-15 |
| Tyler | John | 1790-03-29 |
| Cleveland | Grover | 1837-03-18 |
+-----------+------------+------------+
mysql> SELECT last_name,first_name,birth FROM president WHERE MONTH(birth)=3 AND DAYOFMONTH(birth) = 29;
+-----------+------------+------------+
| last_name | first_name | birth |
+-----------+------------+------------+
| Tyler | John | 1790-03-29 |
+-----------+------------+------------+
mysql> SELECT last_name,first_name,birth FROM president WHERE MONTH(birth) = MONTH(CURDATE()) AND DAYOFMONTH(birth) = DAYOFMONTH(CURDATE());
+-----------+------------+------------+
| last_name | first_name | birth |
+-----------+------------+------------+
| Kennedy | John F. | 1917-05-29 |
+-----------+------------+------------+
mysql> SELECT last_name,first_name,birth,death,TIMESTAMPDIFF(YEAR,birth,death) AS age FROM president WHERE death IS NOT NULL ORDER BY age DESC LIMIT 5;
+-----------+------------+------------+------------+------+
| last_name | first_name | birth | death | age |
+-----------+------------+------------+------------+------+
| Reagan | Ronald W. | 1911-02-06 | 2004-06-05 | 93 |
| Ford | Gerald R. | 1913-07-14 | 2006-12-26 | 93 |
| Adams | John | 1735-10-30 | 1826-07-04 | 90 |
| Hoover | Herbert C. | 1874-08-10 | 1964-10-20 | 90 |
| Truman | Harry S | 1884-05-08 | 1972-12-26 | 88 |
+-----------+------------+------------+------------+------+
以下三条语句等价:成员资格更新查询方法
mysql> SELECT last_name,first_name,expiration FROM member WHERE (TO_DAYS(expiration) - TO_DAYS(CURDATE())) < 60;
mysql> SELECT last_name,first_name,expiration FROM member WHERE TIMESTAMPDIFF(DAY,CURDATE(),expiration) < 60;
mysql> SELECT last_name,first_name,expiration FROM member WHERE expiration < DATE_ADD(CURDATE(),INTERVAL 60 DAY);
如果expiration列经过了索引,那么这个查询将比前一个更有效率

mysql> SELECT DATE_ADD('1970-1-1',INTERVAL 10 YEAR);
+---------------------------------------+
| DATE_ADD('1970-1-1',INTERVAL 10 YEAR) |
+---------------------------------------+
| 1980-01-01 |
+---------------------------------------+
mysql> SELECT DATE_SUB('1970-1-1',INTERVAL 10 YEAR);
+---------------------------------------+
| DATE_SUB('1970-1-1',INTERVAL 10 YEAR) |
+---------------------------------------+
| 1960-01-01 |
+---------------------------------------+
查询那些逝世于20世纪70年代的美国总统:
mysql> SELECT last_name,first_name,death FROM president WHERE death >= '1970-1-1' AND death < DATE_ADD('1970-1-1',INTERVAL 10 YEAR);
+-----------+------------+------------+
| last_name | first_name | death |
+-----------+------------+------------+
| Truman | Harry S | 1972-12-26 |
| Johnson | Lyndon B. | 1973-01-22 |
+-----------+------------+------------+
查询在牙医诊所中,有哪些患者在到期后还未来复诊:
mysql>SELECT last_name,first_name,last_visit FORM patient WHERE last_visit < DATE_SUB(CURDATE(),INTERVAL 6 MONTH);

1.4.9.7模式匹配
模式匹配需要使用LIKE和 NOT LIKE那样的运算符,并且需要指定一个包含通配符的字符串。下划线"_"可以匹配任何的单个字符,百分号“%”则能匹配任何字符序列(其中包括空序列)
下面这个模式可以匹配到所有以字母W或w开头的姓:
mysql> SELECT last_name,first_name FROM president WHERE last_name LIKE 'W%';
+------------+------------+
| last_name | first_name |
+------------+------------+
| Washington | George |
| Wilson | Woodrow |
+------------+------------+
下面这个查询展示了常见的错误,使用了带算术比较运算符的模式。
mysql> SELECT last_name,first_name FROM president WHERE last_name ='W%';
Empty set (0.00 sec)
下面这个模式将与那些包含有‘W%'或‘w%'(并不仅限于第一个字母)的姓相匹配:
mysql> SELECT last_name,first_name FROM president WHERE last_name LIKE '%w%';
+------------+------------+
| last_name | first_name |
+------------+------------+
| Washington | George |
| Wilson | Woodrow |
| Eisenhower | Dwight D. |
+------------+------------+
下面这个模式将与恰好包含4个字母的姓相配:
mysql> SELECT last_name,first_name FROM president WHERE last_name LIKE '____';
+-----------+-------------+
| last_name | first_name |
+-----------+-------------+
| Polk | James K. |
| Taft | William H. |
| Ford | Gerald R. |
| Bush | George H.W. |
| Bush | George W. |
+-----------+-------------+
MySQL还提供另一种基于正则表达式和REGEXP运算符的模式匹配。

1.4.9.8设置和使用自定义变量
mysql> SELECT @Jackson_birth := birth FROM president WHERE last_name = 'Jackson' AND first_name = 'Andrew';
+-------------------------+
| @Jackson_birth := birth |
+-------------------------+
| 1767-03-15 |
+-------------------------+
mysql> SELECT last_name,first_name,birth FROM president WHERE birth < @jackson_birth ORDER BY birth;
+------------+------------+------------+
| last_name | first_name | birth |
+------------+------------+------------+
| Washington | George | 1732-02-22 |
| Adams | John | 1735-10-30 |
| Jefferson | Thomas | 1743-04-13 |
| Madison | James | 1751-03-16 |
| Monroe | James | 1758-04-28 |
+------------+------------+------------+
上面两条语句可以用以下一条语句来实现:
mysql> SELECT last_name,first_name,birth FROM president WHERE birth < (SELECT birth FROM president WHERE last_name = 'Jackson' AND first_name = 'Andrew');

自定义变量语法为“@变量名“。在SELECT语句里,赋值语法是形如"@变量名:=值“的表达式。
也可以使用SET语句来对变量进行赋值。此时,“=”和“:=”都可以用作赋值运算符:
mysql> SET @today = CURDATE();
mysql> SET @one_week_ago := DATE_SUB(@today,INTERVAL 7 DAY);
mysql> SELECT @today,@one_week_ago;
+------------+---------------+
| @today | @one_week_ago |
+------------+---------------+
| 2016-05-29 | 2016-05-22 |
+------------+---------------+
1.4.9.9生成统计信息
1.在一组里把各个唯一值找出来,使用DISTINCT关键字清除查询结果里重复出现的行:
mysql> SELECT DISTINCT state FROM president ORDER BY state;
2.另一种统计是计数,需要使用COUNT()函数。如果使用COUNT(*),那么计算出来的结果将是查询所选取到的行数。如果查询语句没有带WHERE子句,那么它会查询所有行,因此,COUNT(*)计算出来的就是表的行数。如果查询语句带有WHERE子句,那么COUNT(*)计算出来的结果就是该子句匹配到了多少行。
mysql> SELECT COUNT(*) FROM member;
+----------+
| COUNT(*) |
+----------+
| 102 |
+----------+
mysql> SELECT COUNT(*) FROM grade_event WHERE category = 'Q';
+----------+
| COUNT(*) |
+----------+
| 4 |
+----------+
3.COUNT(列名)只会统计所有非NULL值的数目。
mysql> SELECT COUNT(*) ,COUNT(email),COUNT(expiration) FROM member;
+----------+--------------+-------------------+
| COUNT(*) | COUNT(email) | COUNT(expiration) |
+----------+--------------+-------------------+
| 102 | 80 | 96 |
+----------+--------------+-------------------+
4.组合使用COUNT()与DISTINCT,可以统计出在查询结果里有多少个不同的非NULL值。
mysql> SELECT COUNT(DISTINCT state) FROM president;
+-----------------------+
| COUNT(DISTINCT state) |
+-----------------------+
| 21 |
+-----------------------+
5.对某个数据列进行全面统计,也可以对该列进行分类统计。
mysql> SELECT COUNT(*) FROM student;
+----------+
| COUNT(*) |
+----------+
| 31 |
+----------+
mysql> SELECT COUNT(*) FROM student WHERE sex='f';
+----------+
| COUNT(*) |
+----------+
| 15 |
+----------+
mysql> SELECT COUNT(*) FROM student WHERE sex='m';
+----------+
| COUNT(*) |
+----------+
| 16 |
+----------+
6.只用一个查询便可以统计出某一列里的不同值分别出现过多少次。使用GROUP BY子句。
mysql> SELECT sex,COUNT(*) FROM student GROUP BY sex;
+-----+----------+
| sex | COUNT(*) |
+-----+----------+
| F | 15 |
| M | 16 |
+-----+----------+
每个州出现多少个总统,查询语句如下:
mysql> SELECT state,COUNT(*) FROM president GROUP BY state;
7.默认情况下MySQL会根据GROUP BY子句里的列名来对查询结果进行排序,但你也可以用ORDER BY子句指定一个特定的排序顺序。
mysql> SELECT state,COUNT(*) AS count FROM president GROUP BY state ORDER BY count DESC;
如果用于排序的列是由某个汇总函数产生的,那么不能直接在ORDER BY子句里引用该函数。而是应该先为该列取一个别名,然后再在ORDER BY子句里引用这个别名。要使用GROUP BY子句来对某个计算列的结果进行分组,需要使用别名或列位置来引用它,具体实现方法与ORDER BY相类似。
mysql> SELECT MONTH(birth) AS Month,MONTHNAME(birth) AS Name,COUNT(*) AS count FROM president GROUP BY Name ORDER BY Month;
8.COUNT()函数可以与ORDER BY和LIMIT组合在一起使用。
mysql> SELECT state,COUNT(*) AS count FROM president GROUP BY state ORDER BY count DESC LIMIT 4;
+-------+-------+
| state | count |
+-------+-------+
| VA | 8 |
| OH | 7 |
| MA | 4 |
| NY | 4 |
+-------+-------+
9.把COUNT()的某些特定值找出来,那么需要用到HAVING子句。该子句与WHERE相类似,他们都可以用来设定输出行所必须满足的查询条件,与WHERE子句不同之处在于,它可以引用像COUNT()那样的汇总函数输出的结果。
mysql> SELECT state,COUNT(*) AS count FROM president GROUP BY state HAVING count > 1 ORDER BY count DESC;
+-------+-------+
| state | count |
+-------+-------+
| VA | 8 |
| OH | 7 |
| MA | 4 |
| NY | 4 |
| TX | 2 |
| NC | 2 |
| VT | 2 |
+-------+-------+
一般情况下,带HAVING子句的查询语句,特别适合于查找某个数据列里重复出现的值,用HAVING count > 1条件查询;也可以用与查找不重复出现的值,使用HAVING count = 1条件即可。
mysql> select student_id,count(*) as count from absence group by student_id;
+------------+-------+
| student_id | count |
+------------+-------+
| 3 | 1 |
| 5 | 1 |
| 10 | 2 |
| 17 | 1 |
| 20 | 1 |
+------------+-------+
mysql> select student_id,count(*) as count from absence group by student_id having count=1;
+------------+-------+
| student_id | count |
+------------+-------+
| 3 | 1 |
| 5 | 1 |
| 17 | 1 |
| 20 | 1 |
+------------+-------+
ysql> select student_id,count(*) as count from absence group by student_id having count>1;
+------------+-------+
| student_id | count |
+------------+-------+
| 10 | 2 |
+------------+-------+

除COUNT()以外,还有其他几个汇总函数。函数MIN(),MAX(),SUM(),AVG()。你甚至可以同时在一个查询语句里使用它们。
mysql> SELECT event_id,MIN(score) AS minium,MAX(score) AS maxium,MAX(score)-MIN(score)+1 AS span,SUM(score) AS total,AVG(score) AS average,COUNT(score) AS count FROM score GROUP BY event_id;
+----------+--------+--------+------+-------+---------+-------+
| event_id | minium | maxium | span | total | average | count |
+----------+--------+--------+------+-------+---------+-------+
| 1 | 9 | 20 | 12 | 439 | 15.1379 | 29 |
| 2 | 8 | 19 | 12 | 425 | 14.1667 | 30 |
| 3 | 60 | 97 | 38 | 2425 | 78.2258 | 31 |
| 4 | 7 | 20 | 14 | 379 | 14.0370 | 27 |
| 5 | 8 | 20 | 13 | 383 | 14.1852 | 27 |
| 6 | 62 | 100 | 39 | 2325 | 80.1724 | 29 |
+----------+--------+--------+------+-------+---------+-------+
显示事件的日期和种类
mysql> SELECT grade_event.date,grade_event.category,grade_event.event_id,MIN(score.score) AS minium,MAX(score.score) AS maxium,MAX(score.score)-MIN(score.score)+1 AS span,SUM(score.score) AS total,AVG(score.score) AS average,COUNT(score.score) AS count FROM score INNER JOIN grade_event ON score.event_id = grade_event.event_id GROUP BY grade_event.date;
+------------+----------+----------+--------+--------+------+-------+---------+-------+
| date | category | event_id | minium | maxium | span | total | average | count |
+------------+----------+----------+--------+--------+------+-------+---------+-------+
| 2012-09-03 | Q | 1 | 9 | 20 | 12 | 439 | 15.1379 | 29 |
| 2012-09-06 | Q | 2 | 8 | 19 | 12 | 425 | 14.1667 | 30 |
| 2012-09-09 | T | 3 | 60 | 97 | 38 | 2425 | 78.2258 | 31 |
| 2012-09-16 | Q | 4 | 7 | 20 | 14 | 379 | 14.0370 | 27 |
| 2012-09-23 | Q | 5 | 8 | 20 | 13 | 383 | 14.1852 | 27 |
| 2012-10-01 | T | 6 | 62 | 100 | 39 | 2325 | 80.1724 | 29 |
+------------+----------+----------+--------+--------+------+-------+---------+-------+
mysql> SELECT grade_event.date,grade_event.category,grade_event.event_id,MIN(score.score) AS minium,MAX(score.score) AS maxium,MAX(score.score)-MIN(score.score)+1 AS span,SUM(score.score) AS total,AVG(score.score) AS average,COUNT(score.score) AS count FROM score INNER JOIN grade_event ON score.event_id = grade_event.event_id GROUP BY grade_event.date WITH ROLLUP;
+------------+----------+----------+--------+--------+------+-------+---------+-------+
| date | category | event_id | minium | maxium | span | total | average | count |
+------------+----------+----------+--------+--------+------+-------+---------+-------+
| 2012-09-03 | Q | 1 | 9 | 20 | 12 | 439 | 15.1379 | 29 |
| 2012-09-06 | Q | 2 | 8 | 19 | 12 | 425 | 14.1667 | 30 |
| 2012-09-09 | T | 3 | 60 | 97 | 38 | 2425 | 78.2258 | 31 |
| 2012-09-16 | Q | 4 | 7 | 20 | 14 | 379 | 14.0370 | 27 |
| 2012-09-23 | Q | 5 | 8 | 20 | 13 | 383 | 14.1852 | 27 |
| 2012-10-01 | T | 6 | 62 | 100 | 39 | 2325 | 80.1724 | 29 |
| NULL | T | 6 | 7 | 100 | 94 | 6376 | 36.8555 | 173 |
+------------+----------+----------+--------+--------+------+-------+---------+-------+

10如果想要生成额外的输出行,显示出“统计结果的统计“,那么还需要增加一条WITH ROLLUP子句。它会让MySQL计算各分组行的“超集“(super-aggregate)值。
mysql> SELECT sex,COUNT(*) FROM student GROUP BY sex WITH ROLLUP;
+-----+----------+
| sex | COUNT(*) |
+-----+----------+
| F | 15 |
| M | 16 |
| NULL | 31 |
+-----+----------+
分组列里的NULL表明,相应的计数结果就是其前面那些分组统计的汇总值。
mysql> SELECT event_id,MIN(score) AS minium,MAX(score) AS maxium,MAX(score)-MIN(score)+1 AS span,SUM(score) AS total,AVG(score) AS average,COUNT(score) AS count FROM score GROUP BY event_id WITH ROLLUP;
+----------+--------+--------+------+-------+---------+-------+
| event_id | minium | maxium | span | total | average | count |
+----------+--------+--------+------+-------+---------+-------+
| 1 | 9 | 20 | 12 | 439 | 15.1379 | 29 |
| 2 | 8 | 19 | 12 | 425 | 14.1667 | 30 |
| 3 | 60 | 97 | 38 | 2425 | 78.2258 | 31 |
| 4 | 7 | 20 | 14 | 379 | 14.0370 | 27 |
| 5 | 8 | 20 | 13 | 383 | 14.1852 | 27 |
| 6 | 62 | 100 | 39 | 2325 | 80.1724 | 29 |
| NULL | 7 | 100 | 94 | 6376 | 36.8555 | 173 |
+----------+--------+--------+------+-------+---------+-------+
如果GROUP BY子句指定了多列,那么WITH ROLLUP还会再生成其他的超集行,其中会包含更高层的汇总值。

1.4.9.10从多个表里检索信息
1多表查询
SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c)

is equivalent to:

SELECT * FROM t1 LEFT JOIN (t2 CROSS JOIN t3 CROSS JOIN t4)
ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c)

In MySQL, CROSS JOIN is a syntactic equivalent to INNER JOIN (they can
replace each other). In standard SQL, they are not equivalent. INNER
JOIN is used with an ON clause, CROSS JOIN is used otherwise.
In general, parentheses can be ignored in join expressions containing
only inner join operations.=> 圆括号可以省略
2 连接种类:
1.SELECT column1,column2,... FROM table1,table1,...; //交叉连接,也叫笛卡尔乘积
2.SELECT column1,column2,... FROM table1,table1,... WHERE 条件表达式; //自然连接,仅保留一定条件的行
3.外连接
table1 LEFT JOIN table2 ON 条件表达式 左外连接
table1 RIGHT JOIN table2 ON 条件表达式 右外连接
4.INNER JOIN 内连接
CROSSJOIN等价INNER JOIN等价JOIN
多个表可以用“,”,“JOIN","INNER JOIN","CROSS JOIN"连接。
以下四条查询语句结果等价:
mysql> SELECT student_id,date,score,category FROM grade_event,score WHERE score.event_id = grade_event.event_id AND
-> date = '2012-09-23';
mysql> SELECT student_id,date,score,category FROM grade_event JOIN score ON grade_event.event_id = score.event_id WHERE date = '2012-09-23';
mysql> SELECT student_id,date,score,category FROM grade_event INNER JOIN score ON grade_event.event_id = score.event_id
-> WHERE date = '2012-09-23';
mysql> SELECT student_id,date,score,category FROM grade_event CROSS JOIN score ON grade_event.event_id = score.event_id WHERE date = '2012-09-23';
需要注意:FROM子句指定了多个表明,因为要从多个表里检索信息。多个表可以用“,”,“JOIN","INNER JOIN","CROSS JOIN"连接。ON子句指定了表之间连接的条件,即以哪种方式连接。

3 每个列明前面都加上表名,从而可以让每列属于哪个表变得更加清楚:
mysql> SELECT student_id,date,score,category FROM grade_event INNER JOIN score ON grade_event.event_id = score.event_id
-> WHERE date = '2012-09-23';
mysql> SELECT score.student_id,grade_event.date,score.score,grade_event.category FROM grade_event INNER JOIN score ON grade_event.event_id = score.event_id WHERE grade_event.date = '2012-09-23';
4 要显示出学生名字,就要用到三个表的连接:
mysql> SELECT student.name,student.student_id,grade_event.date,score.score,grade_event.category FROM grade_event INNER JOIN score INNER JOIN student ON grade_event.event_id = score.event_id AND score.student_id = student.student_id WHERE grade_event.date = '2012-09-23';
5 GROUP BY引用多个输出列,即使有源自多个表的多个列,你也可以使用像COUNT()和AVG()这样的函数,为它们生成汇总信息:
mysql> SELECT grade_event.date,student.sex,COUNT(score.score) AS count,AVG(score.score) AS average FROM grade_event INNER
-> JOIN score INNER JOIN student ON grade_event.event_id = score.event_id AND score.student_id = student.student_id
-> GROUP BY grade_event.date,student.sex;
+------------+-----+-------+---------+
| date | sex | count | average |
+------------+-----+-------+---------+
| 2012-09-03 | F | 14 | 14.6429 |
| 2012-09-03 | M | 15 | 15.6000 |
| 2012-09-06 | F | 14 | 14.7143 |
| 2012-09-06 | M | 16 | 13.6875 |
| 2012-09-09 | F | 15 | 77.4000 |
| 2012-09-09 | M | 16 | 79.0000 |
| 2012-09-16 | F | 13 | 15.3077 |
| 2012-09-16 | M | 14 | 12.8571 |
| 2012-09-23 | F | 12 | 14.0833 |
| 2012-09-23 | M | 15 | 14.2667 |
| 2012-10-01 | F | 14 | 77.7857 |
| 2012-10-01 | M | 15 | 82.4000 |
+------------+-----+-------+---------+
6.计算出每个学生的总成绩,并以总分进行升序排列(默认):
mysql> SELECT student.student_id,student.name,SUM(score.score) AS total,COUNT(score.score) AS n FROM grade_event INNER JOIN
-> score INNER JOIN student ON grade_event.event_id = score.event_id AND score.student_id = student.student_id GROUP BY
-> score.student_id ORDER BY total;
7.查询出有那些学生缺勤:
mysql> SELECT student.student_id,student.name,COUNT(absence.date) AS absences FROM student INNER JOIN absence ON
-> student.student_id = absence.student_id GROUP BY student.student_id;
+------------+-------+----------+
| student_id | name | absences |
+------------+-------+----------+
| 3 | Kyle | 1 |
| 5 | Abby | 1 |
| 10 | Peter | 2 |
| 17 | Will | 1 |
| 20 | Avery | 1 |
+------------+-------+----------+
8.左连接。查询每位学生的出勤情况,要用到LEFT JOIN ON子句,可以在FROM子句里的两个表之间使用LEFT JOIN(而不是用逗号把这两个表分开),然后使用ON子句说明如何匹配这两个表中的行:
mysql> SELECT student.student_id,student.name,COUNT(absence.date) AS absences FROM student LEFT JOIN absence ON student.student_id = absence.student_id GROUP BY student.student_id;
9.自连接,把某个表与其自身连接。确定是否有某个总统与另一位总统出生在同一个城市。ORDER BY后面有多个列。
mysql> SELECT p1.last_name,p1.first_name,p1.city,p1.state FROM president AS p1 INNER JOIN president AS p2 ON p1.city = p2.city AND p1.state = p2.state WHERE (p1.last_name <> p2.last_name OR p1.first_name != p2.first_name) ORDER BY state,city,last_name;
+-----------+-------------+-----------+-------+
| last_name | first_name | city | state |
+-----------+-------------+-----------+-------+
| Adams | John Quincy | Braintree | MA |
| Adams | John | Braintree | MA |
+-----------+-------------+-----------+-------+
注意:它需要引用同一个表的两个实例,因此我们必须为它创建两个别名(p1和p2),并用他们将表中的同名列区别开来。WHERE子句防止出现“行与其本身相匹配“的情况。

查询同月同日出生的总统,要用到MONTH(),DAYOFMONTH(),DAYOFYEAR()函数。
mysql> SELECT p1.last_name,p1.first_name,p1.birth FROM president AS p1 INNER JOIN president AS p2 WHERE MONTH(p1.birth) = MONTH(p2.birth) AND DAYOFMONTH(p1.birth) = DAYOFMONTH(p2.birth) AND (p1.last_name <> p2.last_name OR p1.first_name != p2.first_name) ORDER BY p1.last_name;
+-----------+------------+------------+
| last_name | first_name | birth |
+-----------+------------+------------+
| Harding | Warren G. | 1865-11-02 |
| Polk | James K. | 1795-11-02 |
+-----------+------------+------------+
可以使用DAYOFYEAR()来代替MONTH()与DAYOFMONTH()的组合,可以得到稍微简单一点的查询语句。但其查询结果却可能不正确,因为它没有考虑到出现闰年的情况。

DAYOFYEAR()函数:
mysql> select dayofyear('1865-11-02');
+-------------------------+
| dayofyear('1865-11-02') |
+-------------------------+
| 306 |
+-------------------------+
mysql> select dayofyear('1795-11-02');
+-------------------------+
| dayofyear('1795-11-02') |
+-------------------------+
| 306 |
+-------------------------+
mysql> select dayofyear('1796-11-02');
+-------------------------+
| dayofyear('1796-11-02') |
+-------------------------+
| 307 |
+-------------------------+
DAYOFMONTH()函数:
mysql> select dayofmonth('1865-11-02');
+--------------------------+
| dayofmonth('1865-11-02') |
+--------------------------+
| 2 |
+--------------------------+
MONTH()函数:
mysql> select month('1865-11-02');
+---------------------+
| month('1865-11-02') |
+---------------------+
| 11 |
+---------------------+
10.另一种类型的多表检索操作是使用"子查询“,即把一条SELECT语句嵌套在另一条SELECT语句里。
把全勤的学生都找出来:
mysql> SELECT * FROM student WHERE student_id NOT IN (SELECT student_id FROM absence);
把出生在Andrew Jackson总统之前的总统找出来:
mysql> SELECT last_name,first_name,birth FROM president WHERE birth < (SELECT birth FROM president WHERE last_name = 'Jackson' AND first_name = 'Andrew');
+------------+------------+------------+
| last_name | first_name | birth |
+------------+------------+------------+
| Washington | George | 1732-02-22 |
| Adams | John | 1735-10-30 |
| Jefferson | Thomas | 1743-04-13 |
| Madison | James | 1751-03-16 |
| Monroe | James | 1758-04-28 |
+------------+------------+------------+

1.4.10删除或更新已有行
格式: DELETE FROM table_name WHERE which rows to delete;
WHERE子句是可选的,它用于指定需要删除的哪些行。如果没有WHERE子句,那么将删除表里的所有行。
DELETE FROM tbl_name; //它会删除表里的所有内容
mysql> DELECT FROM president WHERE state='OH';
mysql> SELECT last_name,first_name FROM president WHERE last_name='Roosevelt';
+-----------+-------------+
| last_name | first_name |
+-----------+-------------+
| Roosevelt | Theodore |
| Roosevelt | Franklin D. |
+-----------+-------------+
mysql> SELECT last_name,first_name FROM president WHERE last_name='Roosevelt'AND first_name='Theodore';
+-----------+------------+
| last_name | first_name |
+-----------+------------+
| Roosevelt | Theodore |
+-----------+------------+
格式: UPDATE table_name SET which columns to change WHERE which rows to update;
WHERE子句是可选的,它用于指定需要更新哪些行,因此在没有指定它时,会更新表里的每一行。
mysql> UPDATE studdent SET name='George';

mysql>INSERT INTO member ( last_name,first_name) VALUES ('York','Jerome');
更新表中的一列,如下语句:
mysql> UPDATE member SET expiration='2013-7-20' WHERE last_name='York' AND first_name='Jerome';
更新表中的多个列,如下语句:
mysql> UPDATE member SET email='jeromey@aol.com',street='123 Elm St',city='Anytown',state='NY',zip='01003' WHERE last_name='York' AND first_name='Jerome';
将某列的值设置为NULL值(如果该列允许使用NULL值的话),如下语句:
mysql> UPDATE member SET expiration=NULL WHERE last_name='York' AND first_name='Jerome';

1.5 mysql交互技巧
1.5.1简化连接过程
1.5.1.1使用选项文件
mysql,mysqlshow,mysqlimport客户端程序也能使用选项文件中的参数。选项文件为~/.my.cnf文件。
#vim ~/.my.cnf
[client]
host=server_host
user=your_name
password=your_pass
database=database_name
#chmod 600 ~/.my.cnf
or
#chmod u=rw,go-rwx ~/.my.cnf
1.5.1.2利用shell的历史命令功能
#!my
感叹号字符(!)的作用是告知shell程序,让它在命令历史清单里(~/.bash_history),把你最近执行过的以my开头的命令找出来,再执行一次,就好像你在命令行上再次自己输入了它一样。
1.5.1.3利用shell别名和脚本
shell别名
csh或tcsh里: alias sampdb 'mysql -h cobra.example.com -p -u sampadm sampdb'
bash里: alias sampdb='mysql -h cobra.example.com -p -u sampadm sampdb'
以下两条语句完全等价:
#sampdb
#mysql -h cobra.example.com -p -u sampadm sampdb
要别名使每次登录系统时都生效:将alias命令放到shell程序的启动文件里(例如,tcsh的启动文件是.tcshrc,bash启动文件是.bashrc或.bash_profile)。
shell脚本

#vim /root/sampdb
#!/bin/bash
exec mysql -h cobra.example.com -p -u sampadm sampdb

#chmod +x /root/sampdb
1.5.2在调用命令时减少打字输入

1.5.2.1利用mysql的输入行编辑器
mysql程序的输入编辑命令
按键组合 含义
向上键或Ctrl+P 调出前一个输入行
向下键或Ctrl+N 调出后一个输入行
向左键或Ctrl+B 向左移动光标
向右键或Ctrl+B 向右移动光标
Esc b 把光标向后移动一个单词
Esc f 把光标向前移动一个单词
Ctrl+A 把光标移动到输入行的开头
Ctrl+E 把光标移动到输入行的末尾
Ctrl+D 删除光标位置上的那个字符,若为mysql>等待输入,则为退出mysql客户端
Delete 删除光标前面(左侧)的那个字符
Esc D 删除单词
Esc Backspace 删除光标前面(左侧)的那个单词
Ctrl+K 删除光标位置到输入行末尾的所有内容
Ctrl+U 删除光标位置到输入行行首的所有内容
1.5.2.2.利用复制和粘贴来执行语句
1.5.2.3利用mysql来执行脚本文件
mysql程序并非只能在交互模式下运行,它也可以在非交互模式(批处理)下从某个文件里读取输入。
编写mysql脚本

#vim /root/interests.sql
SELECT last_name,first_name,email,interests FROM member WHERE interests LIKE '%depression%' ORDER BY last_name,first_name;

默认情况下,当以批处理模式运行时,mysql程序产生的输出内容是以制表符分隔的。
# mysql sampdb < /root/interests.sql
加上-t选项得到交互方式运行mysql时输出的格式效果
#mysql -t sampdb < /root/interests.sql
可以将输出结果保存起来,将它重定向至一个文件
#mysql -t sampdb < /root/interests.sql > /root/interests.out
若果已经运行了mysql可以通过source命令来执行指定文件里的内容
mysql>source /root/interests.sql

编写shell脚本

#vim interests.sh
#!/bin/sh
# interests.sh - find USHL members with particular interests
if [ $# -ne 1 ]; then echo 'Please specify one keyword'; exit; fi
mysql -t sampdb <<QUERY_INPUT
SELECT last_name, first_name, email, interests FROM member
WHERE interests LIKE '%$1%'
ORDER BY last_name, first_name;
QUERY_INPUT

#chmod +x interests.sh
#./interests.sh depression
#./interests.sh jefferson

注意:不要把这类脚本安装在公共区域里,因为它们在执行时不会对参数进行安全检测,因而容易遭遇SQL注入攻击。例如:#./interests.sh "'Jefferson';DROP DATABASE sampdb;"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql 基础 入门学习