mysql笔记(一)

  1. 查看帮助:shell> mysql --help
  2. 登录mysql:mysql -h host -u user -p password(例如:mysql -hlocalhost -uroot -proot。-hlocalhost表示是本机,-uroot表示用户名是root,-proot表示密码是root)
  3. mysql是大小写不敏感的
  4. select version(), current_date, current_time, now(), user(), curdate();
  5. 如果你决定不想执行正在输入过程中的一个命令,输入\c取消它:
    mysql> SELECT
        -> USER()
        -> \c
  6. 提示符和含义

    提示符

    含义

    mysql>

    准备好接受新命令。

    ->

    等待多行命令的下一行。

    '>

    等待下一行,等待以单引号(')开始的字符串的结束。

    ">

    等待下一行,等待以双引号(")开始的字符串的结束。

    `>

    等待下一行,等待以反斜点(`)开始的识别符的结束。

    /*>

    等待下一行,等待以/*开始的注释的结束。

  7. 一种撤销的情况:
    mysql> SELECT * FROM my_table WHERE name = 'Smith AND age < 30;
        '> '\c
  8. 显示数据库:show databases;
  9. 在使用数据库表前必须先使用数据库:use dbName;
  10. 创建数据库:create database dbName;
  11. 打开数据库并直接使用某个数据库:mysql -hlocalhost -uroot -proot dbName
  12. 显示数据库中的表:show tables;
  13. 创建数据库表:mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20), species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);
  14.  显示数据库表:mysql> SHOW TABLES;
  15.  查看表的结构:mysql> DESCRIBE pet;
  16.  将数据装入表中:load data local infile 'C:\\Users\\kqygww\\Desktop\\pet.txt' into table pet;
    或者:LOAD DATA LOCAL INFILE 'C:/Users/kqygww/Desktop/pet.txt' INTO TABLE pet;
    对于装载的数据的要求:每行包含一个记录,用定位符(tab)把值分开,并且以CREATE TABLE语句中列出的列次序给出。对于丢失的值(例如未知的性别,或仍然活着的动物的死亡日期),你可以使用NULL值。为了在你的文本文件中表示这些内容,使用\N(反斜线,字母N)。
    例如pet.txt:
    Fluffy Harold cat f 1993-02-04 \N
    请注意如果用Windows中的编辑器(使用\r\n做为行的结束符)创建文件,应使用:
    mysql> LOAD DATA LOCAL INFILE '/path/pet.txt' INTO TABLE pet LINES TERMINATED BY '\r\n';
  17. 插入数据:mysql> INSERT INTO pet VALUES'Puffball','Diane','hamster','f','1999-03-30',NULL);
  18. select语句的格式:
    SELECT语句用来从数据表中检索信息。语句的一般格式是:
    SELECT what_to_select
    FROM which_table
    WHERE conditions_to_satisfy;
  19. 选择表中的所有记录:mysql> SELECT * FROM pet;
  20. 选择特殊的行记录:
    mysql> SELECT * FROM pet WHERE name = 'Bowser';
    mysql> SELECT * FROM pet WHERE birth > '1998-1-1';
    mysql> SELECT * FROM pet WHERE species = 'dog' AND sex = 'f';
    mysql> SELECT * FROM pet WHERE species = 'snake' OR species = 'bird';
    mysql> SELECT * FROM pet WHERE (species = 'cat' AND sex = 'm') OR (species = 'dog' AND sex = 'f');
  21. 选择特殊的列:
    mysql> SELECT name, birth FROM pet;
    mysql> SELECT DISTINCT owner FROM pet;
    mysql> SELECT name, species, birth FROM pet WHERE species = 'dog' OR species = 'cat';
  22. 排序查询,默认是升序asc,降序是desc:
    mysql> SELECT name, birth FROM pet ORDER BY birth;
    mysql> SELECT name, birth FROM pet ORDER BY birth DESC;
    mysql> SELECT name, species, birth FROM pet ORDER BY species, birth DESC;
  23. 日期计算:
    mysql> SELECT name, birth, CURDATE(),
        -> (YEAR(CURDATE())-YEAR(birth)) - (RIGHT(CURDATE(),5)<RIGHT(birth,5)) AS age
        -> FROM pet;
    mysql> SELECT name, birth, death,
        -> (YEAR(death)-YEAR(birth)) - (RIGHT(death,5)<RIGHT(birth,5)) AS age
        -> FROM pet WHERE death IS NOT NULL ORDER BY age;
    此处,YEAR()提取日期的年部分,RIGHT()提取日期的MM-DD (日历年)部分的最右面5个字符。比较MM-DD值的表达式部分的值一般为1或0,如果CURDATE()的年比birth的年早,则年份应减去1。
  24. 提取日期的年月日:select year(now()), month(now()), day(now());
  25. 查询下个月出生的动物,DATE_ADD( )允许在一个给定的日期上加上时间间隔。如果在NOW( )值上加上一个月,然后用MONTH()提取月份,结果产生生日所在月份:
    mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = MONTH(DATE_ADD(CURDATE(),INTERVAL 1 MONTH));
    或者使用MOD函数,MOD是取余函数:
    mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = MOD(MONTH(CURDATE()), 12) + 1;
  26. NULL:使用IS NULL和IS NOT NULL操作符判断某值是否为NULL。
    SELECT 1 IS NULL, 1 IS NOT NULL;
    结果:
    +-----------+---------------+
    | 1 IS NULL | 1 IS NOT NULL |
    +-----------+---------------+
    |         0 |             1 |
    +-----------+---------------+
    在GROUP BY中,两个NULL值视为相同。
    执行ORDER BY时,如果运行 ORDER BY ... ASC,则NULL值出现在最前面,若运行ORDER BY ... DESC,则NULL值出现在最后面。
  27. 模式匹配
    MySQL提供标准的SQL模式匹配,以及一种基于象Unix实用程序如vi、grep和sed的扩展正则表达式模式匹配的格式。
    SQL模式匹配允许你使用“_”匹配任何单个字符,而“%”匹配任意数目字符(包括零字符)。在MySQL中,SQL的模式默认是忽略大小写的。下面给出一些例子。注意使用SQL模式时,不能使用=或!=;而应使用LIKE或NOT LIKE比较操作符。
    要想找出以“b”开头的名字:
    mysql> SELECT * FROM pet WHERE name LIKE 'b%';
    要想找出以“fy”结尾的名字:
    mysql> SELECT * FROM pet WHERE name LIKE '%fy';
    要想找出包含“w”的名字:
    mysql> SELECT * FROM pet WHERE name LIKE '%w%';
    要想找出正好包含5个字符的名字,使用“_”模式字符:
    mysql> SELECT * FROM pet WHERE name LIKE '_____';
  28. 扩展正则表达式的一些字符是:
    ‘.’匹配任何单个的字符。
    字符类“[...]”匹配在方括号内的任何字符。例如“[abc]”匹配“a”、“b”或“c”。为了命名字符的范围,使用一个“-”。“[a-z]”匹配任何字母,而“[0-9]”匹配任何数字。“ * ”匹配零个或多个在它前面的字符。例如,“x*”匹配任何数量的“x”字符,“[0-9]*”匹配任何数量的数字,而“.*”匹配任何数量的任何字符。
    如果REGEXP模式与被测试值的任何地方匹配,模式就匹配(这不同于LIKE模式匹配,只有与整个值匹配,模式才匹配)。
    为了定位一个模式以便它必须匹配被测试值的开始或结尾,在模式开始处使用“^”或在模式的结尾用“$”。
    为了说明扩展正则表达式如何工作,下面使用REGEXP重写上面所示的LIKE查询:
    为了找出以“b”开头的名字,使用“^”匹配名字的开始:
    mysql> SELECT * FROM pet WHERE name REGEXP '^b';
    如果你想强制使REGEXP比较区分大小写,使用BINARY关键字使其中一个字符串变为二进制字符串。该查询只匹配名称首字母的小写‘b’。
    mysql> SELECT * FROM pet WHERE name REGEXP BINARY '^b';
    为了找出包含一个“w”的名字,使用以下查询:
    mysql> SELECT * FROM pet WHERE name REGEXP 'w';
    为了找出包含正好5个字符的名字,使用“^”和“$”匹配名字的开始和结尾,和5个“.”实例在两者之间:
    mysql> SELECT * FROM pet WHERE name REGEXP '^.....$';
    你也可以使用“{n}”“重复n次”操作符重写前面的查询:
    mysql> SELECT * FROM pet WHERE name REGEXP '^.{5}$';
  29. 计数行:
    mysql> SELECT COUNT(*) FROM pet;
    mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner;
    +--------+----------+
    | owner  | COUNT(*) |
    +--------+----------+
    | Benny  |        2 |
    | Diane  |        2 |
    | Gwen   |        3 |
    | Harold |        2 |
    +--------+----------+
    注意,使用GROUP BY对每个owner的所有记录分组,没有它,你会得到错误消息:
    mysql> SELECT owner, COUNT(*) FROM pet;
    ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) 
    with no GROUP columns is illegal if there is no GROUP BY clause
    mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex;
  30. mysql> SELECT species, sex, COUNT(*) FROM pet
        -> WHERE species = 'dog' OR species = 'cat'
        -> GROUP BY species, sex;
    +---------+------+----------+
    | species | sex  | COUNT(*) |
    +---------+------+----------+
    | cat     | f    |        1 |
    | cat     | m    |        1 |
    | dog     | f    |        1 |
    | dog     | m    |        2 |
    +---------+------+----------+
  31. mysql> SELECT pet.name,
        -> (YEAR(date)-YEAR(birth)) - (RIGHT(date,5)<RIGHT(birth,5)) AS age,
        -> remark
        -> FROM pet, event
        -> WHERE pet.name = event.name AND event.type = 'litter';
    +--------+------+-----------------------------+
    | name   | age  | remark                      |
    +--------+------+-----------------------------+
    | Fluffy |    2 | 4 kittens, 3 female, 1 male |
    | Buffy  |    4 | 5 puppies, 2 female, 3 male |
    | Buffy  |    5 | 3 puppies, 3 female         |
    +--------+------+-----------------------------+
  32. 选择当前使用的数据库:
    mysql> SELECT DATABASE();
  33. 批处理模式下使用sql。建一个文件sql.txt,内容:
    select version();
    select now();
    Windows下运行mysql(有连接参数时):
    C:\ mysql -h host -u user -p password -e "source batch-file"
    例如:
    C:\ mysql -hlocalhost -uroot -proot -e "source c:\sql.txt"
  34. 如果你有一个产生多个输出的查询,你可以通过一个分页器而不是盯着它翻屏到屏幕的顶端来运行输出: 
    C:\ mysql < batch-file | more
    例如:
    C:\ mysql -hlocalhost -uroot -proot -e "source c:\sql.txt" | more
  35. 捕捉文件中的输出以便进行进一步的处理: 
    C:\ mysql < batch-file > mysql.out
    例如:
    C:\ mysql -hlocalhost -uroot -proot -e "source c:\sql.txt" > "c:\out.txt"
  36. 列的最大值。“最大的物品号是什么?”
    SELECT MAX(article) AS article FROM shop;
  37. 拥有某个列的最大值的行
    任务:找出最贵物品的编号、销售商和价格。
    这很容易用一个子查询做到:
    SELECT article, dealer, price
    FROM   shop
    WHERE  price=(SELECT MAX(price) FROM shop);
    另一个解决方案是按价格降序排序所有行并用MySQL特定LIMIT子句只得到第一行:
    SELECT article, dealer, price
    FROM shop
    ORDER BY price DESC
    LIMIT 1;
    注:如果有多项最贵的物品( 例如每个的价格为19.95),LIMIT解决方案仅仅显示其中一个
  38. 列的最大值:按组
    任务:每项物品的的最高价格是多少?
    SELECT article, MAX(price) AS price
    FROM   shop
    GROUP BY article
  39. 拥有某个字段的组间最大值的行
    任务:对每项物品,找出最贵价格的物品的经销商。
    可以用这样一个子查询解决该问题:
    SELECT article, dealer, price
    FROM   shop s1
    WHERE  price=(SELECT MAX(s2.price)
                  FROM shop s2
                  WHERE s1.article = s2.article);
  40. 显示表的创建语句:
    SHOW CREATE TABLE dbname\G
  41. 根据两个键搜索
    SELECT field1_index, field2_index FROM test_table
    WHERE field1_index = '1' OR  field2_index = '1'
    每个SELECT只搜索一个关键字,可以进行优化:
    SELECT field1_index, field2_index
        FROM test_table WHERE field1_index = '1'
    UNION
    SELECT field1_index, field2_index
        FROM test_table WHERE field2_index = '1';
  42. 根据天计算访问量
    下面的例子显示了如何使用位组函数来计算每个月中用户访问网页的天数。
    CREATE TABLE t1 (year YEAR(4), month INT(2) UNSIGNED ZEROFILL,
                 day INT(2) UNSIGNED ZEROFILL);
    INSERT INTO t1 VALUES(2000,1,1),(2000,1,20),(2000,1,30),(2000,2,2),
                (2000,2,23),(2000,2,23);
    示例表中含有代表用户访问网页的年-月-日值。可以使用以下查询来确定每个月的访问天数:
    SELECT year,month,BIT_COUNT(BIT_OR(1<<day)) AS days FROM t1
           GROUP BY year,month;
    将返回:
    +------+-------+------+
    | year | month | days |
    +------+-------+------+
    | 2000 |    01 |    3 |
    | 2000 |    02 |    2 |
    +------+-------+------+
    该查询计算了在表中按年/月组合的不同天数,可以自动去除重复的询问。
    SELECT year,month,COUNT(*) AS days FROM t1
           GROUP BY year,month;
    将返回:
    +------+-------+------+
    | year | month | days |
    +------+-------+------+
    | 2000 |    01 |    3 |
    | 2000 |    02 |    3 |
    +------+-------+------+
    不去除重复
  43. 使用AUTO_INCREMENT
    可以通过AUTO_INCREMENT属性为新的行产生唯一的标识:
    CREATE TABLE animals (
         id MEDIUMINT NOT NULL AUTO_INCREMENT,
         name CHAR(30) NOT NULL,
         PRIMARY KEY (id)
     );
    你可以使用LAST_INSERT_ID()SQL函数或mysql_insert_id() C API函数来查询最新的AUTO_INCREMENT值。
  44. 要想以AUTO_INCREMENT值开始而不是1,你可以通过CREATE TABLE或ALTER TABLE来设置该值,如下所示:
    mysql> ALTER TABLE tbl AUTO_INCREMENT = 100;

 

你可能感兴趣的:(mysql笔记(一))